{
    "ok": true,
    "name": "Digital Greenhouse free tools API",
    "version": "1.0",
    "description": "Free, keyless JSON endpoints for the tools at https://digitalgreenhouse.com.au/tools, made for AI agents and scripts to check their work or look something up. Same maths as the tool pages.",
    "how_to_call": [
        "GET https://digitalgreenhouse.com.au/api/tools/{slug}?param=value — or POST the same params as JSON or form data (use POST for long or sensitive text).",
        "Every response is JSON: {ok, tool, input, result, summary, notes, page}. \"summary\" is one plain-English sentence you can quote.",
        "Add format=text for plain text instead of JSON.",
        "Errors return ok:false with error.code, error.message, error.param and a usage line, with HTTP 400 (bad input), 405, 413, 429 (rate limit, see Retry-After) or 502/503."
    ],
    "fair_use": "No key and no sign-up. Per-IP limits: calculators and converters 120 requests a minute (shared), dns-lookup 20, mx-email-check 6. Please cache answers rather than repeating identical calls.",
    "privacy": "Requests are processed on our server in Australia and the inputs are not stored. Standard web-server access logs record request URLs, so send anything sensitive by POST. The tool pages themselves run in the browser and send nothing.",
    "terms": "Provided as is, for general information only — not financial, tax, legal or medical advice.",
    "docs": "https://digitalgreenhouse.com.au/tools/api",
    "openapi": "https://digitalgreenhouse.com.au/api/tools/openapi.json",
    "contact": "https://digitalgreenhouse.com.au/contact",
    "tools": [
        {
            "slug": "gst-calculator",
            "title": "GST Calculator (Australia)",
            "category": "Australian business",
            "description": "Add Australia's 10% GST to a price, or work out the GST already included in a total.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/gst-calculator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "amount": {
                    "type": "number",
                    "required": true,
                    "description": "The amount in AUD. \"$1,100\" style input is accepted."
                },
                "mode": {
                    "type": "string",
                    "required": false,
                    "default": "add",
                    "enum": [
                        "add",
                        "remove"
                    ],
                    "description": "add = the amount excludes GST; remove = the amount already includes GST."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/gst-calculator?amount=110&mode=remove",
            "page": "https://digitalgreenhouse.com.au/tools/gst-calculator"
        },
        {
            "slug": "abn-validator",
            "title": "ABN / ACN Validator",
            "category": "Australian business",
            "description": "Check an Australian Business Number (11 digits) or Australian Company Number (9 digits) against its official checksum. Spaces and punctuation are ignored.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/abn-validator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "number": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "abn",
                        "acn"
                    ],
                    "description": "The ABN or ACN."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/abn-validator?number=51824753556",
            "page": "https://digitalgreenhouse.com.au/tools/abn-validator"
        },
        {
            "slug": "invoice-due-date",
            "title": "Invoice Due-Date Calculator (Australia)",
            "category": "Australian business",
            "description": "The due date for an invoice from its payment terms (net days, days after end of month, a day of the following month, business days, or on receipt), moved off weekends and Australian public holidays for the chosen state or territory. Only full-day statewide public holidays count.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/invoice-due-date",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "date": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "invoice_date"
                    ],
                    "description": "Invoice date, YYYY-MM-DD."
                },
                "terms": {
                    "type": "string",
                    "required": false,
                    "default": "net",
                    "enum": [
                        "net",
                        "eom",
                        "following",
                        "business",
                        "receipt"
                    ],
                    "description": "net = days after the invoice date; eom = days after the end of the invoice month; following = a day of the following month (set day); business = business days after the invoice date; receipt = due on the invoice date."
                },
                "days": {
                    "type": "integer",
                    "required": false,
                    "default": 30,
                    "min": 0,
                    "max": 365,
                    "description": "Number of days for net, eom and business terms."
                },
                "day": {
                    "type": "integer",
                    "required": false,
                    "default": 20,
                    "min": 1,
                    "max": 31,
                    "description": "Day of the following month for \"following\" terms (clamped to the month's length)."
                },
                "state": {
                    "type": "string",
                    "required": false,
                    "default": "nsw",
                    "enum": [
                        "nsw",
                        "vic",
                        "qld",
                        "wa",
                        "sa",
                        "tas",
                        "act",
                        "nt",
                        "national"
                    ],
                    "description": "Whose public holidays to skip: nsw, vic, qld, wa, sa, tas, act, nt, or national (only the holidays every state shares)."
                },
                "roll": {
                    "type": "string",
                    "required": false,
                    "default": "next",
                    "enum": [
                        "next",
                        "previous",
                        "none"
                    ],
                    "description": "If the due date lands on a weekend or public holiday: move to the next business day, the previous one, or leave it."
                },
                "holidays": {
                    "type": "boolean",
                    "required": false,
                    "default": true,
                    "description": "false = skip weekends only."
                },
                "today": {
                    "type": "string",
                    "required": false,
                    "aliases": [
                        "on"
                    ],
                    "description": "Date to count \"days from today\" from, YYYY-MM-DD. Defaults to today in Australia/Sydney."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/invoice-due-date?date=2026-11-27&terms=net",
            "page": "https://digitalgreenhouse.com.au/tools/invoice-due-date"
        },
        {
            "slug": "dns-lookup",
            "title": "DNS Record Lookup",
            "category": "Domain, DNS & network",
            "description": "Live A, AAAA, CNAME, MX, TXT, NS, SOA and CAA records for a domain, with plain-English notes and the DNSSEC status. Resolved over DNS-over-HTTPS (Cloudflare, falling back to Google).",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/dns-lookup",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "domain": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "d",
                        "name"
                    ],
                    "description": "Domain name. A URL or email address also works; the host part is used."
                },
                "type": {
                    "type": "string",
                    "required": false,
                    "default": "all",
                    "description": "Record type(s), comma-separated: A, AAAA, CNAME, MX, TXT, NS, SOA, CAA, or all."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/dns-lookup?domain=digitalgreenhouse.com.au&type=MX%2CTXT",
            "page": "https://digitalgreenhouse.com.au/tools/dns-lookup"
        },
        {
            "slug": "whois-lookup",
            "title": "WHOIS / RDAP Domain Lookup",
            "category": "Domain, DNS & network",
            "description": "Who a domain is registered with, when it was registered and expires, its status codes in plain English, nameservers and DNSSEC, straight from the registry over RDAP (the modern replacement for WHOIS). .au domains also show the registrant and eligibility the .au registry publishes. A 404-style \"registered\": false means the registry has no such domain. One domain per request; registries do not allow bulk harvesting.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/whois-lookup",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "domain": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "d",
                        "name"
                    ],
                    "description": "Domain name. A URL, email address or subdomain also works; the registered domain is looked up."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/whois-lookup?domain=digitalgreenhouse.com.au",
            "page": "https://digitalgreenhouse.com.au/tools/whois-lookup"
        },
        {
            "slug": "mx-email-check",
            "title": "MX & Email Setup Check",
            "category": "Domain, DNS & network",
            "description": "Checks a domain's email setup: MX servers (and whether they resolve), SPF (following every include and counting DNS lookups against the limit of 10), DKIM under 23 common selectors (or yours) with RSA key length, and DMARC policy. Returns a verdict and a plain-English list of what to fix, with copy-paste records.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/mx-email-check",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "domain": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "d"
                    ],
                    "description": "Domain name. A URL or email address also works."
                },
                "selector": {
                    "type": "string",
                    "required": false,
                    "aliases": [
                        "s"
                    ],
                    "description": "Optional DKIM selector to check as well as the common ones (the s= value in a DKIM-Signature header)."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/mx-email-check?domain=digitalgreenhouse.com.au&selector=selector1",
            "page": "https://digitalgreenhouse.com.au/tools/mx-email-check"
        },
        {
            "slug": "subnet-calculator",
            "title": "Subnet / CIDR Calculator",
            "category": "Domain, DNS & network",
            "description": "Network, broadcast, netmask, wildcard, host range and usable host count for an IPv4 CIDR block.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/subnet-calculator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "cidr": {
                    "type": "string",
                    "required": true,
                    "description": "IPv4 address with prefix length."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/subnet-calculator?cidr=192.168.10.37%2F26",
            "page": "https://digitalgreenhouse.com.au/tools/subnet-calculator"
        },
        {
            "slug": "whats-my-ip",
            "title": "What's My IP",
            "category": "Domain, DNS & network",
            "description": "The public IP address the request came from, and its reverse DNS name. Called by an agent, this is the agent's own server address.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/whats-my-ip",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {},
            "example": "https://digitalgreenhouse.com.au/api/tools/whats-my-ip",
            "page": "https://digitalgreenhouse.com.au/tools/whats-my-ip"
        },
        {
            "slug": "percentage-calculator",
            "title": "Percentage Calculator",
            "category": "Everyday & calculators",
            "description": "From two numbers x and y: x% of y, x as a percentage of y, and the percentage change from x to y.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/percentage-calculator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "x": {
                    "type": "number",
                    "required": true,
                    "description": "First number."
                },
                "y": {
                    "type": "number",
                    "required": true,
                    "description": "Second number."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/percentage-calculator?x=15&y=80",
            "page": "https://digitalgreenhouse.com.au/tools/percentage-calculator"
        },
        {
            "slug": "discount-calculator",
            "title": "Discount / Sale Price",
            "category": "Everyday & calculators",
            "description": "Sale price and saving after a percentage discount, with an optional stacked \"extra % off\".",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/discount-calculator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "price": {
                    "type": "number",
                    "required": true,
                    "min": 0,
                    "description": "Original price."
                },
                "discount": {
                    "type": "number",
                    "required": true,
                    "min": 0,
                    "max": 100,
                    "description": "Percentage off."
                },
                "extra": {
                    "type": "number",
                    "required": false,
                    "min": 0,
                    "max": 100,
                    "description": "Optional further percentage off the already-reduced price."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/discount-calculator?price=249.95&discount=30",
            "page": "https://digitalgreenhouse.com.au/tools/discount-calculator"
        },
        {
            "slug": "loan-calculator",
            "title": "Loan Repayment Calculator",
            "category": "Everyday & calculators",
            "description": "Monthly repayment, total repaid and total interest for a fixed-rate loan (standard amortisation, monthly compounding).",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/loan-calculator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "amount": {
                    "type": "number",
                    "required": true,
                    "min": 0.01,
                    "aliases": [
                        "principal"
                    ],
                    "description": "Amount borrowed."
                },
                "rate": {
                    "type": "number",
                    "required": true,
                    "min": 0,
                    "max": 100,
                    "description": "Annual interest rate in percent."
                },
                "years": {
                    "type": "number",
                    "required": true,
                    "min": 0.08,
                    "max": 50,
                    "aliases": [
                        "term"
                    ],
                    "description": "Loan term in years (decimals allowed)."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/loan-calculator?amount=35000&rate=8.5&years=5",
            "page": "https://digitalgreenhouse.com.au/tools/loan-calculator"
        },
        {
            "slug": "bill-splitter",
            "title": "Bill Splitter & Tip",
            "category": "Everyday & calculators",
            "description": "Split a bill between people, with an optional tip percentage. Each share is rounded up to the cent.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/bill-splitter",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "total": {
                    "type": "number",
                    "required": true,
                    "min": 0,
                    "aliases": [
                        "amount",
                        "bill"
                    ],
                    "description": "Bill total."
                },
                "people": {
                    "type": "integer",
                    "required": true,
                    "min": 1,
                    "max": 1000,
                    "description": "Number of people."
                },
                "tip": {
                    "type": "number",
                    "required": false,
                    "default": 0,
                    "min": 0,
                    "max": 100,
                    "description": "Tip percentage."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/bill-splitter?total=187.40&people=4",
            "page": "https://digitalgreenhouse.com.au/tools/bill-splitter"
        },
        {
            "slug": "bmi-calculator",
            "title": "BMI Calculator",
            "category": "Everyday & calculators",
            "description": "Body Mass Index and its standard category, from metric or imperial measurements. Screening number only, not medical advice.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/bmi-calculator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "weight_kg": {
                    "type": "number",
                    "required": false,
                    "min": 0,
                    "description": "Weight in kilograms (metric)."
                },
                "height_cm": {
                    "type": "number",
                    "required": false,
                    "min": 0,
                    "description": "Height in centimetres (metric)."
                },
                "weight_lb": {
                    "type": "number",
                    "required": false,
                    "min": 0,
                    "description": "Weight in pounds (imperial)."
                },
                "height_ft": {
                    "type": "number",
                    "required": false,
                    "min": 0,
                    "description": "Height, feet part (imperial)."
                },
                "height_in": {
                    "type": "number",
                    "required": false,
                    "min": 0,
                    "description": "Height, inches part (imperial)."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/bmi-calculator?weight_kg=72&height_cm=178",
            "page": "https://digitalgreenhouse.com.au/tools/bmi-calculator"
        },
        {
            "slug": "age-calculator",
            "title": "Age Calculator",
            "category": "Everyday & calculators",
            "description": "Exact age in years, months and days on a date (default today in Sydney), plus totals and days until the next birthday. Also works as a date-difference calculator.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/age-calculator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "dob": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "from",
                        "birthdate"
                    ],
                    "description": "Date of birth (or start date), YYYY-MM-DD."
                },
                "on": {
                    "type": "string",
                    "required": false,
                    "aliases": [
                        "to"
                    ],
                    "description": "Date to measure to, YYYY-MM-DD. Defaults to today in Australia/Sydney."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/age-calculator?dob=1990-02-28&on=2026-10-02",
            "page": "https://digitalgreenhouse.com.au/tools/age-calculator"
        },
        {
            "slug": "unit-converter",
            "title": "Unit Converter",
            "category": "Everyday & calculators",
            "description": "Convert length, weight, volume (US measures), area, speed and temperature. Units: m km cm mm mi yd ft in · kg g mg t lb oz st · L mL gal qt pt cup floz · m2 km2 ha ft2 acre · m/s km/h mph kn · C F K (common names like \"pounds\" or \"celsius\" also work).",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/unit-converter",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "value": {
                    "type": "number",
                    "required": true,
                    "description": "The number to convert."
                },
                "from": {
                    "type": "string",
                    "required": true,
                    "description": "Unit to convert from."
                },
                "to": {
                    "type": "string",
                    "required": true,
                    "description": "Unit to convert to."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/unit-converter?value=26.2&from=mi&to=km",
            "page": "https://digitalgreenhouse.com.au/tools/unit-converter"
        },
        {
            "slug": "epoch-converter",
            "title": "Unix Timestamp Converter",
            "category": "Encoders & converters",
            "description": "Convert a Unix timestamp (seconds or milliseconds) to UTC, ISO 8601 and Sydney time (AEST/AEDT), or a date to a timestamp. With neither, returns the current time.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/epoch-converter",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "timestamp": {
                    "type": "string",
                    "required": false,
                    "aliases": [
                        "ts"
                    ],
                    "description": "Unix timestamp in seconds or milliseconds."
                },
                "unit": {
                    "type": "string",
                    "required": false,
                    "default": "auto",
                    "enum": [
                        "auto",
                        "s",
                        "ms"
                    ],
                    "description": "auto treats 13+ digits as milliseconds."
                },
                "date": {
                    "type": "string",
                    "required": false,
                    "description": "A date/time to convert to a timestamp, ideally ISO 8601 (2026-10-02T09:30:00+10:00). Without an offset it is read in tz."
                },
                "tz": {
                    "type": "string",
                    "required": false,
                    "default": "Australia/Sydney",
                    "description": "IANA time zone for reading \"date\" and for an extra local-time view, e.g. Australia/Perth."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/epoch-converter?timestamp=1759363200",
            "page": "https://digitalgreenhouse.com.au/tools/epoch-converter"
        },
        {
            "slug": "base64",
            "title": "Base64 Encode / Decode",
            "category": "Encoders & converters",
            "description": "Encode UTF-8 text to Base64, or decode Base64 (standard or URL-safe) back to text. Binary results come back as hex.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/base64",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "Text to encode, or Base64 to decode."
                },
                "mode": {
                    "type": "string",
                    "required": false,
                    "default": "encode",
                    "enum": [
                        "encode",
                        "decode"
                    ],
                    "description": "encode or decode."
                },
                "urlsafe": {
                    "type": "boolean",
                    "required": false,
                    "default": false,
                    "description": "Use the URL-safe alphabet (- and _, no padding)."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/base64?text=Hello%2C%20Sydney%21&mode=encode",
            "page": "https://digitalgreenhouse.com.au/tools/base64"
        },
        {
            "slug": "url-encode",
            "title": "URL Encode / Decode",
            "category": "Encoders & converters",
            "description": "Percent-encode or decode text with exactly the rules of JavaScript's encodeURIComponent/decodeURIComponent (scope=component) or encodeURI/decodeURI (scope=full).",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/url-encode",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "Text to encode or decode."
                },
                "mode": {
                    "type": "string",
                    "required": false,
                    "default": "encode",
                    "enum": [
                        "encode",
                        "decode"
                    ],
                    "description": "encode or decode."
                },
                "scope": {
                    "type": "string",
                    "required": false,
                    "default": "component",
                    "enum": [
                        "component",
                        "full"
                    ],
                    "description": "component = one query value or path segment; full = a whole URL."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/url-encode?text=caf%C3%A9%20%26%20cake%3F&mode=encode",
            "page": "https://digitalgreenhouse.com.au/tools/url-encode"
        },
        {
            "slug": "html-entity",
            "title": "HTML Entity Encoder",
            "category": "Encoders & converters",
            "description": "Escape & < > \" ' as HTML entities (optionally every non-ASCII character too), or decode entities back to text.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/html-entity",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "Text to encode, or HTML with entities to decode."
                },
                "mode": {
                    "type": "string",
                    "required": false,
                    "default": "encode",
                    "enum": [
                        "encode",
                        "decode"
                    ],
                    "description": "encode or decode."
                },
                "all": {
                    "type": "boolean",
                    "required": false,
                    "default": false,
                    "description": "When encoding, also turn non-ASCII characters into numeric entities."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/html-entity?text=%3Ca%20href%3D%22x%22%3ETom%20%26%20Jerry%3C%2Fa%3E",
            "page": "https://digitalgreenhouse.com.au/tools/html-entity"
        },
        {
            "slug": "morse-code",
            "title": "Morse Code Translator",
            "category": "Encoders & converters",
            "description": "Translate text to International Morse code (ITU-R M.1677-1) or Morse back to text, with how long it takes to send at a given speed. Morse output separates letters with a space and words with \" / \"; input also accepts | or three spaces between words, and · − for dots and dashes. Prosigns go in angle brackets, e.g. <SOS>.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/morse-code",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "Text to encode, or Morse code to decode."
                },
                "mode": {
                    "type": "string",
                    "required": false,
                    "default": "auto",
                    "enum": [
                        "auto",
                        "encode",
                        "decode"
                    ],
                    "description": "auto decodes when the input is only dots, dashes and separators, and encodes anything else."
                },
                "wpm": {
                    "type": "integer",
                    "required": false,
                    "default": 20,
                    "min": 5,
                    "max": 60,
                    "description": "Character speed in words per minute (PARIS standard), used for the timing."
                },
                "farnsworth": {
                    "type": "integer",
                    "required": false,
                    "min": 3,
                    "max": 60,
                    "description": "Optional slower overall speed in wpm: letters stay at wpm and the gaps stretch (Farnsworth spacing)."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/morse-code?text=SOS%2C%20send%20help",
            "page": "https://digitalgreenhouse.com.au/tools/morse-code"
        },
        {
            "slug": "slugify",
            "title": "Slugify (URL Slug)",
            "category": "Encoders & converters",
            "description": "Turn a title into a clean URL slug: accents stripped, anything that is not a letter or digit becomes the separator.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/slugify",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "The title or text."
                },
                "separator": {
                    "type": "string",
                    "required": false,
                    "default": "-",
                    "enum": [
                        "-",
                        "_"
                    ],
                    "description": "Hyphen or underscore."
                },
                "lowercase": {
                    "type": "boolean",
                    "required": false,
                    "default": true,
                    "description": "Lower-case the slug."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/slugify?text=Cr%C3%A8me%20br%C3%BBl%C3%A9e%3A%205%20tips%20for%202026%21",
            "page": "https://digitalgreenhouse.com.au/tools/slugify"
        },
        {
            "slug": "text-case-converter",
            "title": "Text Case Converter",
            "category": "Encoders & converters",
            "description": "Convert text to lowercase, UPPERCASE, Title Case, Sentence case, camelCase, PascalCase, snake_case, kebab-case or CONSTANT_CASE. Splits words on spaces, - _ and camel humps.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/text-case-converter",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "The text."
                },
                "case": {
                    "type": "string",
                    "required": false,
                    "default": "all",
                    "enum": [
                        "all",
                        "lower",
                        "upper",
                        "title",
                        "sentence",
                        "camel",
                        "pascal",
                        "snake",
                        "kebab",
                        "constant"
                    ],
                    "description": "One case, or all of them."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/text-case-converter?text=customer%20invoice%20ID&case=camel",
            "page": "https://digitalgreenhouse.com.au/tools/text-case-converter"
        },
        {
            "slug": "json-formatter",
            "title": "JSON Formatter & Validator",
            "category": "Encoders & converters",
            "description": "Validate JSON and point to the first error by line and column, or pretty-print / minify it. Send large documents as a POST body.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/json-formatter",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "The JSON text."
                },
                "mode": {
                    "type": "string",
                    "required": false,
                    "default": "validate",
                    "enum": [
                        "validate",
                        "format",
                        "minify"
                    ],
                    "description": "validate only, or also return formatted/minified output."
                },
                "indent": {
                    "type": "string",
                    "required": false,
                    "default": "2",
                    "enum": [
                        "2",
                        "4",
                        "tab"
                    ],
                    "description": "Indent for mode=format."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/json-formatter?text=%7B%22name%22%3A%20%22DG%22%2C%20%22tools%22%3A%2032%2C%7D",
            "page": "https://digitalgreenhouse.com.au/tools/json-formatter"
        },
        {
            "slug": "jwt-decoder",
            "title": "JWT Decoder",
            "category": "Encoders & converters",
            "description": "Decode a JSON Web Token's header and payload and report expiry (exp), not-before (nbf) and issued-at (iat). The signature is NOT verified. POST only, so tokens never appear in URLs or server logs.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/jwt-decoder",
            "methods": [
                "POST"
            ],
            "params": {
                "token": {
                    "type": "string",
                    "required": true,
                    "description": "The JWT (header.payload.signature)."
                }
            },
            "example": null,
            "page": "https://digitalgreenhouse.com.au/tools/jwt-decoder"
        },
        {
            "slug": "hash-generator",
            "title": "Hash Generator",
            "category": "Encoders & converters",
            "description": "MD5, SHA-1, SHA-256, SHA-384 and SHA-512 of text (as UTF-8 bytes) or of hex/Base64 bytes, with an optional check against an expected hash. Use POST for anything sensitive.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/hash-generator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "The input."
                },
                "algorithm": {
                    "type": "string",
                    "required": false,
                    "default": "all",
                    "enum": [
                        "all",
                        "md5",
                        "sha1",
                        "sha256",
                        "sha384",
                        "sha512"
                    ],
                    "description": "One algorithm, or all."
                },
                "input_encoding": {
                    "type": "string",
                    "required": false,
                    "default": "text",
                    "enum": [
                        "text",
                        "hex",
                        "base64"
                    ],
                    "description": "How \"text\" is encoded: text = UTF-8 string; hex or base64 = raw bytes."
                },
                "expect": {
                    "type": "string",
                    "required": false,
                    "description": "Optional expected hash (hex) to compare against."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/hash-generator?text=hello&algorithm=sha256",
            "page": "https://digitalgreenhouse.com.au/tools/hash-generator"
        },
        {
            "slug": "uuid-generator",
            "title": "UUID / ULID Generator",
            "category": "Encoders & converters",
            "description": "Generate random UUID v4, time-ordered UUID v7, or ULIDs, up to 100 at a time.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/uuid-generator",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "version": {
                    "type": "string",
                    "required": false,
                    "default": "v4",
                    "enum": [
                        "v4",
                        "v7",
                        "ulid"
                    ],
                    "aliases": [
                        "type"
                    ],
                    "description": "v4, v7 or ulid."
                },
                "count": {
                    "type": "integer",
                    "required": false,
                    "default": 1,
                    "min": 1,
                    "max": 100,
                    "description": "How many."
                },
                "uppercase": {
                    "type": "boolean",
                    "required": false,
                    "default": false,
                    "description": "Upper-case UUIDs (ULIDs are always upper-case)."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/uuid-generator",
            "page": "https://digitalgreenhouse.com.au/tools/uuid-generator"
        },
        {
            "slug": "word-counter",
            "title": "Word & Character Counter",
            "category": "Text & generators",
            "description": "Words, characters (with and without spaces), UTF-8 bytes, sentences, paragraphs, and reading/speaking time. Send long text as a POST body.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/word-counter",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "text": {
                    "type": "string",
                    "required": true,
                    "description": "The text to count."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/word-counter?text=Short%20and%20sweet.%20Two%20sentences%21",
            "page": "https://digitalgreenhouse.com.au/tools/word-counter"
        },
        {
            "slug": "color-converter",
            "title": "Colour Converter",
            "category": "Design & colour",
            "description": "Convert a colour between HEX, RGB and HSL.",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/color-converter",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "color": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "colour",
                        "c"
                    ],
                    "description": "HEX (#0E5C3A or 0E5C3A or #abc), rgb(14, 92, 58) or hsl(155, 74%, 21%)."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/color-converter?color=%230E5C3A",
            "page": "https://digitalgreenhouse.com.au/tools/color-converter"
        },
        {
            "slug": "contrast-checker",
            "title": "WCAG Contrast Checker",
            "category": "Design & colour",
            "description": "Contrast ratio between a text colour and a background colour, with pass/fail for WCAG 2.x AA and AAA (normal text, large text, UI components).",
            "endpoint": "https://digitalgreenhouse.com.au/api/tools/contrast-checker",
            "methods": [
                "GET",
                "POST"
            ],
            "params": {
                "fg": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "foreground",
                        "text"
                    ],
                    "description": "Text (foreground) colour: HEX, rgb() or hsl()."
                },
                "bg": {
                    "type": "string",
                    "required": true,
                    "aliases": [
                        "background"
                    ],
                    "description": "Background colour: HEX, rgb() or hsl()."
                }
            },
            "example": "https://digitalgreenhouse.com.au/api/tools/contrast-checker?fg=%23767676&bg=%23FFFFFF",
            "page": "https://digitalgreenhouse.com.au/tools/contrast-checker"
        }
    ],
    "browser_only": [
        {
            "slug": "password-generator",
            "page": "https://digitalgreenhouse.com.au/tools/password-generator",
            "instead": "Generate passwords on your own system with a cryptographically secure random generator. Never ask a remote server, including this one, for a password."
        },
        {
            "slug": "pwned-password",
            "page": "https://digitalgreenhouse.com.au/tools/pwned-password",
            "instead": "Call Have I Been Pwned's Pwned Passwords range API directly: SHA-1 the password, send only the first 5 hex characters to https://api.pwnedpasswords.com/range/{first5}, and look for the remaining 35 in the response. Never send a password to us."
        },
        {
            "slug": "palette-generator",
            "page": "https://digitalgreenhouse.com.au/tools/palette-generator",
            "instead": "Browser only for now. Open /tools/palette-generator#?c=0E5C3A (the colour in the hash) in a browser-capable agent."
        },
        {
            "slug": "meta-toolkit",
            "page": "https://digitalgreenhouse.com.au/tools/meta-toolkit",
            "instead": "Browser only for now (title, description and Open Graph tags with previews, and an audit of pasted page source)."
        },
        {
            "slug": "transparency-checker",
            "page": "https://digitalgreenhouse.com.au/tools/transparency-checker",
            "instead": "Needs the image's pixels, so it runs in the browser only."
        },
        {
            "slug": "workout-timer",
            "page": "https://digitalgreenhouse.com.au/tools/workout-timer",
            "instead": "An interactive timer; not useful as an API."
        },
        {
            "slug": "rain-screen",
            "page": "https://digitalgreenhouse.com.au/tools/rain-screen",
            "instead": "A full-screen animation to watch; not useful as an API."
        },
        {
            "slug": "fireplace",
            "page": "https://digitalgreenhouse.com.au/tools/fireplace",
            "instead": "A full-screen animation to watch; not useful as an API."
        },
        {
            "slug": "snow-screen",
            "page": "https://digitalgreenhouse.com.au/tools/snow-screen",
            "instead": "A full-screen animation to watch; not useful as an API."
        },
        {
            "slug": "ice-skating-screen",
            "page": "https://digitalgreenhouse.com.au/tools/ice-skating-screen",
            "instead": "A full-screen animation with generated music; not useful as an API."
        },
        {
            "slug": "new-york-night-screen",
            "page": "https://digitalgreenhouse.com.au/tools/new-york-night-screen",
            "instead": "A full-screen animation with generated music; not useful as an API."
        },
        {
            "slug": "reel-to-reel",
            "page": "https://digitalgreenhouse.com.au/tools/reel-to-reel",
            "instead": "A full-screen animation with generated music; not useful as an API."
        },
        {
            "slug": "piano-keyboard",
            "page": "https://digitalgreenhouse.com.au/tools/piano-keyboard",
            "instead": "An instrument you play; not useful as an API."
        }
    ]
}
