{"openapi":"3.0.3","info":{"title":"LaminarForge API","description":"Format conversion and text processing utilities powered by Cloudflare Workers. Provides JSON/CSV/XML/YAML converters, case/slug/base64 utilities, date/color/roman converters, text analysis, UUID generation, password/name/lorem generators, and more.\n\nFour worker deployments serve these endpoints:\n- **lf-format-utils** — Format conversion & formatting endpoints\n- **lf-text-utils** — Text analysis & generation endpoints\n\nShared platform endpoints (health, keys, usage, billing) are available on all workers.\n\n- **lf-web-intel** — Web intelligence & OSINT (WHOIS, DNS, SSL, geoip, HTTP headers, redirects)\n- **lf-business-utils** — Business data (country info, timezone, calendar, sales tax, VAT, loan, holiday, currency)\n\nPAY PER CALL (x402): no account needed. Call any endpoint without credentials and it returns HTTP 402 with a JSON body listing the price, network, USDC asset and payTo address. Pay, retry with the X-PAYMENT header, and the call goes through. GET /v1/prices on any service lists every endpoint's price. Standard calls are $0.002; heavy ones (PDF, images, screenshots, scraping) are $0.01. Two schemes are offered: 'exact' (one transfer per call, zero setup) and 'batch-settlement' (open a channel once, then many calls settle in far fewer transfers — cheaper for volume).","version":"1.1.0","contact":{"url":"https://laminarforge.dev/contact"}},"tags":[{"name":"Format Utils","description":"lf-format-utils — JSON/CSV/XML/YAML converters, case, slug, base64, date, color, roman, cron"},{"name":"Text Utils","description":"lf-text-utils — word count, language detect, UUID, password, names, lorem ipsum"},{"name":"Platform","description":"Shared platform endpoints — health, keys, usage, billing (available on both workers)"},{"name":"Validation Utils","description":"lf-validation-utils — email, phone, URL, UUID, BIN, IBAN, VAT validation"},{"name":"Security Utils","description":"lf-security-utils — hash, HMAC, JWT, token gen, OTP, password, AES, RSA"},{"name":"Web Intel","description":"lf-web-intel — WHOIS, DNS, SSL, geoip, HTTP headers, redirects, user-agent, URL tools"},{"name":"Business Utils","description":"lf-business-utils — Country info, timezone, calendar, sales tax, VAT, loan, holiday, currency, salary"},{"name":"Image Utils","description":"lf-image-utils — QR/barcode generation, EXIF, color analysis, image info, format detection, ASCII art, grayscale, compression"},{"name":"Agent Tools","description":"lf-agent-tools — Web content extraction, link verification, schema generation, tool validation, structured parsing, geo utilities, safety checks"},{"name":"VPS Browser","description":"lf-vps-browser — Browser-based: screenshots, PDF from HTML, content extraction, LLM safety, cache keys, tool orchestration, knowledge base Q&A"},{"name":"Pricing","description":"Per-call pricing for the x402 pay-per-call rail."}],"paths":{"/":{"get":{"tags":["Format Utils","Text Utils"],"summary":"Service info","description":"Returns the service name and list of available endpoints. Available on both workers.","operationId":"serviceInfo","responses":{"200":{"description":"Service information","content":{"application/json":{"schema":{"type":"object","properties":{"service":{"type":"string"},"endpoints":{"type":"array","items":{"type":"string"}},"docs":{"type":"string"}}}}}}}}},"/v1/health":{"get":{"tags":["Platform","Format Utils","Text Utils"],"summary":"Health check","description":"Returns service health status, version, and KV store availability for the worker. No authentication required.","operationId":"healthCheck","responses":{"200":{"description":"Health status","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"service":{"type":"string"},"version":{"type":"string","example":"1.0.0"},"endpoints":{"type":"integer"},"kv":{"type":"object","properties":{"api_keys":{"type":"boolean"},"usage":{"type":"boolean"},"rate_limits":{"type":"boolean"},"customers":{"type":"boolean"}}}}}}}}}}},"/v1/keys":{"post":{"tags":["Platform","Format Utils","Text Utils"],"summary":"Create API key","description":"Generate a free-tier API key. Returns the raw key once — save it immediately; it is stored as a SHA-256 hash and the raw value is never retrievable again. Supports optional key expiry: pass a `ttl` in seconds from now, an explicit `expires_at` ISO 8601 timestamp, an optional `owner_email` to group sibling keys, and a free-form `note`. An expired key is rejected with HTTP 401 on subsequent use.","operationId":"createApiKey","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"tier":{"type":"string","enum":["free"],"default":"free","description":"Key tier. Only 'free' can be created via this endpoint."},"ttl":{"type":"integer","minimum":1,"description":"Optional expiry: number of seconds from now. Mutually exclusive with expires_at."},"expires_at":{"type":"string","format":"date-time","description":"Optional expiry: explicit ISO 8601 timestamp. Mutually exclusive with ttl."},"owner_email":{"type":"string","description":"Optional owner email used to group sibling keys (list/revoke together)."},"note":{"type":"string","description":"Optional free-form note stored with the key metadata."}}}}}},"responses":{"200":{"description":"API key created","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"api_key":{"type":"string","description":"The raw API key (lf_...). Save this immediately — it won't be shown again."},"tier":{"type":"string","example":"free"},"created":{"type":"string","format":"date-time","description":"Creation timestamp (ISO 8601)."},"expires_at":{"type":"string","format":"date-time","nullable":true,"description":"Expiry timestamp if a ttl/expires_at was set, else null."},"note":{"type":"string"},"docs":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"get":{"tags":["Platform"],"summary":"List API keys (metadata only)","description":"Returns metadata for the authenticated caller's API key(s): the key used for the request plus any sibling keys that share its owner_email. Keys are stored as SHA-256 hashes and are NEVER returned in full — only metadata (prefix, tier, active, created, expires_at, last_used, total_calls, owner_email). Requires authentication (admin sees all keys sharing the owner_email).","operationId":"listApiKeys","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Key metadata list","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"count":{"type":"integer","description":"Number of keys returned."},"keys":{"type":"array","description":"Metadata for each key. Raw key values are never exposed.","items":{"type":"object","properties":{"key_hash":{"type":"string","description":"SHA-256 hash of the key."},"prefix":{"type":"string","description":"Truncated key prefix for identification (e.g. lf_abc123...)."},"tier":{"type":"string"},"active":{"type":"boolean","description":"Whether the key is active (not revoked/expired)."},"created":{"type":"string","format":"date-time","nullable":true},"expires_at":{"type":"string","format":"date-time","nullable":true,"description":"Key expiry, if one was set."},"last_used":{"type":"string","format":"date-time","nullable":true},"total_calls":{"type":"integer"},"owner_email":{"type":"string","nullable":true}}}},"note":{"type":"string"}}}}}},"401":{"description":"Unauthorized — missing or invalid API key"}}}},"/v1/usage":{"get":{"tags":["Platform","Format Utils","Text Utils"],"summary":"Usage stats","description":"Returns current daily usage statistics for the authenticated API key, including tier info, daily limit, and remaining calls. Requires authentication.","operationId":"getUsage","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Usage statistics","content":{"application/json":{"schema":{"type":"object","properties":{"key_prefix":{"type":"string","description":"Truncated key prefix for identification"},"tier":{"type":"string"},"tier_label":{"type":"string"},"daily_limit":{"type":"integer"},"calls_today":{"type":"integer"},"remaining":{"type":"integer"}}}}}}}}},"/v1/checkout":{"post":{"tags":["Platform","Format Utils","Text Utils"],"summary":"Create Stripe checkout session","description":"Creates a Stripe Checkout Session for upgrading an API key to a paid tier (Starter, Pro, or Business). Returns the checkout URL for redirect.","operationId":"createCheckout","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tier":{"type":"string","enum":["starter","pro","biz"],"description":"Target tier for upgrade"},"key_hash":{"type":"string","description":"SHA-256 hash of the API key being upgraded"},"success_url":{"type":"string","format":"uri","description":"Redirect URL on successful payment"},"cancel_url":{"type":"string","format":"uri","description":"Redirect URL on cancelled payment"}},"required":["tier"]}}}},"responses":{"200":{"description":"Checkout session created","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Stripe Checkout Session URL"},"session_id":{"type":"string"}}}}}}}}},"/v1/webhook":{"post":{"tags":["Platform","Format Utils","Text Utils"],"summary":"Stripe webhook","description":"Receives Stripe webhook events (checkout.session.completed, customer.subscription.updated/deleted). Verifies the webhook signature using Stripe-Signature header, then updates the corresponding API key tier in KV storage.","operationId":"handleWebhook","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"type":"string","description":"Stripe event type"},"data":{"type":"object","description":"Stripe event data object"}}}}}},"responses":{"200":{"description":"Webhook received","content":{"application/json":{"schema":{"type":"object","properties":{"received":{"type":"boolean","example":true}}}}}}}}},"/v1/balance":{"get":{"tags":["Platform","Format Utils","Text Utils"],"summary":"Check balance and credits","description":"Returns the current account balance, daily usage, limit, and remaining calls for the authenticated key. Requires authentication.","operationId":"getBalance","security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Balance information","content":{"application/json":{"schema":{"type":"object","properties":{"tier":{"type":"string"},"used_today":{"type":"integer"},"limit":{"type":"integer"},"remaining":{"type":"integer"},"is_subscription":{"type":"boolean"}}}}}}}}},"/v1/json-to-csv":{"post":{"tags":["Format Utils"],"summary":"Convert JSON array to CSV","description":"Accepts a JSON array of objects and converts it to CSV format. The first object's keys become the CSV header row. Accepts input via request body or ?json= query parameter.","operationId":"jsonToCsv","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","schema":{"type":"string"},"description":"JSON array as a string (alternative to request body)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"},{"name":"data","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"}],"requestBody":{"content":{"application/json":{"schema":{"type":"array","description":"Array of flat objects to convert to CSV","example":[{"name":"Alice","age":30},{"name":"Bob","age":25}]}},"text/plain":{"schema":{"type":"string","description":"Raw JSON array string"}}}},"responses":{"200":{"description":"CSV output","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"csv":{"type":"string","description":"CSV-formatted string"},"rows":{"type":"integer","description":"Number of data rows"},"columns":{"type":"integer","description":"Number of columns"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/csv-to-json":{"post":{"tags":["Format Utils"],"summary":"Convert CSV to JSON array","description":"Accepts CSV text and converts it to a JSON array of objects. The first line is treated as the header row. Accepts input via request body or ?csv= query parameter.","operationId":"csvToJson","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"csv","in":"query","schema":{"type":"string"},"description":"CSV text (alternative to request body)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'csv'"}],"requestBody":{"content":{"text/plain":{"schema":{"type":"string","description":"Raw CSV text"}}}},"responses":{"200":{"description":"JSON output","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"json":{"type":"array","items":{"type":"object"},"description":"Parsed JSON array"},"rows":{"type":"integer"},"columns":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/json-to-yaml":{"post":{"tags":["Format Utils"],"summary":"Convert JSON to YAML","description":"Accepts a JSON object or array and converts it to YAML format. Supports nested objects, arrays, strings, numbers, booleans, and null. Accepts input via request body or ?json= query parameter.","operationId":"jsonToYaml","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","schema":{"type":"string"},"description":"JSON string (alternative to request body)"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"JSON data to convert to YAML"}}}},"responses":{"200":{"description":"YAML output","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"yaml":{"type":"string","description":"YAML-formatted string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/yaml-to-json":{"post":{"tags":["Format Utils"],"summary":"Convert YAML to JSON","description":"Accepts YAML text and converts it to a JSON object. Supports basic key: value structures, nested objects, and arrays. Accepts input via request body or ?yaml= query parameter.","operationId":"yamlToJson","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"yaml","in":"query","schema":{"type":"string"},"description":"YAML text (alternative to request body)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'yaml'"}],"requestBody":{"content":{"text/plain":{"schema":{"type":"string","description":"Raw YAML text"}}}},"responses":{"200":{"description":"JSON output","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"json":{"type":"object","description":"Parsed JSON object"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/json-to-xml":{"post":{"tags":["Format Utils"],"summary":"Convert JSON to XML","description":"Accepts a JSON object or array and converts it to XML. The root element is <root>. Nested objects become nested elements, arrays repeat element tags. Accepts input via request body or ?json= query parameter.","operationId":"jsonToXml","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","schema":{"type":"string"},"description":"JSON string (alternative to request body)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","description":"JSON data to convert to XML"}}}},"responses":{"200":{"description":"XML output","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"xml":{"type":"string","description":"XML-formatted string including XML declaration"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/xml-to-json":{"post":{"tags":["Format Utils"],"summary":"Convert XML to JSON","description":"Accepts XML text and converts it to a JSON object. Parses flat XML structures with simple child elements. Accepts input via request body or ?xml= query parameter.","operationId":"xmlToJson","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"xml","in":"query","schema":{"type":"string"},"description":"XML text (alternative to request body)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'xml'"}],"requestBody":{"content":{"text/plain":{"schema":{"type":"string","description":"Raw XML text"}}}},"responses":{"200":{"description":"JSON output","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"json":{"type":"object","description":"Parsed JSON object"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/case-converter":{"get":{"tags":["Format Utils"],"summary":"Convert string case (camel/snake/kebab/pascal)","description":"Converts a string between different cases: camelCase, snake_case, kebab-case, PascalCase, Title Case, UPPERCASE, or lowercase.","operationId":"caseConverterGet","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"The input text to convert"},{"name":"text","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"},{"name":"case","in":"query","schema":{"type":"string","enum":["camel","snake","kebab","pascal","title","upper","lower"],"default":"snake"},"description":"Target case type"},{"name":"to","in":"query","schema":{"type":"string"},"description":"Alias for 'case'"}],"responses":{"200":{"description":"Converted string","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"case":{"type":"string"},"result":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Format Utils"],"summary":"Convert string case via POST","description":"Same as GET but accepts parameters in the request body as JSON.","operationId":"caseConverterPost","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"The input text to convert"},"case":{"type":"string","enum":["camel","snake","kebab","pascal","title","upper","lower"]}},"required":["input"]}}}},"responses":{"200":{"description":"Converted string","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"case":{"type":"string"},"result":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/slug":{"get":{"tags":["Format Utils"],"summary":"Generate URL-safe slug","description":"Converts an input string into a URL-friendly slug. Strips diacritics, removes special characters, and replaces spaces with a separator. Supports configurable separator, max length, and lowercase option.","operationId":"generateSlug","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Text to convert to slug"},{"name":"text","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"},{"name":"lower","in":"query","schema":{"type":"boolean","default":true},"description":"Convert to lowercase"},{"name":"sep","in":"query","schema":{"type":"string","default":"-"},"description":"Word separator character"},{"name":"max","in":"query","schema":{"type":"integer","minimum":1},"description":"Maximum slug length (truncates at word boundary)"}],"responses":{"200":{"description":"Generated slug","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"slug":{"type":"string"},"length":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/base64":{"get":{"tags":["Format Utils"],"summary":"Base64 encode/decode","description":"Encodes or decodes Base64 data. Mode can be 'encode' or 'decode'. Uses standard Base64 alphabet (with + and /).","operationId":"base64Convert","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Input text to encode or decode"},{"name":"text","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"},{"name":"mode","in":"query","schema":{"type":"string","enum":["encode","decode"],"default":"encode"},"description":"Operation mode"},{"name":"m","in":"query","schema":{"type":"string"},"description":"Alias for 'mode'"}],"responses":{"200":{"description":"Base64 result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"mode":{"type":"string"},"result":{"type":"string"},"format":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/base64url":{"get":{"tags":["Format Utils"],"summary":"Base64 URL-safe encode/decode","description":"Encodes or decodes data using URL-safe Base64 (uses - instead of +, _ instead of /, no padding).","operationId":"base64UrlConvert","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Input text to encode or decode"},{"name":"mode","in":"query","schema":{"type":"string","enum":["encode","decode"],"default":"encode"},"description":"Operation mode"}],"responses":{"200":{"description":"URL-safe Base64 result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"result":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/date-converter":{"get":{"tags":["Format Utils"],"summary":"Convert date between formats","description":"Parses a date string from various input formats (ISO, US, EU, Unix timestamp, or natural language) and returns it in multiple output formats (ISO, US, EU, RFC 2822, RFC 3339, Unix timestamp).","operationId":"convertDate","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Date string in any supported format (ISO, US, EU, epoch, etc.)"},{"name":"date","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"},{"name":"from","in":"query","schema":{"type":"string","default":"auto","description":"Source format hint: auto, iso, us, eu, unix"}},{"name":"to","in":"query","schema":{"type":"string","default":"iso","description":"Target format: iso, date, us, eu, rfc2822, rfc3339, unix"}},{"name":"format","in":"query","schema":{"type":"string"},"description":"Alias for 'to'"}],"responses":{"200":{"description":"Date conversion results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"parsed":{"type":"string","format":"date-time"},"formats":{"type":"object","properties":{"iso":{"type":"string"},"us":{"type":"string"},"eu":{"type":"string"},"rfc2822":{"type":"string"},"rfc3339":{"type":"string"},"unix":{"type":"integer"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/epoch":{"get":{"tags":["Format Utils"],"summary":"Epoch/Unix timestamp converter","description":"Converts a Unix epoch timestamp (in seconds or milliseconds) to human-readable date/time. If no input is provided, returns the current timestamp information.","operationId":"convertEpoch","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","schema":{"type":"integer"},"description":"Unix timestamp (seconds or milliseconds). Omit to get current time."},{"name":"ts","in":"query","schema":{"type":"integer"},"description":"Alias for 'input'"},{"name":"timestamp","in":"query","schema":{"type":"integer"},"description":"Alias for 'input'"},{"name":"to","in":"query","schema":{"type":"string","default":"iso"},"description":"Output format"}],"responses":{"200":{"description":"Timestamp conversion","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"now":{"type":"boolean","description":"True if no input was given and current time was used"},"epoch_seconds":{"type":"integer"},"epoch_millis":{"type":"integer"},"iso":{"type":"string"},"us":{"type":"string"},"rfc2822":{"type":"string"},"year":{"type":"integer"},"month":{"type":"integer"},"day":{"type":"integer"},"hour":{"type":"integer"},"minute":{"type":"integer"},"second":{"type":"integer"},"weekday":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/color-converter":{"get":{"tags":["Format Utils"],"summary":"Convert colors: HEX↔RGB↔HSL","description":"Converts colors between HEX, RGB, HSL, and CMYK formats. Accepts hex values, named colors, rgb(r,g,b), or hsl(h,s%,l%) strings.","operationId":"colorConverterGet","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"color","in":"query","required":true,"schema":{"type":"string"},"description":"Color value (HEX without #, named color, rgb(), or hsl())"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'color'"},{"name":"c","in":"query","schema":{"type":"string"},"description":"Alias for 'color'"},{"name":"format","in":"query","schema":{"type":"string","enum":["hex","rgb","hsl"],"default":"hex"},"description":"Input color format"},{"name":"from","in":"query","schema":{"type":"string"},"description":"Alias for 'format'"}],"responses":{"200":{"description":"Color conversion results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"hex":{"type":"string"},"rgb":{"type":"object","properties":{"r":{"type":"integer"},"g":{"type":"integer"},"b":{"type":"integer"},"string":{"type":"string"}}},"hsl":{"type":"object","properties":{"h":{"type":"integer"},"s":{"type":"string"},"l":{"type":"string"},"string":{"type":"string"}}},"cmyk":{"type":"object","properties":{"c":{"type":"integer"},"m":{"type":"integer"},"y":{"type":"integer"},"k":{"type":"integer"}}},"named":{"type":"string","nullable":true},"luminance":{"type":"integer"},"is_dark":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Format Utils"],"summary":"Convert colors via POST","description":"Same as GET but accepts parameters in the request body as JSON.","operationId":"colorConverterPost","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"color":{"type":"string","description":"Color value (HEX, named, rgb(), or hsl())"},"format":{"type":"string","enum":["hex","rgb","hsl"]}},"required":["color"]}}}},"responses":{"200":{"description":"Color conversion results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"hex":{"type":"string"},"rgb":{"type":"object"},"hsl":{"type":"object"},"cmyk":{"type":"object"},"named":{"type":"string","nullable":true},"luminance":{"type":"integer"},"is_dark":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/roman":{"get":{"tags":["Format Utils"],"summary":"Convert between Roman numerals and numbers","description":"Converts between integers (1–3999) and Roman numerals. By default converts number to Roman. Use &reverse=true for Roman to number. Also auto-detects Roman input if the value isn't numeric.","operationId":"convertRoman","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Number (1-3999) or Roman numeral (I, V, X, L, C, D, M)"},{"name":"value","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"},{"name":"num","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"},{"name":"reverse","in":"query","schema":{"type":"boolean","default":false},"description":"Set to true if input is a Roman numeral"},{"name":"from","in":"query","schema":{"type":"string","enum":["roman"]},"description":"Set to 'roman' to indicate input is a Roman numeral"}],"responses":{"200":{"description":"Conversion result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"number":{"type":"integer"},"roman":{"type":"string"},"direction":{"type":"string","enum":["number-to-roman","roman-to-number","auto-roman-to-number"]}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/json-minify":{"get":{"tags":["Format Utils"],"summary":"Strip whitespace from JSON","description":"Strips all whitespace from a JSON string, returning a compact representation. Also reports compression statistics.","operationId":"jsonMinifyGet","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","required":true,"schema":{"type":"string"},"description":"JSON string to minify"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"}],"responses":{"200":{"description":"Minified JSON","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"minified":{"type":"string"},"original_size":{"type":"integer"},"minified_size":{"type":"integer"},"savings":{"type":"integer"},"compression_pct":{"type":"number"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Format Utils"],"summary":"Minify JSON via POST","description":"Strips whitespace from JSON. Accepts raw JSON string in body, a JSON object with 'json' field, or ?json= query parameter. Returns minified output and compression stats.","operationId":"jsonMinifyPost","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","schema":{"type":"string"},"description":"JSON string (alternative to request body)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"string","description":"Raw JSON string in body"},{"type":"object","properties":{"json":{"type":"string"},"input":{"type":"string"}}}]}},"text/plain":{"schema":{"type":"string","description":"Raw JSON string"}}}},"responses":{"200":{"description":"Minified JSON","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"minified":{"type":"string"},"original_size":{"type":"integer"},"minified_size":{"type":"integer"},"savings":{"type":"integer"},"compression_pct":{"type":"number"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/cron-parser":{"get":{"tags":["Format Utils"],"summary":"Parse cron expressions","description":"Parses a standard 5-field cron expression (minute hour day-of-month month day-of-week) and returns a human-readable description with expanded field values.","operationId":"parseCron","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"cron","in":"query","required":true,"schema":{"type":"string"},"description":"Five-field cron expression, e.g. '0 0 * * *'","example":"0 0 * * *"},{"name":"expr","in":"query","schema":{"type":"string"},"description":"Alias for 'cron'"},{"name":"expression","in":"query","schema":{"type":"string"},"description":"Alias for 'cron'"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'cron'"}],"responses":{"200":{"description":"Parsed cron expression","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"expression":{"type":"string"},"fields":{"type":"object","properties":{"minute":{"type":"object","properties":{"raw":{"type":"string"},"values":{"type":"array","items":{"type":"integer"}},"label":{"type":"string"}}},"hour":{"type":"object","properties":{"raw":{"type":"string"},"values":{"type":"array","items":{"type":"integer"}},"label":{"type":"string"}}},"day_of_month":{"type":"object","properties":{"raw":{"type":"string"},"values":{"type":"array","items":{"type":"integer"}},"label":{"type":"string"}}},"month":{"type":"object","properties":{"raw":{"type":"string"},"values":{"type":"array","items":{"type":"integer"}},"label":{"type":"string"}}},"day_of_week":{"type":"object","properties":{"raw":{"type":"string"},"values":{"type":"array","items":{"type":"integer"}},"label":{"type":"string"}}}}},"description":{"type":"string","description":"Human-readable schedule description"},"is_valid":{"type":"boolean","example":true}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/word-count":{"get":{"tags":["Text Utils"],"summary":"Count words, chars, sentences in text","description":"Analyzes text and returns word count, character count (with and without spaces), sentence count, line count, paragraph count, unique word count, average word length, and longest word.","operationId":"wordCountGet","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Text to analyze"},{"name":"text","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"}],"responses":{"200":{"description":"Text analysis","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"word_count":{"type":"integer"},"char_count":{"type":"integer"},"char_no_spaces":{"type":"integer"},"sentence_count":{"type":"integer"},"line_count":{"type":"integer"},"paragraph_count":{"type":"integer"},"unique_words":{"type":"integer"},"avg_word_length":{"type":"number"},"longest_word":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Text Utils"],"summary":"Count words via POST","description":"Same as GET but accepts input parameters via request body (JSON object with 'input' field) or as raw text body.","operationId":"wordCountPost","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"Text to analyze"},"text":{"type":"string","description":"Text to analyze"}},"required":["input"]}},"text/plain":{"schema":{"type":"string","description":"Raw text body"}}}},"responses":{"200":{"description":"Text analysis","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"word_count":{"type":"integer"},"char_count":{"type":"integer"},"char_no_spaces":{"type":"integer"},"sentence_count":{"type":"integer"},"line_count":{"type":"integer"},"paragraph_count":{"type":"integer"},"unique_words":{"type":"integer"},"avg_word_length":{"type":"number"},"longest_word":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/language-detect":{"post":{"tags":["Text Utils"],"summary":"Detect language from text","description":"Detects the language of input text using character frequency analysis and script detection. Supports 20+ languages including English, Spanish, French, German, Russian, Chinese, Japanese, Arabic, and more. Accepts input via request body or ?input= query parameter.","operationId":"detectLanguage","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","schema":{"type":"string"},"description":"Text to analyze (alternative to request body)"},{"name":"text","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"Text to analyze"},"text":{"type":"string","description":"Text to analyze"}},"required":["input"]}},"text/plain":{"schema":{"type":"string","description":"Raw text body"}}}},"responses":{"200":{"description":"Language detection result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"detected_language":{"type":"string","description":"ISO 639-1 language code"},"language_name":{"type":"string"},"confidence":{"type":"integer","minimum":0,"maximum":99},"text_length":{"type":"integer"},"scripts_detected":{"type":"array","items":{"type":"string"}},"note":{"type":"string","nullable":true}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/uuid":{"get":{"tags":["Text Utils"],"summary":"Generate UUID v4","description":"Generates a random UUID v4 identifier. Supports optional format variants: standard (8-4-4-4-12), hex (no hyphens), or base64.","operationId":"generateUuid","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"version","in":"query","schema":{"type":"string","default":"4"},"description":"UUID version (only 4 supported)"},{"name":"format","in":"query","schema":{"type":"string","enum":["standard","hex","base64"],"default":"standard"},"description":"Output format"}],"responses":{"200":{"description":"Generated UUID","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"uuid":{"type":"string"},"version":{"type":"string"},"format":{"type":"string"},"standard":{"type":"string","description":"Standard formatted UUID"},"uppercase":{"type":"string"}}}}}}}}},"/v1/uuid-batch":{"get":{"tags":["Text Utils"],"summary":"Generate batch UUIDs","description":"Generates multiple random UUID v4 identifiers in a single call. Count can range from 1 to 1000.","operationId":"generateUuidBatch","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"count","in":"query","schema":{"type":"integer","default":5,"minimum":1,"maximum":1000},"description":"Number of UUIDs to generate"}],"responses":{"200":{"description":"Batch UUIDs","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"count":{"type":"integer"},"uuids":{"type":"array","items":{"type":"string"}}}}}}}}}},"/v1/password-generator":{"get":{"tags":["Text Utils"],"summary":"Generate secure passwords","description":"Generates cryptographically-random passwords with configurable length, character sets, and quantity. Each password is shuffled to ensure character distribution. Returns strength estimation (weak/moderate/strong/very_strong) based on entropy.","operationId":"generatePassword","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"length","in":"query","schema":{"type":"integer","default":16,"minimum":4,"maximum":256},"description":"Password length"},{"name":"uppercase","in":"query","schema":{"type":"boolean","default":true},"description":"Include uppercase letters"},{"name":"digits","in":"query","schema":{"type":"boolean","default":true},"description":"Include digits"},{"name":"numbers","in":"query","schema":{"type":"boolean","default":true},"description":"Alias for 'digits'"},{"name":"symbols","in":"query","schema":{"type":"boolean","default":false},"description":"Include special characters"},{"name":"count","in":"query","schema":{"type":"integer","default":1,"minimum":1,"maximum":50},"description":"Number of passwords to generate"}],"responses":{"200":{"description":"Generated passwords","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"count":{"type":"integer"},"config":{"type":"object","properties":{"length":{"type":"integer"},"uppercase":{"type":"boolean"},"digits":{"type":"boolean"},"symbols":{"type":"boolean"}}},"passwords":{"type":"array","items":{"type":"object","properties":{"password":{"type":"string"},"strength":{"type":"string","enum":["weak","moderate","strong","very_strong"]},"length":{"type":"integer"}}}}}}}}}}}},"/v1/random-name":{"get":{"tags":["Text Utils"],"summary":"Generate random names","description":"Generates random human names from a curated pool of first and last names. Supports multiple output formats: full, first, last, initials. Can generate multiple names in one call.","operationId":"generateRandomName","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"count","in":"query","schema":{"type":"integer","default":1,"minimum":1,"maximum":100},"description":"Number of names to generate"},{"name":"format","in":"query","schema":{"type":"string","enum":["full","first","last","initials"],"default":"full"},"description":"Output format for the formatted field"}],"responses":{"200":{"description":"Generated names","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"count":{"type":"integer"},"format":{"type":"string"},"names":{"type":"array","items":{"type":"object","properties":{"first":{"type":"string"},"last":{"type":"string"},"full":{"type":"string"},"initials":{"type":"string"},"formatted":{"type":"string"}}}}}}}}}}}},"/v1/lorem-ipsum":{"get":{"tags":["Text Utils"],"summary":"Generate Lorem Ipsum text","description":"Generates classic Lorem Ipsum placeholder text as paragraphs, sentences, or words. Each generation produces randomized but grammatically consistent output.","operationId":"generateLoremIpsum","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"count","in":"query","schema":{"type":"integer","default":1,"minimum":1,"maximum":100},"description":"Number of units to generate"},{"name":"type","in":"query","schema":{"type":"string","enum":["paragraphs","sentences","words"],"default":"paragraphs"},"description":"Type of text unit"}],"responses":{"200":{"description":"Generated text","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"type":{"type":"string"},"count":{"type":"integer"},"text":{"type":"string"},"word_count":{"type":"integer"}}}}}}}}},"/v1/email-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate email address syntax","description":"Validates an email address format using RFC-compatible regex. Returns detailed breakdown of local part, domain, and structure.","operationId":"validateEmail","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string"},"description":"Email address to validate"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'email'"}],"responses":{"200":{"description":"Email validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"email":{"type":"string"},"valid":{"type":"boolean"},"has_at":{"type":"boolean"},"has_dot":{"type":"boolean"},"local_part":{"type":"string"},"domain":{"type":"string"},"has_tld":{"type":"boolean"},"local_length":{"type":"integer"},"domain_length":{"type":"integer"},"total_length":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/ipv4-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate IPv4 address","description":"Validates an IPv4 address, checking octet ranges (0–255) and classifying as private, loopback, or multicast.","operationId":"validateIpv4","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ip","in":"query","required":true,"schema":{"type":"string"},"description":"IPv4 address to validate"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'ip'"}],"responses":{"200":{"description":"IPv4 validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"ip":{"type":"string"},"valid":{"type":"boolean"},"octets":{"type":"array","items":{"type":"integer"},"example":[192,168,1,1]},"version":{"type":"integer","example":4},"is_private":{"type":"boolean"},"is_loopback":{"type":"boolean"},"is_multicast":{"type":"boolean"},"binary":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/ipv6-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate IPv6 address","description":"Validates an IPv6 address, classifying as loopback, unique-local, or link-local.","operationId":"validateIpv6","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ip","in":"query","required":true,"schema":{"type":"string"},"description":"IPv6 address to validate"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'ip'"}],"responses":{"200":{"description":"IPv6 validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"ip":{"type":"string"},"valid":{"type":"boolean"},"version":{"type":"integer","example":6},"groups":{"type":"integer"},"expanded":{"type":"string","nullable":true},"is_loopback":{"type":"boolean"},"is_unique_local":{"type":"boolean"},"is_link_local":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/json-schema-validate":{"post":{"tags":["Validation Utils"],"summary":"Validate JSON against schema","description":"Validates JSON data against a provided JSON Schema. Supports type checking, required properties, min/max, pattern, enum, minItems/maxItems, and additionalProperties.","operationId":"validateJsonSchema","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"schema":{"type":"object","description":"JSON Schema to validate against"},"data":{"description":"Data to validate"}},"required":["schema","data"]}}}},"responses":{"200":{"description":"Schema validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"valid":{"type":"boolean"},"errors":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"error_count":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/regex":{"get":{"tags":["Validation Utils"],"summary":"Test regex against text","description":"Tests a regular expression pattern against input text and returns all matches, including capture groups. Supports standard flags (g, i, m, etc.).","operationId":"testRegex","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"pattern","in":"query","required":true,"schema":{"type":"string"},"description":"Regular expression pattern"},{"name":"p","in":"query","schema":{"type":"string"},"description":"Alias for 'pattern'"},{"name":"text","in":"query","required":true,"schema":{"type":"string"},"description":"Text to test against"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'text'"},{"name":"t","in":"query","schema":{"type":"string"},"description":"Alias for 'text'"},{"name":"flags","in":"query","schema":{"type":"string","default":""},"description":"Regex flags (g, i, m, s, u, y)"},{"name":"f","in":"query","schema":{"type":"string"},"description":"Alias for 'flags'"}],"responses":{"200":{"description":"Regex test results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"pattern":{"type":"string"},"flags":{"type":"string"},"text_length":{"type":"integer"},"match_count":{"type":"integer"},"matched":{"type":"boolean"},"matches":{"type":"array","items":{"type":"object","properties":{"full":{"type":"string"},"index":{"type":"integer"},"groups":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer"},"value":{"type":"string"}}}}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Validation Utils"],"summary":"Test regex via POST","description":"Same as GET but accepts parameters via request body or query string.","operationId":"testRegexPost","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"pattern":{"type":"string","description":"Regular expression pattern"},"text":{"type":"string","description":"Text to test against"},"flags":{"type":"string","description":"Regex flags"}},"required":["pattern","text"]}}}},"responses":{"200":{"description":"Regex test results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"pattern":{"type":"string"},"flags":{"type":"string"},"text_length":{"type":"integer"},"match_count":{"type":"integer"},"matched":{"type":"boolean"},"matches":{"type":"array","items":{"type":"object"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/password-strength":{"get":{"tags":["Validation Utils"],"summary":"Check password strength","description":"Analyzes a password and returns a strength score (0–100) with classification: weak, fair, good, or strong. Checks length, character variety, common passwords, and sequential patterns.","operationId":"checkPasswordStrength","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"password","in":"query","required":true,"schema":{"type":"string"},"description":"Password to evaluate"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'password'"},{"name":"pwd","in":"query","schema":{"type":"string"},"description":"Alias for 'password'"}],"responses":{"200":{"description":"Password strength analysis","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"password_length":{"type":"integer"},"score":{"type":"integer","minimum":0,"maximum":100},"strength":{"type":"string","enum":["weak","fair","good","strong"]},"issues":{"type":"array","items":{"type":"string"}},"has_uppercase":{"type":"boolean"},"has_lowercase":{"type":"boolean"},"has_digits":{"type":"boolean"},"has_special":{"type":"boolean"},"unique_chars":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/url-syntax":{"get":{"tags":["Validation Utils"],"summary":"Validate URL syntax","description":"Validates URL syntax and returns parsed components (protocol, hostname, port, path, query, hash). Attempts to add https:// prefix if no protocol is provided.","operationId":"validateUrlSyntax","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string"},"description":"URL to validate"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'url'"}],"responses":{"200":{"description":"URL syntax validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"url":{"type":"string"},"valid":{"type":"boolean"},"protocol":{"type":"string"},"hostname":{"type":"string"},"port":{"type":"string","nullable":true},"pathname":{"type":"string"},"search":{"type":"string","nullable":true},"hash":{"type":"string","nullable":true},"host":{"type":"string"},"origin":{"type":"string"},"note":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Validation Utils"],"summary":"Validate URL syntax via POST","description":"Same as GET but accepts parameters via request body.","operationId":"validateUrlSyntaxPost","security":[{"ApiKeyAuth":[]}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"URL to validate"}},"required":["url"]}}}},"responses":{"200":{"$ref":"#/paths/~1v1~1url-syntax/get/responses/200"},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/coordinate-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate lat/lng coordinates","description":"Validates geographic coordinates, checking latitude (-90 to 90) and longitude (-180 to 180) ranges. Accepts separate lat/lng params or a comma/space-separated string.","operationId":"validateCoordinates","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"lat","in":"query","schema":{"type":"number"},"description":"Latitude (-90 to 90)"},{"name":"latitude","in":"query","schema":{"type":"number"},"description":"Alias for 'lat'"},{"name":"lng","in":"query","schema":{"type":"number"},"description":"Longitude (-180 to 180)"},{"name":"lon","in":"query","schema":{"type":"number"},"description":"Alias for 'lng'"},{"name":"longitude","in":"query","schema":{"type":"number"},"description":"Alias for 'lng'"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Comma/space-separated lat,lng (alternative)"},{"name":"coords","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"}],"responses":{"200":{"description":"Coordinate validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"latitude":{"type":"number"},"longitude":{"type":"number"},"valid":{"type":"boolean"},"lat_valid":{"type":"boolean"},"lng_valid":{"type":"boolean"},"errors":{"type":"array","items":{"type":"string"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/isbn-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate ISBN-10 and ISBN-13","description":"Validates ISBN-10 (with check digit 0-9 or X) and ISBN-13 identifiers using checksum verification. Strips dashes, spaces, and 'ISBN' prefix automatically.","operationId":"validateIsbn","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"isbn","in":"query","required":true,"schema":{"type":"string"},"description":"ISBN-10 or ISBN-13 to validate"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'isbn'"}],"responses":{"200":{"description":"ISBN validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"cleaned":{"type":"string"},"valid":{"type":"boolean"},"type":{"type":"string","nullable":true,"enum":["ISBN-10","ISBN-13"]},"length":{"type":"integer"},"check_digit":{"type":"string"},"prefix":{"type":"string"},"group":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/abn-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate Australian Business Number","description":"Validates an Australian Business Number (ABN) using the official ATO checksum algorithm (mod 89). Strips spaces and dashes automatically.","operationId":"validateAbn","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"abn","in":"query","required":true,"schema":{"type":"string"},"description":"ABN to validate (11 digits)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'abn'"}],"responses":{"200":{"description":"ABN validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"abn":{"type":"string"},"valid":{"type":"boolean"},"type":{"type":"string","example":"ABN"},"format":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/acn-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate Australian Company Number","description":"Validates an Australian Company Number (ACN) using the official checksum algorithm (mod 10). Strips spaces and dashes automatically.","operationId":"validateAcn","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"acn","in":"query","required":true,"schema":{"type":"string"},"description":"ACN to validate (9 digits)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'acn'"}],"responses":{"200":{"description":"ACN validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"acn":{"type":"string"},"valid":{"type":"boolean"},"type":{"type":"string","example":"ACN"},"format":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/ein-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate US EIN","description":"Validates a US EIN (9-digit format XX-XXXXXXX) and identifies the IRS office associated with the prefix (first 2 digits).","operationId":"validateEin","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ein","in":"query","required":true,"schema":{"type":"string"},"description":"EIN to validate (9 digits)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'ein'"}],"responses":{"200":{"description":"EIN validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"ein":{"type":"string"},"formatted":{"type":"string"},"valid":{"type":"boolean"},"prefix":{"type":"string"},"irs_office":{"type":"string"},"format":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/json-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate JSON string syntax","description":"Validates whether a string is valid JSON and reports the parsed type (object, array, string, number, etc.) with byte size.","operationId":"validateJson","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","required":true,"schema":{"type":"string"},"description":"JSON string to validate"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"}],"responses":{"200":{"description":"JSON validation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"valid":{"type":"boolean"},"type":{"type":"string"},"size_bytes":{"type":"integer"},"error":{"type":"string"},"position":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Validation Utils"],"summary":"Validate JSON via POST","description":"Same as GET but accepts JSON string in request body or ?json= query parameter.","operationId":"validateJsonPost","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","schema":{"type":"string"},"description":"JSON string (alternative to request body)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"string","description":"Raw JSON string"},{"type":"object","description":"Any valid JSON object"}]}},"text/plain":{"schema":{"type":"string","description":"Raw JSON string"}}}},"responses":{"200":{"$ref":"#/paths/~1v1~1json-validate/get/responses/200"},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/json-format":{"get":{"tags":["Validation Utils"],"summary":"Pretty-print JSON","description":"Parses a JSON string and returns it pretty-printed with configurable indentation.","operationId":"formatJson","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","required":true,"schema":{"type":"string"},"description":"JSON string to format"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"},{"name":"indent","in":"query","schema":{"type":"integer","default":2,"minimum":0},"description":"Indentation spaces"}],"responses":{"200":{"description":"Formatted JSON","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"formatted":{"type":"string"},"original_size":{"type":"integer"},"indent":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Validation Utils"],"summary":"Pretty-print JSON via POST","description":"Same as GET but accepts JSON string in request body or ?json= query parameter.","operationId":"formatJsonPost","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"json","in":"query","schema":{"type":"string"},"description":"JSON string (alternative to request body)"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'json'"},{"name":"indent","in":"query","schema":{"type":"integer","default":2},"description":"Indentation spaces"}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"string","description":"Raw JSON string"},{"type":"object","description":"Any valid JSON object"}]}},"text/plain":{"schema":{"type":"string","description":"Raw JSON string"}}}},"responses":{"200":{"$ref":"#/paths/~1v1~1json-format/get/responses/200"},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/md5":{"get":{"tags":["Security Utils"],"summary":"Compute MD5 hash","description":"Computes the MD5 hash of an input string. Returns the hash as a 32-character hexadecimal string.","operationId":"computeMd5","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Text to hash"}],"responses":{"200":{"description":"MD5 hash result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"algorithm":{"type":"string","example":"MD5"},"hash":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/sha256":{"get":{"tags":["Security Utils"],"summary":"Compute SHA-256 hash","description":"Computes the SHA-256 hash of an input string. Returns the hash as a 64-character hexadecimal string.","operationId":"computeSha256","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Text to hash"}],"responses":{"200":{"description":"SHA-256 hash result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"algorithm":{"type":"string","example":"SHA-256"},"hash":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/hash":{"get":{"tags":["Security Utils"],"summary":"Compute hash (md5/sha1/sha256/sha384/sha512/all)","description":"Computes a hash using the specified algorithm: md5, sha1, sha256, sha384, sha512, or 'all' to compute all five at once.","operationId":"computeHash","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Text to hash"},{"name":"algorithm","in":"query","schema":{"type":"string","default":"sha256","enum":["md5","sha1","sha256","sha384","sha512","all"]},"description":"Hash algorithm"},{"name":"algo","in":"query","schema":{"type":"string"},"description":"Alias for 'algorithm'"}],"responses":{"200":{"description":"Hash result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input":{"type":"string"},"algorithm":{"type":"string"},"hash":{"type":"string"},"results":{"type":"object","description":"All algorithm results when algorithm=all","properties":{"MD5":{"type":"string"},"SHA1":{"type":"string"},"SHA256":{"type":"string"},"SHA384":{"type":"string"},"SHA512":{"type":"string"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/hmac":{"get":{"tags":["Security Utils"],"summary":"HMAC sign/verify","description":"Signs data using HMAC with SHA-256, SHA-384, or SHA-512, or verifies an existing HMAC signature. Accepts a secret key and data string.","operationId":"computeHmac","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Data to sign or verify"},{"name":"secret","in":"query","required":true,"schema":{"type":"string"},"description":"HMAC secret key"},{"name":"algorithm","in":"query","schema":{"type":"string","default":"SHA-256","enum":["SHA-1","SHA-256","SHA-384","SHA-512"]},"description":"Hash algorithm"},{"name":"mode","in":"query","schema":{"type":"string","default":"sign","enum":["sign","verify"]},"description":"Operation mode"},{"name":"signature","in":"query","schema":{"type":"string"},"description":"Existing signature hex to verify against (required when mode=verify)"}],"responses":{"200":{"description":"HMAC result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"mode":{"type":"string","enum":["sign","verify"]},"algorithm":{"type":"string"},"signature":{"type":"string"},"key_length":{"type":"integer"},"data_length":{"type":"integer"},"valid":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/jwt-encode":{"get":{"tags":["Security Utils"],"summary":"JWT encode","description":"Creates a signed JWT token using HMAC with HS256, HS384, or HS512. Accepts a JSON payload and secret key. Automatically adds iat and exp claims.","operationId":"encodeJwt","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"payload","in":"query","required":true,"schema":{"type":"string"},"description":"JSON string representing the JWT payload"},{"name":"secret","in":"query","required":true,"schema":{"type":"string"},"description":"Secret key for signing"},{"name":"algorithm","in":"query","schema":{"type":"string","default":"HS256","enum":["HS256","HS384","HS512"]},"description":"JWT signing algorithm"},{"name":"expires_in","in":"query","schema":{"type":"integer","default":3600},"description":"Token expiry in seconds from now"}],"responses":{"200":{"description":"Encoded JWT token","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"token":{"type":"string"},"algorithm":{"type":"string"},"header":{"type":"object"},"payload":{"type":"object"},"expires_at":{"type":"integer"},"ttl_seconds":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/jwt-verify":{"get":{"tags":["Security Utils"],"summary":"JWT verify/decode","description":"Decodes and verifies a JWT token's signature using HS256/HS384/HS512. Returns decoded header and payload, expiry status, and remaining TTL.","operationId":"verifyJwt","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string"},"description":"JWT token to verify"},{"name":"secret","in":"query","required":true,"schema":{"type":"string"},"description":"Secret key to verify signature"}],"responses":{"200":{"description":"JWT verification result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"valid":{"type":"boolean"},"header":{"type":"object"},"payload":{"type":"object"},"expired":{"type":"boolean"},"exp":{"type":"integer","nullable":true},"ttl_remaining":{"type":"integer","nullable":true},"not_before":{"type":"integer","nullable":true},"issuer":{"type":"string","nullable":true},"subject":{"type":"string","nullable":true},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/totp":{"get":{"tags":["Security Utils"],"summary":"TOTP generate/verify","description":"Generates or verifies a TOTP code using a base32-encoded secret. Supports 6-8 digit codes with configurable time period (default 30s).","operationId":"handleTotp","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"secret","in":"query","required":true,"schema":{"type":"string"},"description":"Base32-encoded secret key"},{"name":"mode","in":"query","schema":{"type":"string","default":"generate","enum":["generate","verify"]},"description":"Operation mode"},{"name":"code","in":"query","schema":{"type":"string"},"description":"TOTP code to verify (required when mode=verify)"},{"name":"digits","in":"query","schema":{"type":"integer","default":6,"minimum":6,"maximum":8},"description":"Number of digits (6, 7, or 8)"},{"name":"period","in":"query","schema":{"type":"integer","default":30,"minimum":1},"description":"Time step in seconds"}],"responses":{"200":{"description":"TOTP result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"mode":{"type":"string"},"code":{"type":"string"},"digits":{"type":"integer"},"period":{"type":"integer"},"remaining_seconds":{"type":"integer"},"valid":{"type":"boolean"},"secret":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/password-hash":{"get":{"tags":["Security Utils"],"summary":"Password hash/verify","description":"Hashes a password with a salt using iterated SHA-256, or verifies a password against a stored hash. Supports configurable iteration count.","operationId":"handlePasswordHash","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"password","in":"query","required":true,"schema":{"type":"string"},"description":"Password to hash or verify"},{"name":"mode","in":"query","schema":{"type":"string","default":"hash","enum":["hash","verify"]},"description":"Operation mode"},{"name":"hash","in":"query","schema":{"type":"string"},"description":"Stored hash (required when mode=verify)"},{"name":"salt","in":"query","schema":{"type":"string"},"description":"Salt (required when mode=verify; auto-generated when mode=hash)"},{"name":"iterations","in":"query","schema":{"type":"integer","default":100000,"minimum":1000,"maximum":1000000},"description":"Iteration count"}],"responses":{"200":{"description":"Password hash result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"mode":{"type":"string","enum":["hash","verify"]},"algorithm":{"type":"string"},"hash":{"type":"string"},"salt":{"type":"string"},"salt_length":{"type":"integer"},"iterations":{"type":"integer"},"valid":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/aes-encrypt":{"get":{"tags":["Security Utils"],"summary":"AES-256-GCM encrypt","description":"Encrypts plaintext using AES-256-GCM with a random 12-byte IV. Returns ciphertext, IV, and authentication tag. Supports hex or base64 output encoding.","operationId":"aesEncrypt","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Plaintext to encrypt"},{"name":"key","in":"query","required":true,"schema":{"type":"string"},"description":"AES-256 key as 64-character hex string"},{"name":"aad","in":"query","schema":{"type":"string"},"description":"Additional Authenticated Data (AAD)"},{"name":"encoding","in":"query","schema":{"type":"string","default":"hex","enum":["hex","base64","base64url"]},"description":"Output encoding for ciphertext"}],"responses":{"200":{"description":"AES encryption result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"algorithm":{"type":"string","example":"AES-256-GCM"},"ciphertext":{"type":"string"},"iv":{"type":"string"},"iv_length":{"type":"integer"},"tag":{"type":"string"},"tag_length":{"type":"integer"},"ciphertext_length":{"type":"integer"},"encoding":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/aes-decrypt":{"get":{"tags":["Security Utils"],"summary":"AES-256-GCM decrypt","description":"Decrypts AES-256-GCM ciphertext using the same key, IV, and optional AAD. Accepts hex or base64 ciphertext.","operationId":"aesDecrypt","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ciphertext","in":"query","required":true,"schema":{"type":"string"},"description":"Ciphertext (hex or base64)"},{"name":"key","in":"query","required":true,"schema":{"type":"string"},"description":"AES-256 key as 64-character hex string"},{"name":"iv","in":"query","required":true,"schema":{"type":"string"},"description":"IV as 24-character hex string"},{"name":"aad","in":"query","schema":{"type":"string"},"description":"Additional Authenticated Data (must match encryption)"}],"responses":{"200":{"description":"AES decryption result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"algorithm":{"type":"string","example":"AES-256-GCM"},"plaintext":{"type":"string"},"plaintext_length":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/rsa-crypt":{"get":{"tags":["Security Utils"],"summary":"RSA encrypt/decrypt/keygen","description":"Generates RSA key pairs (2048/4096 bit) or encrypts/decrypts data using RSA-OAEP with SHA-256. Key generation returns hex and PEM formats.","operationId":"rsaCrypt","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"mode","in":"query","required":true,"schema":{"type":"string","enum":["generate","encrypt","decrypt"]},"description":"Operation mode"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Plaintext (mode=encrypt) or hex ciphertext (mode=decrypt)"},{"name":"public_key","in":"query","schema":{"type":"string"},"description":"Public key hex (required for mode=encrypt)"},{"name":"private_key","in":"query","schema":{"type":"string"},"description":"Private key hex (required for mode=decrypt)"},{"name":"key_size","in":"query","schema":{"type":"integer","default":2048,"enum":[2048,4096]},"description":"Key size in bits"}],"responses":{"200":{"description":"RSA operation result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"mode":{"type":"string"},"algorithm":{"type":"string","example":"RSA-OAEP-256"},"key_size":{"type":"integer"},"public_key":{"type":"string"},"public_key_pem":{"type":"string"},"private_key":{"type":"string"},"private_key_pem":{"type":"string"},"ciphertext":{"type":"string"},"plaintext":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/crc32":{"get":{"tags":["Security Utils"],"summary":"CRC32 checksum","description":"Computes the CRC32 checksum of an input string. Returns the unsigned decimal, signed integer, and hex representations.","operationId":"computeCrc32","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Text to compute CRC32 for"}],"responses":{"200":{"description":"CRC32 result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"input_length":{"type":"integer"},"crc32_hex":{"type":"string"},"crc32_decimal":{"type":"integer"},"crc32_signed":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/secure-compare":{"get":{"tags":["Security Utils"],"summary":"Constant-time string compare","description":"Compares two strings in constant time to prevent timing attacks. Supports hex, base64, and UTF-8 encodings.","operationId":"secureCompare","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"a","in":"query","required":true,"schema":{"type":"string"},"description":"First input string"},{"name":"b","in":"query","required":true,"schema":{"type":"string"},"description":"Second input string"},{"name":"encoding","in":"query","schema":{"type":"string","default":"utf8","enum":["utf8","hex","base64"]},"description":"Input encoding"}],"responses":{"200":{"description":"Secure comparison result","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"match":{"type":"boolean"},"a_length":{"type":"integer"},"b_length":{"type":"integer"},"a_bytes":{"type":"integer"},"b_bytes":{"type":"integer"},"equal_length":{"type":"boolean"},"method":{"type":"string"},"timing_safe":{"type":"boolean","example":true},"note":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/url-reachability":{"get":{"tags":["Web Intel"],"summary":"Check if a URL is reachable","description":"Performs an HTTP HEAD request to the given URL and returns reachability status, HTTP status code, response time, and key response headers. Supports configurable timeout.","operationId":"checkUrlReachability","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string"},"description":"URL to check (https:// prefix added if missing)"},{"name":"input","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'url'"},{"name":"timeout","in":"query","required":false,"schema":{"type":"integer","default":10,"minimum":1},"description":"Request timeout in seconds"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string"},"reachable":{"type":"boolean"},"status_code":{"type":"integer","nullable":true},"status_text":{"type":"string","nullable":true},"timing_ms":{"type":"integer","nullable":true},"headers":{"type":"object","nullable":true,"properties":{"content_type":{"type":"string"},"content_length":{"type":"string"},"server":{"type":"string"},"last_modified":{"type":"string"},"etag":{"type":"string"},"cache_control":{"type":"string"}}},"error":{"type":"string","nullable":true}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/domain-availability":{"get":{"tags":["Web Intel"],"summary":"Check domain registration via DNS","description":"Queries DNS-over-HTTPS (Cloudflare) for A, AAAA, MX, NS, CNAME, and TXT records. If no records exist the domain is likely available for registration.","operationId":"checkDomainAvailability","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"description":"Domain name to check (e.g. example.com)"},{"name":"input","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'domain'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"domain":{"type":"string"},"registered":{"type":"boolean"},"available":{"type":"boolean"},"records":{"type":"object","description":"DNS records by type"},"tld":{"type":"string"},"tld_type":{"type":"string"},"registrar":{"type":"string"},"note":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/whois":{"get":{"tags":["Web Intel"],"summary":"WHOIS lookup — domain registration via RDAP","description":"Queries domain registration information via RDAP (Registration Data Access Protocol). Returns registrant, registrar, nameservers, and key event dates.","operationId":"whoisLookup","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"description":"Domain name to look up (e.g. example.com)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"domain":{"type":"string"},"source":{"type":"string"},"handle":{"type":"string"},"status":{"type":"array","items":{"type":"string"}},"entities":{"type":"array","items":{"type":"object","properties":{"roles":{"type":"string"},"name":{"type":"string"},"handle":{"type":"string"}}}},"events":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"date":{"type":"string"}}}},"nameservers":{"type":"array","items":{"type":"string"}},"secure_dns":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/dns-a":{"get":{"tags":["Web Intel"],"summary":"DNS A record lookup","description":"Resolves a domain to IPv4 addresses using Google DNS-over-HTTPS. Supports configurable DNS record type (A, AAAA, MX, CNAME, TXT, etc.).","operationId":"dnsALookup","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"description":"Domain name to resolve"},{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"A"},"description":"DNS record type number"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"domain":{"type":"string"},"type":{"type":"string"},"query_type":{"type":"string"},"records":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"integer"},"ttl":{"type":"integer"},"data":{"type":"string"}}}},"count":{"type":"integer"},"authoritative":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/dns-all":{"get":{"tags":["Web Intel"],"summary":"All DNS records lookup","description":"Resolves A, AAAA, MX, CNAME, NS, TXT, SPF, and CAA records for a domain in a single call using Google DNS-over-HTTPS.","operationId":"dnsAllLookup","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"description":"Domain name to look up"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"domain":{"type":"string"},"records":{"type":"object","description":"DNS records grouped by type"},"total":{"type":"integer"},"types_found":{"type":"array","items":{"type":"string"}},"errors":{"type":"array","items":{"type":"object"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/ssl-check":{"get":{"tags":["Web Intel"],"summary":"SSL certificate check","description":"Checks HTTPS reachability for a domain and queries Certificate Transparency logs (crt.sh and Google CT) for issued certificates. Returns issuer, subject, and expiry information.","operationId":"sslCertificateCheck","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"},"description":"Domain name to check"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"domain":{"type":"string"},"https_reachable":{"type":"boolean"},"tls_version":{"type":"string","nullable":true},"cert_transparency":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"issuer":{"type":"string"},"common_name":{"type":"string"},"not_before":{"type":"string"},"not_after":{"type":"string"},"serial":{"type":"string"}}}},"issuer":{"type":"string","nullable":true},"subject":{"type":"string","nullable":true},"expiry":{"type":"string","nullable":true},"errors":{"type":"array","items":{"type":"object"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/http-headers":{"get":{"tags":["Web Intel"],"summary":"HTTP security headers analyzer","description":"Fetches a URL and analyzes its response headers for security best practices: HSTS, CSP, X-Frame-Options, X-Content-Type-Options, and more. Computes a security score (0-100).","operationId":"analyzeHttpHeaders","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string"},"description":"URL to analyze (https:// prefix added if missing)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string"},"status_code":{"type":"integer"},"security_score":{"type":"integer"},"headers_found":{"type":"array","items":{"type":"object","properties":{"header":{"type":"string"},"value":{"type":"string"},"severity":{"type":"string"}}}},"headers_missing":{"type":"array","items":{"type":"string"}},"total_checked":{"type":"integer"},"assessment":{"type":"string","enum":["good","needs_improvement","poor"]},"note":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/user-agent":{"get":{"tags":["Web Intel"],"summary":"User-Agent parser","description":"Parses a User-Agent string and detects browser name/version, OS, device type, and whether it's a bot or mobile device. If no 'ua' parameter is provided, uses the request's User-Agent header.","operationId":"parseUserAgent","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ua","in":"query","required":false,"schema":{"type":"string"},"description":"User-Agent string to parse (falls back to request User-Agent header)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"raw":{"type":"string"},"browser":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"engine":{"type":"string"}}},"os":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"},"platform":{"type":"string"}}},"device":{"type":"object","properties":{"type":{"type":"string","enum":["desktop","mobile","tablet"]},"brand":{"type":"string"}}},"is_bot":{"type":"boolean"},"is_mobile":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/robots-txt":{"get":{"tags":["Web Intel"],"summary":"robots.txt parser","description":"Fetches and parses the robots.txt file for a domain. Extracts User-Agent directives, allow/disallow rules, crawl-delay, and sitemaps.","operationId":"parseRobotsTxt","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string"},"description":"URL or domain to fetch robots.txt for (e.g. https://example.com)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"domain":{"type":"string"},"fetched":{"type":"string"},"status_code":{"type":"integer"},"has_robots_txt":{"type":"boolean"},"raw_size":{"type":"integer"},"total_user_agents":{"type":"integer"},"total_rules":{"type":"integer"},"sitemaps":{"type":"array","items":{"type":"string"}},"user_agents":{"type":"object"},"summary":{"type":"object","properties":{"disallows_all":{"type":"boolean"},"crawl_delay":{"type":"integer","nullable":true}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/url-preview":{"get":{"tags":["Web Intel"],"summary":"URL preview (title, OG tags)","description":"Fetches a URL and extracts metadata: title, description, Open Graph tags, Twitter card tags, favicon, canonical URL, H1, word count, and response code.","operationId":"previewUrl","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string"},"description":"URL to preview (https:// prefix added if missing)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"url":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"canonical":{"type":"string"},"favicon":{"type":"string"},"h1":{"type":"string"},"og":{"type":"object"},"twitter":{"type":"object"},"word_count":{"type":"integer"},"content_type":{"type":"string"},"response_code":{"type":"integer"},"html_size":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/redirect-chain":{"get":{"tags":["Web Intel"],"summary":"Redirect chain tracer","description":"Traces the full HTTP redirect chain for a URL, recording each hop's status code, location header, and key response headers. Detects redirect loops and HTTP-to-HTTPS upgrades.","operationId":"traceRedirectChain","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string"},"description":"URL to trace redirects for"},{"name":"max","in":"query","required":false,"schema":{"type":"integer","default":10,"minimum":1,"maximum":50},"description":"Maximum redirect hops to follow"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"initial_url":{"type":"string"},"final_url":{"type":"string"},"hops":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"status":{"type":"integer"},"type":{"type":"string","enum":["redirect","final","redirect_loop","error"]},"headers":{"type":"object"},"error":{"type":"string"}}}},"analysis":{"type":"object","properties":{"total_hops":{"type":"integer"},"final_status":{"type":"integer"},"has_loop":{"type":"boolean"},"has_http_to_https":{"type":"boolean"},"path_changed":{"type":"boolean"}}},"warnings":{"type":"array","items":{"type":"string"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/geoip":{"get":{"tags":["Web Intel"],"summary":"GeoIP lookup","description":"Looks up the geographical location of an IPv4 address using ip-api.com. Returns country, region, city, coordinates, timezone, ISP, and organization. If no IP is provided, uses the requester's IP.","operationId":"geoipLookup","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"ip","in":"query","required":false,"schema":{"type":"string"},"description":"IPv4 address to look up (defaults to requester IP if omitted)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"ip":{"type":"string"},"query_ip":{"type":"string"},"country":{"type":"string"},"country_code":{"type":"string"},"region":{"type":"string"},"region_name":{"type":"string"},"city":{"type":"string"},"zip":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"},"timezone":{"type":"string"},"isp":{"type":"string"},"org":{"type":"string"},"as":{"type":"string"},"source":{"type":"string"},"map_url":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/country-info":{"get":{"tags":["Business Utils"],"summary":"Look up country info","description":"Returns detailed information about a country including ISO codes, currencies, languages, capital, continent, phone prefix, and TLD. Look up by 2-letter code, 3-letter code, or name.","operationId":"getCountryInfo","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string"},"description":"ISO 3166-1 alpha-2 country code (e.g. US)"},{"name":"cc","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'code'"},{"name":"country_code","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'code'"},{"name":"name","in":"query","required":false,"schema":{"type":"string"},"description":"Country name (e.g. United States)"},{"name":"country","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'name'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"found":{"type":"boolean"},"country":{"type":"object","properties":{"code":{"type":"string"},"alpha3":{"type":"string"},"name":{"type":"string"},"capital":{"type":"string"},"continent":{"type":"string"},"currency":{"type":"string"},"phone":{"type":"string"},"tld":{"type":"string"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}},"post":{"tags":["Business Utils"],"summary":"Look up country info via POST","description":"Same as GET but accepts parameters in the request body as JSON.","operationId":"getCountryInfoPost","security":[{"ApiKeyAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"found":{"type":"boolean"},"country":{"type":"object"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/country-list":{"get":{"tags":["Business Utils"],"summary":"List all countries","description":"Returns a list of all countries with basic information. Can be filtered by continent or searched by name/code.","operationId":"listCountries","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"continent","in":"query","required":false,"schema":{"type":"string"},"description":"Filter by continent name (e.g. Europe, Asia)"},{"name":"search","in":"query","required":false,"schema":{"type":"string"},"description":"Search countries by name or code"},{"name":"q","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'search'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"integer"},"countries":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"alpha3":{"type":"string"},"name":{"type":"string"},"capital":{"type":"string"},"continent":{"type":"string"},"currency":{"type":"string"},"phone":{"type":"string"},"tld":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/week-number":{"get":{"tags":["Business Utils"],"summary":"Calculate ISO week number","description":"Returns the ISO 8601 week number for a given date. Includes week start/end dates, day of week, and quarter. If no date is provided, returns the current week number.","operationId":"getWeekNumber","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string"},"description":"Date in ISO 8601 format (e.g. 2024-01-15). Defaults to today."},{"name":"input","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'date'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"input_date":{"type":"string"},"date":{"type":"string"},"iso_week":{"type":"integer"},"year":{"type":"integer"},"month":{"type":"integer"},"day":{"type":"integer"},"day_of_week":{"type":"integer"},"week_start":{"type":"string"},"week_end":{"type":"string"},"quarter":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/age-calculator":{"get":{"tags":["Business Utils"],"summary":"Calculate age from birth date","description":"Calculates precise age in years, months, and days between a birth date and a target date (or today). Returns total days, weeks, months, hours, zodiac sign, and next birthday.","operationId":"calculateAge","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"birth","in":"query","required":true,"schema":{"type":"string"},"description":"Birth date in YYYY-MM-DD format"},{"name":"birthday","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'birth'"},{"name":"dob","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'birth'"},{"name":"date","in":"query","required":false,"schema":{"type":"string"},"description":"Target date (defaults to today)"},{"name":"at","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for target date"},{"name":"on","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for target date"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"birth_date":{"type":"string"},"target_date":{"type":"string"},"years":{"type":"integer"},"months":{"type":"integer"},"days":{"type":"integer"},"total_days":{"type":"integer"},"total_weeks":{"type":"integer"},"total_months":{"type":"integer"},"total_hours":{"type":"integer"},"age_string":{"type":"string"},"zodiac":{"type":"string","nullable":true},"next_birthday":{"type":"string","nullable":true},"is_leap_year":{"type":"boolean"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/salary-converter":{"get":{"tags":["Business Utils"],"summary":"Convert salary periods","description":"Converts salary amounts between hourly, daily, weekly, monthly, and yearly rates. Configurable working hours per week, days per week, and weeks per year.","operationId":"convertSalary","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"amount","in":"query","required":true,"schema":{"type":"number"},"description":"Salary amount to convert"},{"name":"salary","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'amount'"},{"name":"from","in":"query","required":false,"schema":{"type":"string","enum":["yearly","annual","monthly","weekly","daily","hourly"],"default":"yearly"},"description":"Source period"},{"name":"to","in":"query","required":false,"schema":{"type":"string","enum":["all","yearly","monthly","weekly","daily","hourly"],"default":"all"},"description":"Target period"},{"name":"hours_per_week","in":"query","required":false,"schema":{"type":"number","default":40},"description":"Working hours per week"},{"name":"hpw","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'hours_per_week'"},{"name":"days_per_week","in":"query","required":false,"schema":{"type":"number","default":5},"description":"Working days per week"},{"name":"dpw","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'days_per_week'"},{"name":"weeks_per_year","in":"query","required":false,"schema":{"type":"number","default":52},"description":"Working weeks per year"},{"name":"wpy","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'weeks_per_year'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"from":{"type":"string"},"amount":{"type":"number"},"conversions":{"type":"object","properties":{"yearly":{"type":"number"},"monthly":{"type":"number"},"weekly":{"type":"number"},"daily":{"type":"number"},"hourly":{"type":"number"}}},"assumptions":{"type":"object","properties":{"hours_per_week":{"type":"number"},"days_per_week":{"type":"number"},"weeks_per_year":{"type":"number"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/business-days":{"get":{"tags":["Business Utils"],"summary":"Business Days Calculator","description":"Calculates the number of business days (excluding weekends) between two dates, or adds/subtracts a number of business days to/from a given date.","operationId":"calculateBusinessDays","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"start","in":"query","required":false,"schema":{"type":"string"},"description":"Start date in ISO format (e.g. 2024-01-01)"},{"name":"end","in":"query","required":false,"schema":{"type":"string"},"description":"End date in ISO format"},{"name":"add","in":"query","required":false,"schema":{"type":"string"},"description":"Number of business days to add (positive or negative)"},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"US"},"description":"Country code for holiday calendar (reserved, defaults to US)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"start":{"type":"string"},"end":{"type":"string"},"business_days":{"type":"integer"},"total_days":{"type":"integer"},"weekends":{"type":"integer"},"start_date":{"type":"string"},"business_days_to_add":{"type":"integer"},"result_date":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/holiday-list":{"get":{"tags":["Business Utils"],"summary":"Holiday List","description":"Returns US federal holidays for a given year (2020-2099). Includes observed dates for holidays that fall on weekends.","operationId":"listHolidays","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"type":"integer","minimum":2020,"maximum":2099},"description":"Year for holiday list (2020-2099, defaults to current year)"},{"name":"country","in":"query","required":false,"schema":{"type":"string","default":"US"},"description":"Country code (reserved, defaults to US)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"year":{"type":"integer"},"country":{"type":"string"},"count":{"type":"integer"},"holidays":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"date":{"type":"string"},"day_of_week":{"type":"string"},"observed":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/sales-tax":{"get":{"tags":["Business Utils"],"summary":"Sales Tax (US)","description":"Returns sales tax rate for a US state. If no state is specified, returns all state rates sorted by rate (highest first). Optionally computes tax and total for a given amount.","operationId":"getSalesTax","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string"},"description":"Two-letter US state code (e.g. CA, NY)"},{"name":"amount","in":"query","required":false,"schema":{"type":"number","default":0},"description":"Purchase amount to calculate tax on"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"state":{"type":"string"},"state_name":{"type":"string"},"rate":{"type":"number"},"amount":{"type":"number"},"tax":{"type":"number"},"total":{"type":"number"},"note":{"type":"string"},"rates":{"type":"array","items":{"type":"object","properties":{"state":{"type":"string"},"state_name":{"type":"string"},"rate":{"type":"number"},"note":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/vat-calculator":{"get":{"tags":["Business Utils"],"summary":"VAT Calculator","description":"Calculates VAT for a given amount in supported countries. If no country is specified, returns all VAT rates sorted by rate.","operationId":"calculateVat","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string"},"description":"Two-letter country code (e.g. DE, FR, GB)"},{"name":"amount","in":"query","required":false,"schema":{"type":"number","default":0},"description":"Amount to calculate VAT on"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"country":{"type":"string"},"rate":{"type":"string"},"amount":{"type":"number"},"vat":{"type":"number"},"total":{"type":"number"},"rates":{"type":"array","items":{"type":"object","properties":{"country":{"type":"string"},"rate":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/mortgage-calculator":{"get":{"tags":["Business Utils"],"summary":"Mortgage Calculator","description":"Calculates monthly mortgage payments, total interest, and total paid over the loan term using standard amortization formula.","operationId":"calculateMortgage","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"principal","in":"query","required":true,"schema":{"type":"number"},"description":"Loan principal amount"},{"name":"amount","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'principal'"},{"name":"rate","in":"query","required":true,"schema":{"type":"number"},"description":"Annual interest rate (percentage, e.g. 6.5 for 6.5%)"},{"name":"apr","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'rate'"},{"name":"years","in":"query","required":false,"schema":{"type":"integer","default":30,"minimum":1},"description":"Loan term in years"},{"name":"term","in":"query","required":false,"schema":{"type":"integer"},"description":"Alias for 'years'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"principal":{"type":"number"},"rate":{"type":"string"},"years":{"type":"integer"},"monthly_payment":{"type":"number"},"total_interest":{"type":"number"},"total_paid":{"type":"number"},"amortization":{"type":"array","items":{"type":"object","properties":{"year":{"type":"integer"},"payment":{"type":"number"},"interest":{"type":"number"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/bic-swift-lookup":{"get":{"tags":["Business Utils"],"summary":"BIC/SWIFT Lookup","description":"Looks up bank information for a BIC/SWIFT code (8 or 11 characters). Returns bank name, location, and country. Includes a database of major global banks.","operationId":"lookupBicSwift","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string"},"description":"BIC/SWIFT code (8-11 characters)"},{"name":"bic","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'code'"},{"name":"swift","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'code'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"code":{"type":"string"},"bank":{"type":"string"},"location":{"type":"string"},"country":{"type":"string"},"note":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/freelance-rate":{"get":{"tags":["Business Utils"],"summary":"Freelance Rate Calculator","description":"Calculates recommended freelance billing rates based on desired annual income, billable hours, overhead percentage, and tax rate. Returns hourly, daily, weekly, and monthly rates.","operationId":"calculateFreelanceRate","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"desired","in":"query","required":true,"schema":{"type":"number"},"description":"Desired annual income"},{"name":"salary","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'desired'"},{"name":"billable","in":"query","required":false,"schema":{"type":"integer","default":1500,"minimum":1},"description":"Billable hours per year"},{"name":"hours","in":"query","required":false,"schema":{"type":"integer"},"description":"Alias for 'billable'"},{"name":"overhead","in":"query","required":false,"schema":{"type":"number","default":0.3},"description":"Overhead percentage (as decimal, e.g. 0.30)"},{"name":"tax","in":"query","required":false,"schema":{"type":"number","default":0.25},"description":"Tax rate (as decimal, e.g. 0.25)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"desired_annual":{"type":"number"},"billable_hours_per_year":{"type":"integer"},"hourly_rate":{"type":"number"},"adjusted_for_overhead":{"type":"number"},"fully_loaded":{"type":"number"},"daily_rate_8hr":{"type":"number"},"weekly_rate":{"type":"number"},"monthly_revenue":{"type":"number"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/currency-format":{"get":{"tags":["Business Utils"],"summary":"Currency Format","description":"Returns formatting information for a currency code (symbol, decimal places, locale format example) or lists all supported currencies. Optionally formats an amount.","operationId":"getCurrencyFormat","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string"},"description":"Locale code (reserved)"},{"name":"code","in":"query","required":false,"schema":{"type":"string"},"description":"Currency code (e.g. USD, EUR, JPY)"},{"name":"amount","in":"query","required":false,"schema":{"type":"number","default":0},"description":"Amount to format"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"integer"},"format_example":{"type":"string"},"input_amount":{"type":"number"},"formatted":{"type":"string"},"currencies":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"format_example":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/timezone-info":{"get":{"tags":["Business Utils"],"summary":"Timezone Info","description":"Returns detailed information about an IANA timezone: UTC offset, DST/standard abbreviations, country, major cities, and current local time.","operationId":"getTimezoneInfo","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"tz","in":"query","required":true,"schema":{"type":"string"},"description":"IANA timezone name (e.g. America/New_York, Europe/London)"},{"name":"timezone","in":"query","required":false,"schema":{"type":"string"},"description":"Alias for 'tz'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"timezone":{"type":"string"},"utc_offset":{"type":"string"},"current_abbr":{"type":"string"},"std_abbr":{"type":"string"},"dst_abbr":{"type":"string"},"country":{"type":"string"},"major_cities":{"type":"array","items":{"type":"string"}},"current_time":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/timezone-by-coords":{"get":{"tags":["Business Utils"],"summary":"Timezone by Coordinates","description":"Returns an approximate IANA timezone for a given latitude and longitude. Uses a coordinate-range lookup (accurate within ~500km).","operationId":"getTimezoneByCoords","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number"},"description":"Latitude (-90 to 90)"},{"name":"latitude","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'lat'"},{"name":"lng","in":"query","required":true,"schema":{"type":"number"},"description":"Longitude (-180 to 180)"},{"name":"longitude","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'lng'"},{"name":"lon","in":"query","required":false,"schema":{"type":"number"},"description":"Alias for 'lng'"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"lat":{"type":"number"},"lng":{"type":"number"},"timezone":{"type":"string"},"note":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/qr-generate":{"get":{"tags":["Image Utils"],"summary":"QR Code Generator","description":"Generates an SVG QR code from input text. Supports configurable module size and output format (SVG or matrix). Max 200 characters input.","operationId":"generateQrCode","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Text to encode in QR code (max 200 chars)"},{"name":"text","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"},{"name":"size","in":"query","schema":{"type":"integer","default":4,"minimum":2,"maximum":10},"description":"Module size (2-10, affects QR version)"},{"name":"format","in":"query","schema":{"type":"string","enum":["svg","matrix"],"default":"svg"},"description":"Output format: svg or raw matrix array"}],"responses":{"200":{"description":"QR code generated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"format":{"type":"string","example":"svg"},"svg":{"type":"string","description":"SVG markup of QR code"},"text":{"type":"string"},"matrix_size":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/barcode-generate":{"get":{"tags":["Image Utils"],"summary":"Barcode Generator","description":"Generates an SVG barcode (code128-style) from input text. Max 50 characters input.","operationId":"generateBarcode","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string"},"description":"Text to encode in barcode (max 50 chars)"},{"name":"text","in":"query","schema":{"type":"string"},"description":"Alias for 'input'"},{"name":"format","in":"query","schema":{"type":"string","enum":["code128"],"default":"code128"},"description":"Barcode format"}],"responses":{"200":{"description":"Barcode generated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"format":{"type":"string"},"text":{"type":"string"},"svg":{"type":"string","description":"SVG markup of barcode"},"bars":{"type":"integer","description":"Number of bars"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/exif-read":{"get":{"tags":["Image Utils"],"summary":"EXIF Reader","description":"Parses JPEG/TIFF EXIF metadata from base64-encoded image data or image URL. Extracts format, dimensions, file size, JFIF data, and embedded EXIF strings.","operationId":"readExif","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Base64-encoded image data or image URL"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'data'"}],"responses":{"200":{"description":"EXIF data","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"source":{"type":"string","description":"Source indicator (URL, base64, or text)"},"exif":{"type":"object","description":"Parsed EXIF metadata object"},"image_size":{"type":"integer"},"detected_type":{"type":"string","description":"Detected MIME type"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/dominant-color":{"get":{"tags":["Image Utils"],"summary":"Dominant Color","description":"Extracts dominant colors from base64 image data or image URL using k-means clustering. Returns colors as RGB values and hex codes with relative weights.","operationId":"extractDominantColors","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Base64-encoded image data or image URL"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'data'"},{"name":"count","in":"query","schema":{"type":"integer","default":5,"minimum":1,"maximum":20},"description":"Number of dominant colors to extract"}],"responses":{"200":{"description":"Dominant colors","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"source":{"type":"string"},"dominant_colors":{"type":"array","items":{"type":"object","properties":{"r":{"type":"integer"},"g":{"type":"integer"},"b":{"type":"integer"},"hex":{"type":"string"},"weight":{"type":"number","description":"Relative proportion of the color in the image"}}}},"image_size":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/color-palette":{"get":{"tags":["Image Utils"],"summary":"Color Palette","description":"Extracts a color palette from base64 image data or URL using k-means clustering. Similar to dominant colors but optimized for palette generation with configurable color count (2-32).","operationId":"extractColorPalette","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Base64-encoded image data or image URL"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'data'"},{"name":"count","in":"query","schema":{"type":"integer","default":8,"minimum":2,"maximum":32},"description":"Number of palette colors"}],"responses":{"200":{"description":"Color palette","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"source":{"type":"string"},"palette":{"type":"array","items":{"type":"object","properties":{"r":{"type":"integer"},"g":{"type":"integer"},"b":{"type":"integer"},"hex":{"type":"string"},"weight":{"type":"number"}}}},"image_size":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/image-info":{"get":{"tags":["Image Utils"],"summary":"Image Info","description":"Extracts dimensions, format, MIME type, and basic metadata from image data. Supports JPEG, PNG, GIF, BMP, and WebP formats. Accepts base64 data or image URL.","operationId":"getImageInfo","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Base64-encoded image data or image URL"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'data'"}],"responses":{"200":{"description":"Image information","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"source":{"type":"string"},"format":{"type":"string","description":"Detected image format"},"mime":{"type":"string"},"width":{"type":"integer"},"height":{"type":"integer"},"file_size":{"type":"integer"},"bits_per_pixel":{"type":"integer"},"content_type":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/format-detect":{"get":{"tags":["Image Utils"],"summary":"Format Detect","description":"Detects image/video/document format from binary headers (magic bytes). Supports JPEG, PNG, GIF, WebP, BMP, TIFF, SVG, ICO, HEIC, AVIF, and PDF. Accepts base64 data, hex bytes, or URL.","operationId":"detectImageFormat","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Base64-encoded image data, hex bytes, or image URL"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'data'"}],"responses":{"200":{"description":"Format detection results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"source":{"type":"string"},"formats":{"type":"array","items":{"type":"object","properties":{"format":{"type":"string"},"mime":{"type":"string"},"confidence":{"type":"string","enum":["high","medium"]},"extension":{"type":"string"}}}},"image_size":{"type":"integer"},"content_type":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/image-ascii":{"get":{"tags":["Image Utils"],"summary":"Image to ASCII","description":"Converts an image to ASCII art. Supports multiple character sets (standard, simple, blocks, dots, binary) and configurable output width. Accepts base64 image data or URL.","operationId":"convertImageToAscii","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Base64-encoded image data or image URL"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'data'"},{"name":"width","in":"query","schema":{"type":"integer","default":80,"minimum":20,"maximum":200},"description":"Output width in characters"},{"name":"charset","in":"query","schema":{"type":"string","enum":["standard","simple","blocks","dots","binary"],"default":"standard"},"description":"Character set for ASCII rendering"}],"responses":{"200":{"description":"ASCII art","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"source":{"type":"string"},"ascii":{"type":"string","description":"ASCII art output as multi-line string"},"width":{"type":"integer"},"height":{"type":"integer","description":"Number of rows in output"},"charset":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/grayscale":{"get":{"tags":["Image Utils"],"summary":"Grayscale Converter","description":"Analyzes an image and returns grayscale sample data using one of three methods: luminosity (ITU-R BT.601), average, or lightness. Returns per-sample RGB → gray conversions with statistics.","operationId":"convertToGrayscale","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Base64-encoded image data or image URL"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'data'"},{"name":"method","in":"query","schema":{"type":"string","enum":["luminosity","average","lightness"],"default":"luminosity"},"description":"Grayscale conversion method"}],"responses":{"200":{"description":"Grayscale analysis","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"source":{"type":"string"},"method":{"type":"string"},"samples":{"type":"integer","description":"Number of pixel samples analyzed"},"stats":{"type":"object","properties":{"min_gray":{"type":"integer"},"max_gray":{"type":"integer"},"avg_gray":{"type":"integer"},"std_dev":{"type":"integer"},"sample_ratio":{"type":"string"}}},"method_description":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/compress":{"get":{"tags":["Image Utils"],"summary":"Image Compress","description":"Analyzes byte entropy and redundancy in image data to estimate compression potential. Returns entropy score, estimated gzip ratio, and unique byte count. Accepts base64 data or image URL.","operationId":"analyzeImageCompression","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"Base64-encoded image data or image URL"},{"name":"input","in":"query","schema":{"type":"string"},"description":"Alias for 'data'"}],"responses":{"200":{"description":"Compression analysis","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"source":{"type":"string"},"image_size":{"type":"integer"},"compression":{"type":"object","properties":{"entropy":{"type":"number"},"max_possible_entropy":{"type":"number"},"compression_potential":{"type":"string"},"estimated_gzip_ratio":{"type":"string"},"unique_bytes":{"type":"integer"},"note":{"type":"string"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/web-content-extract":{"get":{"tags":["Agent Tools"],"summary":"Extract readable content from URL","description":"Fetches a URL and extracts the page title, meta description, and cleaned body text (with scripts and styles removed). Max 10,000 chars of extracted text returned.","operationId":"extractWebContent","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"},"description":"URL of the web page to extract content from"}],"responses":{"200":{"description":"Extracted content","content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"metaDescription":{"type":"string"},"contentLength":{"type":"integer","description":"Raw HTML length in bytes"},"extractedText":{"type":"string","description":"First 5000 chars of cleaned body text"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/source-link-verify":{"get":{"tags":["Agent Tools"],"summary":"Verify HTTP links in bulk","description":"Checks the accessibility of up to 20 URLs via HEAD requests. Returns HTTP status codes, content types, and redirect locations for each link. Accepts links as comma-separated string or JSON array.","operationId":"verifySourceLinks","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"links","in":"query","required":true,"schema":{"type":"string"},"description":"Comma-separated URLs or JSON array of URLs to verify (max 20)"}],"responses":{"200":{"description":"Verification results","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer"},"accessible":{"type":"integer","description":"Number of accessible links"},"broken":{"type":"integer","description":"Number of inaccessible links"},"results":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"status":{"type":"integer"},"contentType":{"type":"string"},"redirect":{"type":"string"},"accessible":{"type":"boolean"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/slides-from-markdown":{"get":{"tags":["Agent Tools"],"summary":"Convert markdown to slide deck JSON","description":"Parses markdown content and splits it into slide objects based on headings (#) and horizontal rules (---). Returns an array of slide objects each with title, content, and heading level.","operationId":"convertMarkdownToSlides","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"md","in":"query","required":true,"schema":{"type":"string"},"description":"Markdown text with headings representing slide breaks"}],"responses":{"200":{"description":"Slide deck JSON","content":{"application/json":{"schema":{"type":"object","properties":{"totalSlides":{"type":"integer"},"slides":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"content":{"type":"array","items":{"type":"string"}},"level":{"type":"integer","description":"Heading level (1-6)"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/agent-schema-gen":{"get":{"tags":["Agent Tools"],"summary":"Generate tool schema from description","description":"Generates an OpenAI-compatible function/tool call schema from a name, description, and JSON parameter definition. Returns the schema object in openai-tool-call format.","operationId":"generateAgentSchema","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"name","in":"query","required":true,"schema":{"type":"string"},"description":"Tool/function name (non-alphanumeric chars replaced with underscores)"},{"name":"description","in":"query","required":true,"schema":{"type":"string"},"description":"Description of what the tool does"},{"name":"params","in":"query","schema":{"type":"string","default":"{}"},"description":"JSON object defining parameter properties"}],"responses":{"200":{"description":"Generated schema","content":{"application/json":{"schema":{"type":"object","properties":{"schema":{"type":"object","description":"OpenAI-compatible tool schema"},"format":{"type":"string","example":"openai-tool-call"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/tool-output-fmt":{"get":{"tags":["Agent Tools"],"summary":"Format tool output as table/CSV/JSON","description":"Takes a JSON array/object and formats it as a markdown table, CSV, or re-serialized JSON. Useful for transforming tool call outputs for different contexts.","operationId":"formatToolOutput","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"data","in":"query","required":true,"schema":{"type":"string"},"description":"JSON array or object to format"},{"name":"format","in":"query","schema":{"type":"string","enum":["table","csv","json","markdown","raw"],"default":"table"},"description":"Output format"}],"responses":{"200":{"description":"Formatted output","content":{"application/json":{"schema":{"type":"object","properties":{"format":{"type":"string"},"output":{"description":"Formatted output. String for table/csv/markdown, object/array for json, raw passthrough for raw."}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/tool-call-validate":{"get":{"tags":["Agent Tools"],"summary":"Validate tool call arguments against schema","description":"Validates tool call arguments against a provided JSON schema (OpenAI tool-call format or plain JSON Schema). Reports missing required fields, unexpected fields, and argument count.","operationId":"validateToolCall","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"schema","in":"query","required":true,"schema":{"type":"string"},"description":"JSON schema (OpenAI tool-call format or plain JSON Schema)"},{"name":"arguments","in":"query","schema":{"type":"string","default":"{}"},"description":"JSON object of argument values to validate"}],"responses":{"200":{"description":"Validation result","content":{"application/json":{"schema":{"type":"object","properties":{"valid":{"type":"boolean"},"errors":{"type":"array","items":{"type":"string"},"description":"Validation error messages"},"argumentCount":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/html-to-structured":{"get":{"tags":["Agent Tools"],"summary":"Convert HTML tables/lists to structured JSON","description":"Parses HTML content and extracts <table> elements into structured JSON with headers and data rows. Accepts raw HTML string or a URL to fetch and parse.","operationId":"convertHtmlToStructured","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"html","in":"query","schema":{"type":"string"},"description":"Raw HTML content to parse (provide html or url)"},{"name":"url","in":"query","schema":{"type":"string","format":"uri"},"description":"URL to fetch HTML from (provide html or url)"}],"responses":{"200":{"description":"Structured data","content":{"application/json":{"schema":{"type":"object","properties":{"tableCount":{"type":"integer"},"tables":{"type":"array","items":{"type":"object","properties":{"headers":{"type":"array","items":{"type":"string"}},"data":{"type":"array","items":{"type":"array","items":{"type":"string"}}},"rowCount":{"type":"integer"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/gdpr-consent":{"get":{"tags":["Agent Tools"],"summary":"Check URL for GDPR consent mechanisms","description":"Scans a URL's HTML for GDPR consent indicators: cookie banners, consent management JavaScript libraries, and privacy policy links. Returns a compliance score and assessment.","operationId":"checkGdprConsent","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"},"description":"URL to check for GDPR consent mechanisms"}],"responses":{"200":{"description":"GDPR consent analysis","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"score":{"type":"string","description":"Compliance score (e.g. '2/3')"},"indicators":{"type":"object","properties":{"cookieBanner":{"type":"boolean"},"consentJS":{"type":"boolean"},"privacyLink":{"type":"boolean"}}},"assessment":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/haversine":{"get":{"tags":["Agent Tools"],"summary":"Distance between coordinates","description":"Calculates the great-circle distance between two latitude/longitude coordinate pairs using the Haversine formula. Returns distance in kilometers and miles.","operationId":"calculateHaversineDistance","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"lat1","in":"query","required":true,"schema":{"type":"number"},"description":"Latitude of first point"},{"name":"lon1","in":"query","required":true,"schema":{"type":"number"},"description":"Longitude of first point"},{"name":"lat2","in":"query","required":true,"schema":{"type":"number"},"description":"Latitude of second point"},{"name":"lon2","in":"query","required":true,"schema":{"type":"number"},"description":"Longitude of second point"}],"responses":{"200":{"description":"Distance calculation","content":{"application/json":{"schema":{"type":"object","properties":{"distanceKm":{"type":"number"},"distanceMi":{"type":"number"},"from":{"type":"string","description":"Origin coordinates as 'lat,lon'"},"to":{"type":"string","description":"Destination coordinates as 'lat,lon'"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/zip-by-coords":{"get":{"tags":["Agent Tools"],"summary":"Reverse geocode to ZIP/postal code","description":"Looks up the postal code (ZIP code), city, state, and country for a given latitude/longitude using OpenStreetMap Nominatim reverse geocoding.","operationId":"lookupZipByCoords","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number"},"description":"Latitude"},{"name":"lon","in":"query","required":true,"schema":{"type":"number"},"description":"Longitude"}],"responses":{"200":{"description":"Reverse geocode result","content":{"application/json":{"schema":{"type":"object","properties":{"zip":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"displayName":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/plus-code":{"get":{"tags":["Agent Tools"],"summary":"Convert lat/lng to Plus Code","description":"Converts between latitude/longitude coordinates and Open Location Code (Plus Code). Provide 'code' to decode to coordinates, or 'lat'+'lon' to encode to a Plus Code.","operationId":"convertPlusCode","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"code","in":"query","schema":{"type":"string"},"description":"Plus Code to decode to lat/lng (provide code OR lat+lon)"},{"name":"lat","in":"query","schema":{"type":"number"},"description":"Latitude to encode to Plus Code (provide lat+lon OR code)"},{"name":"lon","in":"query","schema":{"type":"number"},"description":"Longitude to encode to Plus Code (provide lat+lon OR code)"}],"responses":{"200":{"description":"Plus Code conversion","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"plusCode":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"type":{"type":"string","enum":["encode","decode"]}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/hashtag-analytics":{"get":{"tags":["Agent Tools"],"summary":"Analyze hashtag patterns","description":"Extracts and analyzes hashtags from text. Returns total count, unique count, and a sorted list of all hashtags with frequency counts.","operationId":"analyzeHashtags","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string"},"description":"Text containing #hashtags to analyze"}],"responses":{"200":{"description":"Hashtag analysis","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"integer","description":"Total number of hashtags found"},"unique":{"type":"integer","description":"Number of unique hashtags"},"topHashtags":{"type":"array","items":{"type":"object","properties":{"hashtag":{"type":"string"},"count":{"type":"integer"}}}},"allHashtags":{"type":"array","items":{"type":"object","properties":{"hashtag":{"type":"string"},"count":{"type":"integer"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/structured-parse":{"get":{"tags":["Agent Tools"],"summary":"Parse unstructured text into structured fields","description":"Extracts structured fields from unstructured text: detects email addresses, phone numbers, URLs, numbers, and counts words. Deduplicates extracted values.","operationId":"parseStructuredFields","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string"},"description":"Unstructured text to parse for structured fields"}],"responses":{"200":{"description":"Parsed fields","content":{"application/json":{"schema":{"type":"object","properties":{"wordCount":{"type":"integer"},"emails":{"type":"array","items":{"type":"string"}},"phones":{"type":"array","items":{"type":"string"}},"urls":{"type":"array","items":{"type":"string"}},"numbers":{"type":"array","items":{"type":"string"}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/prompt-injection":{"get":{"tags":["Agent Tools"],"summary":"Detect prompt injection attempts","description":"Scans text for common prompt injection patterns: instruction override attempts, jailbreak keywords, role-play escapes, system prompt manipulation, delimiter bypasses, and exfiltration attempts.","operationId":"detectPromptInjection","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string"},"description":"Text to scan for prompt injection patterns"}],"responses":{"200":{"description":"Injection detection results","content":{"application/json":{"schema":{"type":"object","properties":{"injectionDetected":{"type":"boolean"},"risk":{"type":"string","enum":["none","low","medium"]},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"match":{"type":"string","description":"First 80 chars of the matching text"}}}},"totalChecks":{"type":"integer"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/web-screenshot":{"get":{"tags":["VPS Browser"],"summary":"Capture screenshot of a URL (basic)","description":"Fetches the HTML content of a target URL and returns it with a screenshot proxy response. Passes through to a screenshot-api service. Returns base64-encoded image preview on success.","operationId":"webScreenshot","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","format":"uri"},"description":"Target URL to screenshot"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"screenshot_captured"},"sizeBytes":{"type":"integer","description":"Raw image byte size"},"imageBase64":{"type":"string","description":"Truncated base64 preview of the screenshot image"},"alt":{"type":"string"},"note":{"type":"string"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/pdf-from-html":{"get":{"tags":["VPS Browser"],"summary":"Convert HTML to PDF proxy","description":"Accepts inline HTML content or a URL to fetch HTML from, wraps it in a styled document, and returns the processed HTML suitable for PDF rendering. Provide 'html' parameter with raw markup or 'url' parameter to fetch from a URL.","operationId":"pdfFromHtml","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"html","in":"query","schema":{"type":"string"},"description":"Raw HTML content to convert"},{"name":"url","in":"query","schema":{"type":"string","format":"uri"},"description":"URL to fetch HTML from (alternative to inline html)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"proxy"},"note":{"type":"string","description":"PDF generation note"},"htmlLength":{"type":"integer","description":"Length of processed HTML document"},"contentPreview":{"type":"string","description":"First 500 characters of generated HTML"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/tool-orchestrator":{"get":{"tags":["VPS Browser"],"summary":"Sequential tool orchestration","description":"Executes a sequence of HTTP requests (up to 5 steps) as defined in a JSON plan array. Each step can specify method, URL, and headers. Returns results for each step including HTTP status, body length, and success indicator.","operationId":"toolOrchestrator","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"plan","in":"query","required":true,"schema":{"type":"string"},"description":"JSON array of step objects, each with url, method (optional, default GET), headers (optional), and name (optional)"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"totalSteps":{"type":"integer","description":"Number of steps in the plan"},"executed":{"type":"integer","description":"Number of steps executed"},"results":{"type":"array","items":{"type":"object","properties":{"step":{"type":"integer"},"name":{"type":"string"},"url":{"type":"string"},"status":{"type":"integer"},"bodyLength":{"type":"integer"},"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/llm-safety":{"get":{"tags":["VPS Browser"],"summary":"Content safety classification","description":"Scans input text for toxic/hateful content, sexual content, violence/gore, and PII/personal data using keyword and regex pattern matching. Returns a safety assessment with per-category findings.","operationId":"llmSafetyCheck","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string"},"description":"Text to analyze for safety concerns"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"safe":{"type":"boolean","description":"True if no categories triggered"},"riskLevel":{"type":"string","enum":["none","low","medium"],"description":"Overall risk assessment"},"categories":{"type":"object","description":"Per-category findings","properties":{"toxic":{"type":"object","properties":{"detected":{"type":"boolean"},"label":{"type":"string"},"matches":{"type":"array","items":{"type":"string"}}}},"sexual":{"type":"object","properties":{"detected":{"type":"boolean"},"label":{"type":"string"},"matches":{"type":"array","items":{"type":"string"}}}},"violent":{"type":"object","properties":{"detected":{"type":"boolean"},"label":{"type":"string"},"matches":{"type":"array","items":{"type":"string"}}}},"personal":{"type":"object","properties":{"detected":{"type":"boolean"},"label":{"type":"string"},"matches":{"type":"array","items":{"type":"string"}}}}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/ai-cache-key":{"get":{"tags":["VPS Browser"],"summary":"Generate deterministic AI cache keys","description":"Generates a deterministic cache key from LLM request parameters (prompt, model, temperature). Used for caching AI responses. Returns a prefix:model:contentHash style key with component breakdown.","operationId":"aiCacheKey","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"prompt","in":"query","required":true,"schema":{"type":"string"},"description":"Prompt text to hash into the cache key"},{"name":"model","in":"query","schema":{"type":"string","default":"default"},"description":"Model identifier"},{"name":"temperature","in":"query","schema":{"type":"string","default":"0.7"},"description":"Temperature value as string"},{"name":"extra","in":"query","schema":{"type":"string","default":""},"description":"Extra context to mix into the cache key"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"cacheKey":{"type":"string","description":"Deterministic cache key string"},"strategy":{"type":"string","description":"Key construction strategy"},"components":{"type":"object","properties":{"model":{"type":"string"},"temperature":{"type":"string"},"promptLength":{"type":"integer"}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/knowledge-base-qa":{"get":{"tags":["VPS Browser"],"summary":"Simple knowledge base Q&A","description":"Answers basic questions about the LaminarForge API using a built-in knowledge base. Matches question keywords to pre-defined answers about API keys, pricing, health, rate limits, and documentation.","operationId":"knowledgeBaseQa","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Question (alias)"},{"name":"question","in":"query","required":true,"schema":{"type":"string"},"description":"Question text to match against the knowledge base"}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","properties":{"question":{"type":"string","description":"The original question"},"answer":{"type":"string","description":"Matched answer from the knowledge base"},"matchedTier":{"type":"boolean","description":"Whether a matching answer was found"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/v1/json-flatten":{"get":{"tags":["Format Utils"],"summary":"Flatten nested JSON to dot-notation","operationId":"v1_json_flatten","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/json-unflatten":{"post":{"tags":["Format Utils"],"summary":"Unflatten dot-notation keys to nested JSON","operationId":"v1_json_unflatten","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/base-convert":{"get":{"tags":["Format Utils"],"summary":"Base32/58/62/85/64 encode and decode","operationId":"v1_base_convert","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/si-convert":{"get":{"tags":["Format Utils"],"summary":"SI / unit prefix converter","operationId":"v1_si_convert","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/percentage":{"get":{"tags":["Format Utils"],"summary":"Percentage calculator","operationId":"v1_percentage","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/temperature":{"get":{"tags":["Format Utils"],"summary":"Temperature scale converter","operationId":"v1_temperature","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/distance":{"get":{"tags":["Format Utils"],"summary":"Distance / length unit converter","operationId":"v1_distance","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/weight":{"get":{"tags":["Format Utils"],"summary":"Weight / mass unit converter","operationId":"v1_weight","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/text-diff":{"get":{"tags":["Format Utils"],"summary":"Line-by-line text diff","operationId":"v1_text_diff","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]},"post":{"tags":["Format Utils"],"summary":"Line-by-line text diff via POST","operationId":"v1_text_diff","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/bin-lookup":{"get":{"tags":["Validation Utils"],"summary":"Look up BIN/IIN information","operationId":"v1_bin_lookup","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/luhn-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate credit card via Luhn","operationId":"v1_luhn_validate","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]},"post":{"tags":["Validation Utils"],"summary":"Validate credit card via Luhn (POST)","operationId":"v1_luhn_validate","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/phone-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate phone number format","operationId":"v1_phone_validate","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/ssn-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate US SSN","operationId":"v1_ssn_validate","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/uuid-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate UUID and detect version","operationId":"v1_uuid_validate","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/semver-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate semantic version","operationId":"v1_semver_validate","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/semver-bump":{"post":{"tags":["Validation Utils"],"summary":"Bump a semantic version","operationId":"v1_semver_bump","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/mac-validate":{"get":{"tags":["Validation Utils"],"summary":"Validate MAC address and lookup vendor","operationId":"v1_mac_validate","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/card-format":{"get":{"tags":["Validation Utils"],"summary":"Format and mask credit card","operationId":"v1_card_format","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/readability":{"get":{"tags":["Text Utils"],"summary":"Flesch-Kincaid readability analysis","operationId":"v1_readability","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/token-count":{"get":{"tags":["Text Utils"],"summary":"Estimate token count for LLM models","operationId":"v1_token_count","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/chunk-text":{"get":{"tags":["Text Utils"],"summary":"Split text into chunks by word/char/sentence/paragraph","operationId":"v1_chunk_text","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]},"post":{"tags":["Text Utils"],"summary":"Split text into chunks via POST","operationId":"v1_chunk_text","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/case-tools":{"get":{"tags":["Text Utils"],"summary":"Transform text case (sentence, title, invert, alternating)","operationId":"v1_case_tools","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/unicode-inspect":{"get":{"tags":["Text Utils"],"summary":"Inspect Unicode characters and emoji","operationId":"v1_unicode_inspect","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/template-expand":{"get":{"tags":["Text Utils"],"summary":"Expand templates with variable substitution","operationId":"v1_template_expand","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/sha3":{"get":{"tags":["Security Utils"],"summary":"SHA-3 hash (224/256/384/512)","operationId":"v1_sha3","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/blake2":{"get":{"tags":["Security Utils"],"summary":"BLAKE2b hash / keyed MAC (256/512)","operationId":"v1_blake2","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/otp":{"get":{"tags":["Security Utils"],"summary":"HOTP/TOTP one-time password generator","operationId":"v1_otp","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/password-entropy":{"get":{"tags":["Security Utils"],"summary":"Password strength / entropy analysis","operationId":"v1_password_entropy","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/random-token":{"get":{"tags":["Security Utils"],"summary":"CSPRNG random token generator","operationId":"v1_random_token","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/entropy-check":{"get":{"tags":["Security Utils"],"summary":"Entropy / randomness statistical check","operationId":"v1_entropy_check","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/email-security":{"get":{"tags":["Web Intel"],"summary":"SPF/DKIM/DMARC email security records","operationId":"v1_email_security","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/caa-lookup":{"get":{"tags":["Web Intel"],"summary":"CAA record lookup (authorized CAs)","operationId":"v1_caa_lookup","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/security-headers":{"get":{"tags":["Web Intel"],"summary":"HTTP security headers analyzer (OWASP score)","operationId":"v1_security_headers","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/tech-detect":{"get":{"tags":["Web Intel"],"summary":"Website technology detection","operationId":"v1_tech_detect","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/mime-lookup":{"get":{"tags":["Web Intel"],"summary":"MIME type lookup by extension or MIME","operationId":"v1_mime_lookup","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/ssl-cipher":{"get":{"tags":["Web Intel"],"summary":"SSL/TLS version, cipher and certificate diagnostics","operationId":"v1_ssl_cipher","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/invoice-words":{"get":{"tags":["Business Utils"],"summary":"Invoice Amount to Words","operationId":"v1_invoice_words","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/cagr":{"get":{"tags":["Business Utils"],"summary":"CAGR Calculator","operationId":"v1_cagr","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/roi":{"get":{"tags":["Business Utils"],"summary":"ROI Calculator","operationId":"v1_roi","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/day-count":{"get":{"tags":["Business Utils"],"summary":"Day Count Convention","operationId":"v1_day_count","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/ratio":{"get":{"tags":["Business Utils"],"summary":"Percentage / Ratio Converter","operationId":"v1_ratio","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/geo-tools":{"get":{"tags":["Business Utils"],"summary":"Geo Distance / Bounding Box / Center / Bearing","operationId":"v1_geo_tools","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/image-resize":{"get":{"tags":["Image Utils"],"summary":"Image Resize / Resample","operationId":"v1_image_resize","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/image-to-datauri":{"get":{"tags":["Image Utils"],"summary":"Image to Base64 Data URI","operationId":"v1_image_to_datauri","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/image-caption":{"get":{"tags":["Image Utils"],"summary":"Image Caption / Meme Generator","operationId":"v1_image_caption","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/image-hash":{"get":{"tags":["Image Utils"],"summary":"Image Hash / Checksum","operationId":"v1_image_hash","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/favicon-generate":{"get":{"tags":["Image Utils"],"summary":"Favicon Generator","operationId":"v1_favicon_generate","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/content-safety":{"get":{"tags":["Agent Tools"],"summary":"LLM content safety classifier","operationId":"v1_content_safety","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/pii-redact":{"get":{"tags":["Agent Tools"],"summary":"PII redaction tool","operationId":"v1_pii_redact","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/rag-chunk":{"get":{"tags":["Agent Tools"],"summary":"RAG text chunker advanced","operationId":"v1_rag_chunk","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/schema-from-sample":{"post":{"tags":["Agent Tools"],"summary":"JSON Schema generator from sample","operationId":"v1_schema_from_sample","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/extract-structured":{"post":{"tags":["Agent Tools"],"summary":"Structured data extractor from text","operationId":"v1_extract_structured","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/code-desc":{"get":{"tags":["Agent Tools"],"summary":"Code to natural language description","operationId":"v1_code_desc","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}},"/v1/prices":{"get":{"tags":["Pricing"],"summary":"List every endpoint and its price","description":"Public, free, no key or payment needed. Returns the price of every endpoint on this service in USDC base units plus a human-readable dollar figure. Use this to decide what a call costs before calling it. The numbers here are the same ones the 402 payment challenge quotes.","operationId":"getPrices","security":[],"responses":{"200":{"description":"The full price table.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402PriceTable"}}}}}}},"/v1/keys/{hash}":{"delete":{"tags":["Platform"],"summary":"Revoke an API key","description":"Revokes an API key by marking it inactive in KV. The revoked key is rejected on next use. A caller may revoke their own key, a key that shares their owner_email, or any key if the requester is admin. Requires authentication.","operationId":"revokeApiKey","security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"},"description":"SHA-256 hash (64 hex chars) of the key to revoke, from GET /v1/keys."}],"responses":{"200":{"description":"Key revoked","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","description":"Confirmation message."},"key_hash":{"type":"string","description":"Hash of the revoked key."}}}}}},"400":{"description":"Bad request — missing key id"},"401":{"description":"Unauthorized — missing or invalid API key"},"403":{"description":"Forbidden — you do not have permission to revoke this key"},"404":{"description":"Not found — key does not exist"},"503":{"description":"Service unavailable — key storage (KV) not configured"}}}},"/v1/register":{"post":{"tags":["Format Utils","Validation Utils","Text Utils","Security Utils","Web Intel","Business Utils","Image Utils","Agent Tools"],"summary":"Register an agent, get a free API key","operationId":"v1_register","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}}},"get":{"tags":["Format Utils","Validation Utils","Text Utils","Security Utils","Web Intel","Business Utils","Image Utils","Agent Tools"],"summary":"Agent onboarding info (no key created)","operationId":"v1_register","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v1/exif-gps":{"get":{"tags":["Image Utils"],"summary":"EXIF GPS Decoder","operationId":"v1_exif_gps","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"ApiKeyAuth":[]}]}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key authentication. Provide via X-API-Key header or Authorization: Bearer <key> header."},"X402Payment":{"type":"apiKey","in":"header","name":"X-PAYMENT","description":"x402 pay-per-call payment. Send base64url(JSON) of the x402 payment payload in X-PAYMENT (or PAYMENT-SIGNATURE). No account or API key needed. Call the endpoint once without credentials and the 402 response tells you the exact price, network, asset and payTo address to pay."}},"schemas":{"ErrorResponse":{"type":"object","required":["error","message"],"properties":{"error":{"type":"boolean","example":true},"message":{"type":"string"}}},"X402PaymentRequirements":{"type":"object","description":"One way to pay for this call.","required":["scheme","network","maxAmountRequired","payTo","asset"],"properties":{"scheme":{"type":"string","enum":["exact","batch-settlement"],"description":"exact = one onchain USDC transfer per call, no setup. batch-settlement = open a channel once, then pay per call with signed vouchers that are batched into far fewer onchain transfers."},"network":{"type":"string","example":"eip155:8453","description":"CAIP-2 network id. eip155:8453 is Base mainnet."},"maxAmountRequired":{"type":"string","example":"2000","description":"Price in USDC base units (6 decimals). 2000 = $0.002."},"resource":{"type":"string","description":"The endpoint this payment buys."},"description":{"type":"string","description":"Human-readable price line."},"mimeType":{"type":"string","example":"application/json"},"payTo":{"type":"string","description":"EVM address that receives the USDC."},"maxTimeoutSeconds":{"type":"integer","example":600,"description":"How long the payment authorisation stays valid."},"asset":{"type":"string","description":"USDC contract address on this network."},"extra":{"type":"object","description":"Scheme-specific fields. batch-settlement includes receiverAuthorizer and delegatedRefund.","properties":{"name":{"type":"string"},"version":{"type":"string"},"receiverAuthorizer":{"type":"string","description":"Facilitator authorizer address for batch-settlement channels."},"delegatedRefund":{"type":"boolean"}}}}},"X402Challenge":{"type":"object","description":"The 402 body. Machine-readable: everything needed to pay is here.","properties":{"x402Version":{"type":"integer","example":2},"error":{"type":"string","example":"Payment required"},"accepts":{"type":"array","description":"Every payment option for this endpoint, cheapest-to-start first.","items":{"$ref":"#/components/schemas/X402PaymentRequirements"}},"discoverable":{"type":"boolean"},"body_format":{"type":"object","properties":{"input":{"type":"string","enum":["query","json"]}}}}},"X402PriceEntry":{"type":"object","properties":{"amount":{"type":"string","example":"2000","description":"USDC base units."},"usd":{"type":"string","example":"$0.002"},"tier":{"type":"string","enum":["standard","heavy"]}}},"X402PriceTable":{"type":"object","description":"Every endpoint on this worker with its price. Same numbers the 402 challenge quotes.","properties":{"currency":{"type":"string","example":"USDC"},"network":{"type":"string","example":"eip155:8453"},"settlement":{"type":"string","description":"Facilitator base URL."},"pay_to":{"type":"string","description":"EVM address receiving payment."},"price_table":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/X402PriceEntry"}}}}},"responses":{"BadRequest":{"description":"Bad request — missing or invalid parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"PaymentRequired":{"description":"Payment required. The body lists every payment option accepted for this endpoint. Pay one of them and retry with the X-PAYMENT header.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/X402Challenge"}}}}}}}