{
  "schemaVersion": 1,
  "catalogCount": 196,
  "catalogPath": "/Public-API/",
  "requestLabPattern": "/Public-API/#/request-lab?api={api-id}",
  "health": "not-included",
  "automatedVerificationDefault": {
    "mode": "enabled"
  },
  "apis": [
    {
      "id": "countries",
      "name": "Country Explorer",
      "provider": "World Bank",
      "category": "Data",
      "description": "Look up country metadata, capital cities, regions, and income groups.",
      "documentationUrl": "https://datahelpdesk.worldbank.org/knowledgebase/articles/898590-country-api-queries",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=countries",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "code",
          "label": "Country code",
          "type": "text",
          "defaultValue": "SGP",
          "help": "Use an ISO 3166-1 alpha-2 or alpha-3 country code such as SG or SGP.",
          "minLength": 2,
          "maxLength": 3,
          "pattern": "[A-Za-z]{2,3}",
          "patternDescription": "must contain exactly two or three letters for an ISO 3166-1 alpha-2 or alpha-3 country code."
        }
      ]
    },
    {
      "id": "weather",
      "name": "Live Weather",
      "provider": "Open-Meteo",
      "category": "Utility",
      "description": "Fetch current conditions for any latitude and longitude—no API key required.",
      "documentationUrl": "https://open-meteo.com/en/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=weather",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        }
      ]
    },
    {
      "id": "people",
      "name": "People Generator",
      "provider": "Random User",
      "category": "People",
      "description": "Generate realistic placeholder profiles for prototypes, tests, and demos.",
      "documentationUrl": "https://randomuser.me/documentation",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=people",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Synthetic test data for prototypes and demos. The primary semantic card intentionally avoids generated contact, credential, street-address, and national-ID-like fields; review Random User copyright/UI Faces guidance before redistributing portraits.",
      "parameters": [
        {
          "id": "count",
          "label": "Profiles",
          "type": "number",
          "defaultValue": "3",
          "help": "Generate between 1 and 10 synthetic test profiles.",
          "min": 1,
          "max": 10,
          "step": 1
        },
        {
          "id": "nationality",
          "label": "Nationality",
          "type": "select",
          "defaultValue": "au",
          "help": "Limit results to one nationality.",
          "options": [
            {
              "label": "Australia",
              "value": "au"
            },
            {
              "label": "Canada",
              "value": "ca"
            },
            {
              "label": "France",
              "value": "fr"
            },
            {
              "label": "United Kingdom",
              "value": "gb"
            },
            {
              "label": "United States",
              "value": "us"
            }
          ]
        }
      ]
    },
    {
      "id": "dogs",
      "name": "Dog Gallery",
      "provider": "Dog CEO",
      "category": "Nature",
      "description": "Bring a little joy to a prototype with random dog photography.",
      "documentationUrl": "https://dog.ceo/dog-api/documentation/random",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=dogs",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Keep request frequency bounded and respect Dog CEO hosting. Dog CEO identifies the Stanford Dogs Dataset as the original source and describes the collection as open source, but the API or repository code licence does not establish reuse rights for each photo; verify image rights before reuse.",
      "parameters": [
        {
          "id": "count",
          "label": "Photos",
          "type": "number",
          "defaultValue": "4",
          "help": "Request between 1 and 10 image URLs.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "posts",
      "name": "Post Sandbox",
      "provider": "JSONPlaceholder",
      "category": "Data",
      "description": "Prototype content views with predictable fake REST data.",
      "documentationUrl": "https://jsonplaceholder.typicode.com/guide/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=posts",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "postId",
          "label": "Post ID",
          "type": "number",
          "defaultValue": "7",
          "help": "Choose a post from 1 to 100.",
          "min": 1,
          "max": 100,
          "step": 1
        }
      ]
    },
    {
      "id": "holidays",
      "name": "Holiday Calendar",
      "provider": "Nager.Holidays",
      "category": "Utility",
      "description": "Plan with the current Nager.Holidays Community API holiday calendar by country and year.",
      "documentationUrl": "https://nagerholidays.com/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=holidays",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses the browser-ready Nager.Holidays Community API v4. The public documentation currently advertises CORS support and no rate limit; the Community API is intended for the current year through five years ahead.",
      "parameters": [
        {
          "id": "year",
          "label": "Year",
          "type": "number",
          "defaultValue": "2026",
          "help": "Choose the current UTC year through 2031, matching the Community API v4 planning window.",
          "min": 2026,
          "max": 2031,
          "step": 1
        },
        {
          "id": "country",
          "label": "Country",
          "type": "select",
          "defaultValue": "SG",
          "help": "Select an ISO 3166-1 alpha-2 country code admitted by this workbench.",
          "options": [
            {
              "label": "Singapore",
              "value": "SG"
            },
            {
              "label": "Malaysia",
              "value": "MY"
            },
            {
              "label": "Australia",
              "value": "AU"
            },
            {
              "label": "Canada",
              "value": "CA"
            },
            {
              "label": "Germany",
              "value": "DE"
            },
            {
              "label": "Japan",
              "value": "JP"
            },
            {
              "label": "United Kingdom",
              "value": "GB"
            },
            {
              "label": "United States",
              "value": "US"
            }
          ]
        }
      ]
    },
    {
      "id": "geocoding-search",
      "name": "Global Geocoding",
      "provider": "Open-Meteo",
      "category": "Geo",
      "description": "Search worldwide cities and postal codes, then inspect coordinates, timezones, and population.",
      "keywords": [
        "geocoding",
        "geocoder",
        "place name to coordinates",
        "postal code lookup",
        "city lookup"
      ],
      "documentationUrl": "https://open-meteo.com/en/docs/geocoding-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=geocoding-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Searches place names and postal codes using location data based on GeoNames. Open-Meteo documents two-character exact-name matching and three-or-more-character prefix matching; this demo does not claim street-address geocoding.",
      "parameters": [
        {
          "id": "name",
          "label": "Location",
          "type": "text",
          "defaultValue": "Singapore",
          "help": "Enter a place name or postal code. Two characters use exact-name matching; three or more use prefix matching.",
          "minLength": 2
        },
        {
          "id": "count",
          "label": "Results",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 10 matching locations.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "open-meteo-air-quality",
      "name": "Global Air Quality",
      "provider": "Open-Meteo",
      "category": "Environment",
      "description": "Read current AQI, particulate matter, nitrogen dioxide, and ozone for any coordinate.",
      "documentationUrl": "https://open-meteo.com/en/docs/air-quality-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-meteo-air-quality",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Air-quality data requires attribution to Open-Meteo and the Copernicus Atmosphere Monitoring Service (CAMS).",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        }
      ]
    },
    {
      "id": "sunrise-sunset",
      "name": "Sunrise & Sunset",
      "provider": "Sunrise-Sunset.org",
      "category": "Calendar",
      "description": "Calculate sunrise, sunset, twilight, golden hour, solar noon, and moon data for a location.",
      "keywords": [
        "sunrise time",
        "sunset time",
        "solar times",
        "golden hour"
      ],
      "documentationUrl": "https://sunrise-sunset.org/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=sunrise-sunset",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Free and keyless. Display visible attribution to sunrise-sunset.org when using the data.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "date",
          "label": "Date",
          "type": "text",
          "defaultValue": "2026-10-09",
          "help": "Use YYYY-MM-DD, today, or tomorrow."
        }
      ]
    },
    {
      "id": "nasa-eonet-events",
      "name": "NASA Natural Events",
      "provider": "NASA EONET",
      "category": "Nature",
      "description": "Explore near-real-time wildfires, storms, volcanoes, floods, and other natural events worldwide.",
      "documentationUrl": "https://eonet.gsfc.nasa.gov/docs/v3",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nasa-eonet-events",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "category",
          "label": "Category",
          "type": "select",
          "defaultValue": "all",
          "help": "Filter active events by NASA EONET category.",
          "options": [
            {
              "label": "All events",
              "value": "all"
            },
            {
              "label": "Wildfires",
              "value": "wildfires"
            },
            {
              "label": "Severe storms",
              "value": "severeStorms"
            },
            {
              "label": "Volcanoes",
              "value": "volcanoes"
            },
            {
              "label": "Floods",
              "value": "floods"
            },
            {
              "label": "Earthquakes",
              "value": "earthquakes"
            }
          ]
        },
        {
          "id": "days",
          "label": "Recent days",
          "type": "number",
          "defaultValue": "30",
          "help": "Look back between 1 and 365 days.",
          "min": 1,
          "max": 365,
          "step": 1
        },
        {
          "id": "limit",
          "label": "Events",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 10 active events.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "mbta-transit-routes",
      "name": "MBTA Transit Routes",
      "provider": "MBTA",
      "category": "Utility",
      "description": "Browse Boston subway, commuter rail, bus, and ferry routes from the MBTA v3 service.",
      "documentationUrl": "https://api-v3.mbta.com/docs/swagger",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=mbta-transit-routes",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The MBTA allows keyless experimentation with a lower request allowance; production apps should request a free API key.",
      "parameters": [
        {
          "id": "routeType",
          "label": "Transit mode",
          "type": "select",
          "defaultValue": "0,1",
          "help": "Choose a family of MBTA routes.",
          "options": [
            {
              "label": "Subway & light rail",
              "value": "0,1"
            },
            {
              "label": "Commuter rail",
              "value": "2"
            },
            {
              "label": "Bus",
              "value": "3"
            },
            {
              "label": "Ferry",
              "value": "4"
            }
          ]
        }
      ]
    },
    {
      "id": "open-trivia",
      "name": "Trivia Challenge",
      "provider": "Open Trivia DB",
      "category": "Games",
      "description": "Generate multiple-choice trivia questions for quiz prototypes and interactive demos.",
      "documentationUrl": "https://opentdb.com/api_config.php",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-trivia",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 5,
        "retryOnNon2xx": false,
        "reason": "Open Trivia DB limits each IP to one API request every 5 seconds. Automated verification must use one isolated request per cadence window and must not add a same-run non-2xx retry.",
        "policyUrl": "https://opentdb.com/api_config.php"
      },
      "usageNote": "Free and keyless. Open Trivia DB data is licensed CC BY-SA 4.0. The provider limits each IP to one API request every 5 seconds and allows at most 50 questions per call; this browser demo caps a request at 10 questions.",
      "parameters": [
        {
          "id": "amount",
          "label": "Questions",
          "type": "number",
          "defaultValue": "6",
          "help": "Generate between 1 and 10 questions.",
          "min": 1,
          "max": 10,
          "step": 1
        },
        {
          "id": "category",
          "label": "Category",
          "type": "select",
          "defaultValue": "9",
          "help": "Choose a trivia category.",
          "options": [
            {
              "label": "General knowledge",
              "value": "9"
            },
            {
              "label": "Books",
              "value": "10"
            },
            {
              "label": "Film",
              "value": "11"
            },
            {
              "label": "Science & nature",
              "value": "17"
            },
            {
              "label": "Computers",
              "value": "18"
            },
            {
              "label": "Geography",
              "value": "22"
            },
            {
              "label": "History",
              "value": "23"
            },
            {
              "label": "Sports",
              "value": "21"
            }
          ]
        },
        {
          "id": "difficulty",
          "label": "Difficulty",
          "type": "select",
          "defaultValue": "medium",
          "help": "Choose the question difficulty.",
          "options": [
            {
              "label": "Easy",
              "value": "easy"
            },
            {
              "label": "Medium",
              "value": "medium"
            },
            {
              "label": "Hard",
              "value": "hard"
            }
          ]
        }
      ]
    },
    {
      "id": "carbon-intensity-gb",
      "name": "Carbon Intensity GB",
      "provider": "National Energy System Operator",
      "category": "Environment",
      "description": "Check the current carbon intensity of electricity generation across Great Britain.",
      "documentationUrl": "https://carbon-intensity.github.io/api-definitions/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=carbon-intensity-gb",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-24hr-forecast",
      "name": "data.gov.sg 24-Hour Forecast",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Read Singapore weather forecasts and temperature, humidity, and wind ranges for the next 24 hours.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-24hr-forecast",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-4day-forecast",
      "name": "data.gov.sg 4-Day Forecast",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Retrieve Singapore's four-day outlook with daily conditions and temperature ranges.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-4day-forecast",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-air-temperature",
      "name": "data.gov.sg Air Temperature",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Inspect recent temperature readings from weather stations around Singapore.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-air-temperature",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-carpark",
      "name": "data.gov.sg Carpark Availability",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "View available lots and capacity across Singapore public carparks.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-carpark",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-forecast-2hr",
      "name": "data.gov.sg 2-Hour Forecast",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Fetch short-range weather conditions for named areas across Singapore.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-forecast-2hr",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-pm25",
      "name": "data.gov.sg PM2.5",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Read regional PM2.5 measurements for Singapore air-quality demos.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-pm25",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-psi",
      "name": "data.gov.sg PSI",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Retrieve Singapore Pollutant Standards Index readings by region.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-psi",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-rainfall",
      "name": "data.gov.sg Rainfall",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Inspect recent rainfall readings reported by stations across Singapore.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-rainfall",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-relative-humidity",
      "name": "data.gov.sg Relative Humidity",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Read recent relative-humidity observations from Singapore weather stations.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-relative-humidity",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-taxi",
      "name": "data.gov.sg Taxi Availability",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Retrieve the latest geographic positions of available taxis in Singapore.",
      "documentationUrl": "https://data.gov.sg/collections/352/datasets/d_e25662f1a062dd046453926aa284ba64/view",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-taxi",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Latest anonymous availability snapshot. The provider recommends calling at most once per minute; the timestamp is data.gov.sg acquisition time, not a per-taxi observation time.",
      "parameters": []
    },
    {
      "id": "data-gov-traffic-images",
      "name": "data.gov.sg Traffic Images",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Get current image URLs and coordinates for Singapore traffic cameras.",
      "documentationUrl": "https://data.gov.sg/datasets/d_6cdb6b405b25aaaacbaf7689bcc6fae0/view",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-traffic-images",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "LTA real-time traffic-camera data under the Singapore Open Data Licence. data.gov.sg permits keyless exploration and testing; an API key is recommended for production use and higher limits.",
      "parameters": []
    },
    {
      "id": "data-gov-uv-index",
      "name": "data.gov.sg UV Index",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "View Singapore ultraviolet index observations and reporting timestamps.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-uv-index",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-wind-direction",
      "name": "data.gov.sg Wind Direction",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Read recent wind-direction measurements from Singapore weather stations.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-wind-direction",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-gov-wind-speed",
      "name": "data.gov.sg Wind Speed",
      "provider": "data.gov.sg",
      "category": "Singapore",
      "description": "Read recent wind-speed measurements from Singapore weather stations.",
      "documentationUrl": "https://guide.data.gov.sg/developer-guide/api-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-gov-wind-speed",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "data-usa",
      "name": "Data USA API",
      "provider": "Data USA",
      "category": "Economy",
      "description": "Inspect the first page of 2023 United States state population estimates from the ACS 5-year dataset.",
      "documentationUrl": "https://datausa.io/about/api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=data-usa",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "devto",
      "name": "DEV.to / Forem API",
      "provider": "Forem",
      "category": "Developer",
      "description": "Browse published DEV community articles by exact tag.",
      "keywords": [
        "DEV articles",
        "Forem articles",
        "developer community articles"
      ],
      "documentationUrl": "https://developers.forem.com/api/v1",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=devto",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses the current Forem API v1 media type. This public article-list endpoint does not require an API key; tag-filtered results are provider-ranked and should not be described as a guaranteed chronological feed.",
      "parameters": [
        {
          "id": "tag",
          "label": "Tag",
          "type": "text",
          "defaultValue": "javascript",
          "help": "Filter published DEV articles by one exact tag.",
          "minLength": 1,
          "maxLength": 50
        },
        {
          "id": "limit",
          "label": "Articles",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 published articles from page 1.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "fiscal-data-treasury",
      "name": "U.S. Treasury Agency Overview",
      "provider": "USAspending.gov",
      "category": "Finance",
      "description": "Inspect the Department of the Treasury agency overview, including its mission, identifiers, current fiscal-year context, subtier count, and official reference links.",
      "documentationUrl": "https://api.usaspending.gov/docs/endpoints",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=fiscal-data-treasury",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "This USAspending endpoint is an agency overview. It does not itself return award obligations or budgetary-resource totals; those are separate agency endpoints.",
      "parameters": []
    },
    {
      "id": "github",
      "name": "GitHub Public Repos",
      "provider": "GitHub",
      "category": "Developer",
      "description": "List public repositories owned by GitHub's Octocat example account.",
      "documentationUrl": "https://docs.github.com/en/rest/repos/repos#list-repositories-for-a-user",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=github",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "rateLimitStatuses": [
          403,
          429
        ],
        "reason": "GitHub documents HTTP 403 or 429 for primary or secondary rate-limit exhaustion and requires clients to wait for x-ratelimit-reset, Retry-After, or at least one minute before retrying. Generic health verification therefore records the first 403/429 and defers another provider request to a later independent run.",
        "policyUrl": "https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api"
      },
      "usageNote": "GitHub permits unauthenticated access to public repositories, with a primary limit of 60 requests per hour per originating IP. GitHub may return HTTP 403 or 429 for primary or secondary rate-limit exhaustion and requires clients to wait for the reset/Retry-After window before retrying. This demo pins the supported 2026-03-10 REST API version and requests only Octocat-owned public repositories.",
      "parameters": []
    },
    {
      "id": "hacker-news",
      "name": "Hacker News API",
      "provider": "Y Combinator",
      "category": "Developer",
      "description": "Look up a public Hacker News story, comment, job, poll, or poll option by item ID.",
      "keywords": [
        "Hacker News item lookup",
        "HN story comment item ID"
      ],
      "documentationUrl": "https://github.com/HackerNews/API",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=hacker-news",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The official Hacker News v0 API currently has no rate limit. Item lookup returns JSON null for an unknown ID; clients should tolerate additional provider fields.",
      "parameters": [
        {
          "id": "itemId",
          "label": "Item ID",
          "type": "text",
          "defaultValue": "8863",
          "help": "Enter the positive integer ID of a Hacker News story, comment, job, poll, or poll option.",
          "minLength": 1,
          "maxLength": 15,
          "pattern": "[1-9][0-9]*",
          "patternDescription": "must be a positive decimal Hacker News item ID."
        }
      ]
    },
    {
      "id": "ipify-public-ip",
      "name": "ipify Public IP",
      "provider": "ipify",
      "category": "Developer",
      "description": "Return the caller's public IPv4 or IPv6 address as JSON.",
      "documentationUrl": "https://www.ipify.org/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=ipify-public-ip",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "met-museum-object-detail",
      "name": "Met Museum Object",
      "provider": "The Metropolitan Museum of Art",
      "category": "Media",
      "description": "Retrieve one artwork record from The Met collection.",
      "documentationUrl": "https://metmuseum.github.io/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=met-museum-object-detail",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "met-museum-search",
      "name": "Met Museum Search",
      "provider": "The Metropolitan Museum of Art",
      "category": "Media",
      "description": "Search the first paginated page of The Met collection for image-bearing objects related to Singapore.",
      "documentationUrl": "https://metmuseum.github.io/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=met-museum-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses The Met Collection API v1.1 paginated search introduced September 4, 2026. The previous /v1/search endpoint is deprecated and scheduled for retirement on October 1, 2026. This demo requests only the first 12 image-bearing Singapore matches; The Met asks API clients to stay within 80 requests per second.",
      "parameters": []
    },
    {
      "id": "nhtsa-vpic",
      "name": "NHTSA vPIC Vehicle API",
      "provider": "NHTSA",
      "category": "Vehicle",
      "description": "List vehicle makes from the U.S. vehicle product information catalog.",
      "documentationUrl": "https://vpic.nhtsa.dot.gov/api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nhtsa-vpic",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "npm-search",
      "name": "npm Registry Search",
      "provider": "npm",
      "category": "Developer",
      "description": "Search the npm registry for packages by query and inspect trusted package metadata and download activity.",
      "keywords": [
        "npm package search",
        "node package registry",
        "javascript packages",
        "dependencies"
      ],
      "documentationUrl": "https://api-docs.npmjs.com/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=npm-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Package search",
          "type": "text",
          "defaultValue": "react",
          "help": "Search npm packages using the registry text query.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Packages",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 npm registry search results.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "nvd-cpe-search",
      "name": "NVD CPE Search",
      "provider": "NIST NVD",
      "category": "Developer",
      "description": "Search the National Vulnerability Database CPE 2.3 product dictionary by keyword.",
      "documentationUrl": "https://nvd.nist.gov/developers/products",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nvd-cpe-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 6,
        "retryOnNon2xx": false,
        "reason": "NVD documents a public limit of five requests per rolling 30 seconds and recommends sleeping six seconds between requests. Automated verification must use an isolated cadence-aware journey and stop after a non-2xx response instead of joining the generic sweep.",
        "policyUrl": "https://nvd.nist.gov/developers/start-here"
      },
      "usageNote": "NVD allows five requests in a rolling 30-second window without an API key and recommends a six-second sleep between requests. Automated verification is therefore isolated from generic health sweeps and must not retry a non-2xx response in the same run. Treat CVSS as one assessment source and confirm affected versions and remediation with the vendor.",
      "parameters": [
        {
          "id": "query",
          "label": "CPE keyword",
          "type": "text",
          "defaultValue": "openssl",
          "help": "Search across components of NVD CPE product names.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Products",
          "type": "number",
          "defaultValue": "8",
          "help": "Return a bounded first page of 1 to 20 whole CPE product identities.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "nvd-cve-detail",
      "name": "NVD CVE Detail",
      "provider": "NIST NVD",
      "category": "Developer",
      "description": "Retrieve one request-bound NVD CVE record with provider descriptions, dates, references, and sourced CVSS assessment.",
      "documentationUrl": "https://nvd.nist.gov/developers/vulnerabilities",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nvd-cve-detail",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 6,
        "retryOnNon2xx": false,
        "reason": "NVD documents a public limit of five requests per rolling 30 seconds and recommends sleeping six seconds between requests. Automated verification must use an isolated cadence-aware journey and stop after a non-2xx response instead of joining the generic sweep.",
        "policyUrl": "https://nvd.nist.gov/developers/start-here"
      },
      "usageNote": "NVD allows five requests in a rolling 30-second window without an API key and recommends a six-second sleep between requests. Automated verification is therefore isolated from generic health sweeps and must not retry a non-2xx response in the same run. Treat CVSS as one assessment source and confirm affected versions and remediation with the vendor.",
      "parameters": [
        {
          "id": "cve",
          "label": "CVE identifier",
          "type": "text",
          "defaultValue": "CVE-2024-3094",
          "help": "Enter a published CVE identifier using the CVE-YYYY-NNNN format.",
          "pattern": "CVE-[0-9]{4}-[0-9]{4,}",
          "patternDescription": "must use the CVE-YYYY-NNNN format with four or more sequence digits."
        }
      ]
    },
    {
      "id": "nvd-cves",
      "name": "NVD CVE Search",
      "provider": "NIST NVD",
      "category": "Developer",
      "description": "Search current NVD CVE descriptions for all supplied keyword terms and inspect request-bound vulnerability records.",
      "keywords": [
        "CVE keyword search",
        "vulnerability description search",
        "security vulnerability discovery"
      ],
      "documentationUrl": "https://nvd.nist.gov/developers/vulnerabilities",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nvd-cves",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 6,
        "retryOnNon2xx": false,
        "reason": "NVD documents a public limit of five requests per rolling 30 seconds and recommends sleeping six seconds between requests. Automated verification must use an isolated cadence-aware journey and stop after a non-2xx response instead of joining the generic sweep.",
        "policyUrl": "https://nvd.nist.gov/developers/start-here"
      },
      "usageNote": "NVD allows five requests in a rolling 30-second window without an API key and recommends a six-second sleep between requests. Automated verification is therefore isolated from generic health sweeps and must not retry a non-2xx response in the same run. Treat CVSS as one assessment source and confirm affected versions and remediation with the vendor.",
      "parameters": [
        {
          "id": "query",
          "label": "CVE description keywords",
          "type": "text",
          "defaultValue": "postgresql",
          "help": "Search current CVE descriptions. NVD requires every space-separated term to match and applies a trailing wildcard to each term.",
          "minLength": 1,
          "maxLength": 100
        },
        {
          "id": "limit",
          "label": "CVEs",
          "type": "number",
          "defaultValue": "8",
          "help": "Return a bounded first page of 1 to 20 whole matching CVE records.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "nvd-recent-cves",
      "name": "NVD Recently Modified CVEs",
      "provider": "NIST NVD",
      "category": "Developer",
      "description": "Review CVEs whose NVD records were modified within a bounded recent window.",
      "documentationUrl": "https://nvd.nist.gov/developers/vulnerabilities",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nvd-recent-cves",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 6,
        "retryOnNon2xx": false,
        "reason": "NVD documents a public limit of five requests per rolling 30 seconds and recommends sleeping six seconds between requests. Automated verification must use an isolated cadence-aware journey and stop after a non-2xx response instead of joining the generic sweep.",
        "policyUrl": "https://nvd.nist.gov/developers/start-here"
      },
      "usageNote": "NVD allows five requests in a rolling 30-second window without an API key and recommends a six-second sleep between requests. Automated verification is therefore isolated from generic health sweeps and must not retry a non-2xx response in the same run. Treat CVSS as one assessment source and confirm affected versions and remediation with the vendor.",
      "parameters": [
        {
          "id": "lookbackDays",
          "label": "Modified within",
          "type": "select",
          "defaultValue": "7",
          "help": "Choose a bounded NVD last-modified window. NVD requires paired lastModStartDate/lastModEndDate values and limits one window to 120 consecutive days.",
          "options": [
            {
              "label": "Last 24 hours",
              "value": "1"
            },
            {
              "label": "Last 7 days",
              "value": "7"
            },
            {
              "label": "Last 30 days",
              "value": "30"
            },
            {
              "label": "Last 90 days",
              "value": "90"
            },
            {
              "label": "Last 120 days",
              "value": "120"
            }
          ]
        }
      ]
    },
    {
      "id": "postcodes-io",
      "name": "Postcodes.io",
      "provider": "Postcodes.io",
      "category": "Geo",
      "description": "Look up geographic and administrative details for a UK postcode.",
      "documentationUrl": "https://postcodes.io/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=postcodes-io",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "pypi-json",
      "name": "PyPI JSON API",
      "provider": "Python Package Index",
      "category": "Developer",
      "description": "Inspect current project metadata for the Python requests package.",
      "documentationUrl": "https://docs.pypi.org/api/json/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=pypi-json",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "PyPI marks the project-level releases key and legacy downloads, has_sig, and bugtrack_url fields as deprecated. The semantic preview does not depend on those fields for readiness.",
      "parameters": []
    },
    {
      "id": "stack-exchange",
      "name": "Stack Exchange Questions",
      "provider": "Stack Exchange",
      "category": "Developer",
      "description": "Browse recently active Stack Overflow questions for one to five required tags.",
      "documentationUrl": "https://api.stackexchange.com/docs/questions",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=stack-exchange",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 60,
        "retryOnNon2xx": false,
        "reason": "Stack Exchange says semantically identical API requests should not be made more than once per minute; automated verification uses one request per cadence window and no same-run non-2xx retry.",
        "policyUrl": "https://api.stackexchange.com/docs/throttle"
      },
      "usageNote": "Stack Exchange heavily caches API responses. Do not repeat semantically identical requests more than once per minute, and obey any provider backoff value before calling the same method again.",
      "parameters": [
        {
          "id": "tags",
          "label": "Required tags",
          "type": "text",
          "defaultValue": "javascript",
          "help": "Every returned question must contain all requested tags. Separate up to five tags with semicolons.",
          "minLength": 1,
          "maxLength": 200,
          "pattern": "[^;]+(?:;[^;]+){0,4}",
          "patternDescription": "Enter one to five semicolon-delimited Stack Overflow tags."
        },
        {
          "id": "limit",
          "label": "Questions",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 recently active questions.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "uk-bank-holidays",
      "name": "UK Bank Holidays",
      "provider": "GOV.UK",
      "category": "Calendar",
      "description": "Retrieve official bank-holiday calendars for the United Kingdom.",
      "documentationUrl": "https://www.gov.uk/bank-holidays",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=uk-bank-holidays",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "usaspending",
      "name": "USAspending Contract Awards",
      "provider": "USAspending.gov",
      "category": "Government",
      "description": "Inspect new prime federal contract awards whose base transaction date falls within a selected federal fiscal year, sorted by Base Obligation Date.",
      "documentationUrl": "https://github.com/fedspendingtransparency/usaspending-api/blob/master/usaspending_api/api_contracts/contracts/v2/search/spending_by_award.md",
      "method": "POST",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=usaspending",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Federal fiscal years run from October 1 through September 30. This demo sets date_type=new_awards_only so only awards whose base transaction date falls inside the selected fiscal year are returned, searches prime contract award types A-D, and sorts by Base Obligation Date descending. For contract awards, USAspending maps Award Amount to the award total_obligation field; it is not a transaction amount or potential award ceiling.",
      "parameters": [
        {
          "id": "fiscalYear",
          "label": "Federal fiscal year",
          "type": "number",
          "defaultValue": "2026",
          "help": "Choose FY2008 through the current federal fiscal year. The request uses new_awards_only, so the award’s base transaction date must fall between October 1 and September 30.",
          "min": 2008,
          "max": 2027,
          "step": 1
        },
        {
          "id": "limit",
          "label": "Awards",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 new prime contract awards for the selected federal fiscal year.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "usgs",
      "name": "USGS Earthquakes",
      "provider": "U.S. Geological Survey",
      "category": "Geo",
      "description": "Map earthquakes of magnitude 2.5 or greater reported during the past day.",
      "keywords": [
        "earthquake data",
        "seismic events",
        "earthquake feed"
      ],
      "documentationUrl": "https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=usgs",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "wikidata-sparql",
      "name": "Wikidata SPARQL",
      "provider": "Wikimedia Foundation",
      "category": "Knowledge",
      "description": "Run a bounded Wikidata Query Service SPARQL query for entities classified as cities and their English labels.",
      "documentationUrl": "https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=wikidata-sparql",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "reason": "Wikidata Query Service says HTTP 429 clients must wait until the Retry-After window before repeating the query; generic health verification records the first 429 and defers another provider request to a later independent run.",
        "policyUrl": "https://www.mediawiki.org/wiki/Wikidata_Query_Service/User_Manual"
      },
      "usageNote": "Wikidata Query Service is rate-limited and can lag behind Wikidata edits. Public-API identifies its browser requests with Wikimedia’s Api-User-Agent fallback for browser JavaScript. On HTTP 429, Wikimedia says to obey the Retry-After header before repeating the query.",
      "parameters": []
    },
    {
      "id": "world-bank-gdp",
      "name": "World Bank GDP",
      "provider": "World Bank",
      "category": "Economy",
      "description": "Explore recent Singapore gross domestic product figures.",
      "documentationUrl": "https://datahelpdesk.worldbank.org/knowledgebase/articles/898581-api-basic-call-structures",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=world-bank-gdp",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "world-bank-population",
      "name": "World Bank Population",
      "provider": "World Bank",
      "category": "Economy",
      "description": "Explore recent Singapore population totals by year.",
      "documentationUrl": "https://datahelpdesk.worldbank.org/knowledgebase/articles/898581-api-basic-call-structures",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=world-bank-population",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "frankfurter-sgd-myr-history",
      "name": "SGD/MYR FX History",
      "provider": "Frankfurter · ECB",
      "category": "Finance",
      "description": "Explore monthly SGD/MYR reference rates from the euro-era starting point in 1999.",
      "documentationUrl": "https://frankfurter.dev/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=frankfurter-sgd-myr-history",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "from",
          "label": "Start date",
          "type": "date",
          "defaultValue": "1999-01-04",
          "help": "Use an ISO date in YYYY-MM-DD format. ECB history begins at the euro-era starting point."
        },
        {
          "id": "to",
          "label": "End date",
          "type": "date",
          "defaultValue": "2026-10-09",
          "help": "Use an ISO date in YYYY-MM-DD format on or after the start date, up to today.",
          "minimumFromField": "from"
        },
        {
          "id": "group",
          "label": "Grouping",
          "type": "select",
          "defaultValue": "month",
          "help": "Monthly grouping keeps the long history compact.",
          "options": [
            {
              "label": "Monthly",
              "value": "month"
            },
            {
              "label": "Weekly",
              "value": "week"
            }
          ]
        }
      ]
    },
    {
      "id": "open-library-search",
      "name": "Open Library Search",
      "provider": "Internet Archive",
      "category": "Books",
      "description": "Search books, authors, and publication years in the Open Library catalogue.",
      "documentationUrl": "https://openlibrary.org/developers/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-library-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Open Library is intended for human-facing, low-volume discovery rather than bulk/high-traffic backend use. Unidentified requests are limited to 1 request/second; cache responses when practical.",
      "parameters": [
        {
          "id": "query",
          "label": "Book search",
          "type": "text",
          "defaultValue": "artificial intelligence",
          "help": "Search by title, author, subject, or keyword.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 books.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "open-food-facts",
      "name": "Open Food Facts",
      "provider": "Open Food Facts",
      "category": "Food",
      "description": "Look up a request-bound food product identity, selected nutrition facts, ingredients, and labels by barcode.",
      "documentationUrl": "https://openfoodfacts.github.io/documentation/docs/Product-Opener/v3/products/get-api-v3-product-code/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-food-facts",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Open Food Facts limits product reads to 15 product reads/minute/IP and asks API clients to identify their app with a custom User-Agent. Its official JavaScript SDK also documents browser window.fetch usage. Keep this browser demo low-volume and human-triggered; product data is community-contributed and may be incomplete or incorrect.",
      "parameters": [
        {
          "id": "barcode",
          "label": "Barcode",
          "type": "text",
          "defaultValue": "3017620422003",
          "help": "Enter an EAN, UPC, or GTIN barcode as digits. Open Food Facts may normalize leading zeros on the server.",
          "minLength": 1,
          "maxLength": 32,
          "pattern": "[0-9]+",
          "patternDescription": "must contain digits only."
        }
      ]
    },
    {
      "id": "free-dictionary",
      "name": "Free Dictionary",
      "provider": "FreeDictionaryAPI.com",
      "category": "Language",
      "description": "Look up English definitions, pronunciations, examples, synonyms, and antonyms.",
      "documentationUrl": "https://freedictionaryapi.com/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=free-dictionary",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "FreeDictionaryAPI.com allows 1,000 requests/hour/IP, serves Wiktionary-derived CC BY-SA 4.0 content, and requires visible FreeDictionaryAPI.com attribution plus a link back to the original Wiktionary page supplied in the response.",
      "parameters": [
        {
          "id": "word",
          "label": "English word",
          "type": "text",
          "defaultValue": "hello",
          "help": "Enter one English word or headword.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "pokeapi",
      "name": "PokéAPI Explorer",
      "provider": "PokéAPI",
      "category": "Games",
      "description": "Explore a Pokémon profile, abilities, types, sprites, and game statistics.",
      "documentationUrl": "https://pokeapi.co/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=pokeapi",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "PokéAPI is keyless and consumption-only. Its current fair-use policy asks clients to limit request frequency even though static hosting has no fixed rate limit; avoid bulk or abusive traffic.",
      "parameters": [
        {
          "id": "pokemon",
          "label": "Pokémon",
          "type": "text",
          "defaultValue": "pikachu",
          "help": "Use an exact Pokémon resource name or positive Pokédex/resource ID.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "art-institute-search",
      "name": "Art Institute Search",
      "provider": "Art Institute of Chicago",
      "category": "Media",
      "description": "Search public-domain artworks and preview only records with trustworthy provider image identity and IIIF evidence.",
      "documentationUrl": "https://api.artic.edu/docs/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=art-institute-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Anonymous API access is limited to 60 requests/minute. This demo filters for public-domain artworks, displays only records with provider image identity, derives images from the provider IIIF configuration, and treats API response data as CC0 subject to the Art Institute terms. Review the artwork record before downstream image reuse.",
      "parameters": [
        {
          "id": "query",
          "label": "Artwork search",
          "type": "text",
          "defaultValue": "monet",
          "help": "Search artwork titles, artists, or subjects.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 public-domain search results; image-less rows are withheld from the semantic gallery.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "tvmaze-search",
      "name": "TVmaze Show Search",
      "provider": "TVmaze",
      "category": "Entertainment",
      "description": "Search television shows with schedules, genres, ratings, and image metadata.",
      "documentationUrl": "https://www.tvmaze.com/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=tvmaze-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "TVmaze public API data is CC BY-SA and requires source attribution and ShareAlike. The free service promises at least 20 calls per 10 seconds per IP; back off after HTTP 429. Show images may be null, and this demo makes no separate image-reuse-rights claim.",
      "parameters": [
        {
          "id": "show",
          "label": "Show title",
          "type": "text",
          "defaultValue": "severance",
          "help": "Search for a television series.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "gbif-species-search",
      "name": "GBIF Species Search",
      "provider": "GBIF",
      "category": "Biodiversity",
      "description": "Search scientific names, taxonomy, vernacular names, and species records.",
      "documentationUrl": "https://techdocs.gbif.org/en/openapi/v1/species",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=gbif-species-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Species search",
          "type": "text",
          "defaultValue": "panthera",
          "help": "Search by scientific or common name."
        }
      ]
    },
    {
      "id": "clinical-trials-search",
      "name": "ClinicalTrials.gov Search",
      "provider": "U.S. National Library of Medicine",
      "category": "Health",
      "description": "Search public clinical study records by condition or disease.",
      "documentationUrl": "https://clinicaltrials.gov/data-about-studies/learn-about-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=clinical-trials-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "For research demonstrations only. Do not use API results as medical advice or a substitute for professional care.",
      "parameters": [
        {
          "id": "condition",
          "label": "Condition",
          "type": "text",
          "defaultValue": "Diabetes",
          "help": "Search the ClinicalTrials.gov condition/disease search area, which may match condition terms, titles, MeSH terms, keywords, and provider synonyms.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "openfda-drug-labels",
      "name": "openFDA Drug Labels",
      "provider": "U.S. Food and Drug Administration",
      "category": "Health",
      "description": "Search public drug-label records by brand name and inspect product identity, active ingredients, indications, warnings, and directions.",
      "documentationUrl": "https://open.fda.gov/apis/drug/label/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=openfda-drug-labels",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "For informational demonstrations only. Labels may be incomplete or outdated; never use this response for medical decisions.",
      "parameters": [
        {
          "id": "brand",
          "label": "Brand name",
          "type": "text",
          "defaultValue": "Advil",
          "help": "Search a drug brand-name phrase indexed by openFDA. Multi-word names are sent as one quoted phrase.",
          "minLength": 1,
          "maxLength": 80,
          "pattern": "[^\"\\\\]+",
          "patternDescription": "must not contain double quotes or backslashes because those characters alter openFDA search syntax."
        }
      ]
    },
    {
      "id": "coinpaprika-ticker",
      "name": "CoinPaprika Ticker",
      "provider": "CoinPaprika",
      "category": "Finance",
      "description": "Inspect current cryptocurrency price, market capitalization, volume, and percentage changes.",
      "documentationUrl": "https://docs.coinpaprika.com/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=coinpaprika-ticker",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Market data is informational, not investment advice. Display CoinPaprika attribution when publishing results.",
      "parameters": [
        {
          "id": "coin",
          "label": "Cryptocurrency",
          "type": "select",
          "defaultValue": "btc-bitcoin",
          "help": "Select a public ticker.",
          "options": [
            {
              "label": "Bitcoin",
              "value": "btc-bitcoin"
            },
            {
              "label": "Ethereum",
              "value": "eth-ethereum"
            },
            {
              "label": "Solana",
              "value": "sol-solana"
            },
            {
              "label": "Tether",
              "value": "usdt-tether"
            }
          ]
        }
      ]
    },
    {
      "id": "malaysia-fuel-price",
      "name": "Malaysia Fuel Price",
      "provider": "data.gov.my",
      "category": "Finance",
      "description": "Compare Malaysia’s weekly RON95, RON97, diesel, and targeted-subsidy fuel prices.",
      "documentationUrl": "https://data.gov.my/data-catalogue/fuelprice",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=malaysia-fuel-price",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Official open data licensed under CC BY 4.0. Keep data.gov.my attribution visible when republishing the results.",
      "parameters": [
        {
          "id": "limit",
          "label": "History rows",
          "type": "number",
          "defaultValue": "52",
          "help": "Each week can include a price level and a weekly-change row.",
          "min": 12,
          "max": 104
        }
      ]
    },
    {
      "id": "open-meteo-marine",
      "name": "Marine Weather",
      "provider": "Open-Meteo",
      "category": "Weather",
      "description": "Inspect wave height, period, direction, sea temperature, and ocean currents for coastal demos.",
      "documentationUrl": "https://open-meteo.com/en/docs/marine-weather-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-meteo-marine",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Open-Meteo attribution is required. Forecasts are not suitable for coastal navigation or safety-critical decisions.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "days",
          "label": "Forecast days",
          "type": "number",
          "defaultValue": "3",
          "help": "Return between 1 and 7 whole forecast days.",
          "min": 1,
          "max": 7,
          "step": 1
        }
      ]
    },
    {
      "id": "nobel-prizes",
      "name": "Nobel Prize Explorer",
      "provider": "Nobel Prize Outreach",
      "category": "Research",
      "description": "Browse recent Nobel Prizes, laureates, motivations, award years, and prize amounts by category.",
      "documentationUrl": "https://www.nobelprize.org/about/developer-zone-2/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nobel-prizes",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses the official Nobel Prize API. Follow the linked API terms and licence when republishing data.",
      "parameters": [
        {
          "id": "category",
          "label": "Prize category",
          "type": "select",
          "defaultValue": "phy",
          "help": "Choose a Nobel Prize category.",
          "options": [
            {
              "label": "Physics",
              "value": "phy"
            },
            {
              "label": "Chemistry",
              "value": "che"
            },
            {
              "label": "Physiology or Medicine",
              "value": "med"
            },
            {
              "label": "Literature",
              "value": "lit"
            },
            {
              "label": "Peace",
              "value": "pea"
            },
            {
              "label": "Economic Sciences",
              "value": "eco"
            }
          ]
        },
        {
          "id": "limit",
          "label": "Prize years",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 12 whole recent prize records.",
          "min": 1,
          "max": 12,
          "step": 1
        }
      ]
    },
    {
      "id": "chess-player-stats",
      "name": "Lichess Player Ratings",
      "provider": "Lichess",
      "category": "Games",
      "description": "Inspect a public Lichess player’s rating, game count, rating deviation, and progress across supported chess modes.",
      "documentationUrl": "https://lichess.org/api#tag/Users/operation/apiUser",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=chess-player-stats",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "reason": "Lichess says clients receiving HTTP 429 must wait a full minute before resuming API usage; generic health verification records the first 429 and defers another provider request to a later independent run.",
        "policyUrl": "https://lichess.org/page/api-tips"
      },
      "usageNote": "Public read-only user endpoint. Lichess asks clients to make only one API request at a time and, after HTTP 429, wait a full minute before resuming API usage.",
      "parameters": [
        {
          "id": "username",
          "label": "Lichess username",
          "type": "text",
          "defaultValue": "thibault",
          "help": "Enter one public Lichess username. The request reads only public user data.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "crossref-works",
      "name": "Crossref Works Search",
      "provider": "Crossref",
      "category": "Research",
      "description": "Search scholarly works and inspect DOI, authorship, publisher, type, year, and citation counts.",
      "documentationUrl": "https://www.crossref.org/documentation/retrieve-metadata/rest-api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=crossref-works",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses Crossref’s public pool without authentication. Cache results and keep request volume modest.",
      "parameters": [
        {
          "id": "query",
          "label": "Research query",
          "type": "text",
          "defaultValue": "agentic AI",
          "help": "Search titles, authors, abstracts, and other Crossref metadata.",
          "minLength": 1
        },
        {
          "id": "rows",
          "label": "Results",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 whole work records.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "noaa-space-weather",
      "name": "NOAA Space Weather",
      "provider": "NOAA SWPC",
      "category": "Environment",
      "description": "Monitor current radio blackouts, solar radiation storms, and geomagnetic storm scales.",
      "documentationUrl": "https://www.spaceweather.gov/content/data-access",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=noaa-space-weather",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Official NOAA operational data. Treat forecasts as guidance and retain NOAA attribution.",
      "parameters": []
    },
    {
      "id": "osv-vulnerability",
      "name": "OSV Vulnerability",
      "provider": "Google Open Source Security",
      "category": "Developer",
      "description": "Inspect an open-source vulnerability, affected packages, ecosystem ranges, aliases, and references.",
      "documentationUrl": "https://google.github.io/osv.dev/api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=osv-vulnerability",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "vulnerabilityId",
          "label": "OSV or GHSA ID",
          "type": "text",
          "defaultValue": "GHSA-jfh8-c2jp-5v3q",
          "help": "Enter the exact case-sensitive OSV, CVE, or GitHub Security Advisory identifier. OSV API request values are case-sensitive."
        }
      ]
    },
    {
      "id": "federal-register-documents",
      "name": "Federal Register Documents",
      "provider": "U.S. Federal Register",
      "category": "Government",
      "description": "Search recent U.S. rules, notices, proposed rules, presidential documents, and agency publications.",
      "documentationUrl": "https://www.federalregister.gov/developers/documentation/api/v1",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=federal-register-documents",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "FederalRegister.gov exposes this public API without an API key and documents browser CORS support. Its web edition is an unofficial informational resource; legal research should verify the corresponding official edition or PDF on govinfo.gov.",
      "parameters": [
        {
          "id": "query",
          "label": "Search term",
          "type": "text",
          "defaultValue": "artificial intelligence",
          "help": "Search document titles and indexed Federal Register content.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Documents",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 recent documents.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "wikipedia-search",
      "name": "Wikipedia Search",
      "provider": "Wikimedia Foundation",
      "category": "Knowledge",
      "description": "Search Wikipedia and return article extracts, thumbnails, page identifiers, and canonical titles.",
      "documentationUrl": "https://www.mediawiki.org/wiki/API:Search",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=wikipedia-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Wikimedia asks API clients to identify themselves; browser requests send Api-User-Agent: Public-API/0.1 (https://yapweijun1996.github.io/Public-API/). Wikipedia article text is available under CC BY-SA terms with attribution and share-alike obligations. Article thumbnails can carry separate image licenses, so inspect the source file before reuse.",
      "parameters": [
        {
          "id": "query",
          "label": "Article search",
          "type": "text",
          "defaultValue": "Singapore",
          "help": "Search English Wikipedia titles and article text.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 12 matching pages.",
          "min": 1,
          "max": 12,
          "step": 1
        }
      ]
    },
    {
      "id": "open-meteo-flood",
      "name": "Global Flood Forecast",
      "provider": "Open-Meteo",
      "category": "Environment",
      "description": "Inspect forecast river-discharge guidance for any coordinate.",
      "documentationUrl": "https://open-meteo.com/en/docs/flood-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-meteo-flood",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Hydrological model guidance only. Do not use this demo for emergency or life-safety decisions.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "days",
          "label": "Forecast days",
          "type": "number",
          "defaultValue": "7",
          "help": "Return between 1 and 30 daily discharge values.",
          "min": 1,
          "max": 30,
          "step": 1
        }
      ]
    },
    {
      "id": "open-meteo-history",
      "name": "Historical Weather",
      "provider": "Open-Meteo",
      "category": "Weather",
      "description": "Compare historical daily temperature and precipitation series for a selected place and date range.",
      "documentationUrl": "https://open-meteo.com/en/docs/historical-weather-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-meteo-history",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "startDate",
          "label": "Start date",
          "type": "date",
          "defaultValue": "2025-01-01",
          "help": "Open-Meteo requires an ISO date in YYYY-MM-DD format."
        },
        {
          "id": "endDate",
          "label": "End date",
          "type": "date",
          "defaultValue": "2025-01-14",
          "help": "Open-Meteo requires YYYY-MM-DD; choose an end date on or after the start date.",
          "minimumFromField": "startDate"
        }
      ]
    },
    {
      "id": "kraken-public-ticker",
      "name": "Kraken Market Ticker",
      "provider": "Kraken",
      "category": "Finance",
      "description": "Read live cryptocurrency bid, ask, last trade, volume, high, and low market data.",
      "documentationUrl": "https://docs.kraken.com/api/docs/rest-api/get-ticker-information",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=kraken-public-ticker",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Public market data only. This demo does not provide trading or financial advice.",
      "parameters": [
        {
          "id": "pair",
          "label": "Market pair",
          "type": "select",
          "defaultValue": "XBTUSD",
          "help": "Choose a public Kraken spot market.",
          "options": [
            {
              "label": "BTC / USD",
              "value": "XBTUSD"
            },
            {
              "label": "ETH / USD",
              "value": "ETHUSD"
            },
            {
              "label": "SOL / USD",
              "value": "SOLUSD"
            },
            {
              "label": "BTC / EUR",
              "value": "XBTEUR"
            }
          ]
        }
      ]
    },
    {
      "id": "gitlab-public-projects",
      "name": "GitLab Public Projects",
      "provider": "GitLab",
      "category": "Developer",
      "description": "Discover public GitLab projects and compare stars, forks, activity, topics, and programming language.",
      "documentationUrl": "https://docs.gitlab.com/api/projects/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=gitlab-public-projects",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Project search",
          "type": "text",
          "defaultValue": "artificial intelligence",
          "help": "Search public project names, paths, and descriptions.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Projects",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 public projects.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "uk-police-street-crime",
      "name": "UK Street Crime",
      "provider": "UK Home Office",
      "category": "Government",
      "description": "Explore recent anonymised street-level crime categories around a selected UK coordinate.",
      "documentationUrl": "https://data.police.uk/docs/method/crime-street/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=uk-police-street-crime",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Locations are approximate and anonymised by the source. Present the data as area-level context, not individual-level evidence. persistent_id is the documented stable 64-character crime identity; API id is not guaranteed stable, so rows without persistent_id are withheld.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "51.5074",
          "help": "Choose a coordinate within the United Kingdom.",
          "min": 49,
          "max": 61
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "-0.1278",
          "help": "Choose a coordinate within the United Kingdom.",
          "min": -9,
          "max": 3
        },
        {
          "id": "category",
          "label": "Crime category",
          "type": "select",
          "defaultValue": "burglary",
          "help": "Filter the street-level dataset by category. A focused default keeps the demo response lightweight.",
          "options": [
            {
              "label": "All crime",
              "value": "all-crime"
            },
            {
              "label": "Anti-social behaviour",
              "value": "anti-social-behaviour"
            },
            {
              "label": "Burglary",
              "value": "burglary"
            },
            {
              "label": "Vehicle crime",
              "value": "vehicle-crime"
            },
            {
              "label": "Violence and sexual offences",
              "value": "violent-crime"
            }
          ]
        }
      ]
    },
    {
      "id": "open-brewery-directory",
      "name": "Open Brewery Directory",
      "provider": "Open Brewery DB",
      "category": "Food",
      "description": "Browse brewery locations, business types, websites, cities, states, and countries.",
      "documentationUrl": "https://api.openbrewerydb.org/docs/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-brewery-directory",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "rateLimitStatuses": [
          429
        ],
        "reason": "Open Brewery DB documents Retry-After handling for HTTP 429. Generic health verification records the rate-limit response and defers another provider request to a later independent run instead of immediately retrying.",
        "policyUrl": "https://api.openbrewerydb.org/docs/"
      },
      "usageNote": "Open Brewery DB is keyless. Its current API documentation states 60 requests per minute per IP and instructs clients that receive HTTP 429 to wait for the Retry-After period before retrying; keep automated checks bounded even if live rate-limit headers advertise a different temporary allowance.",
      "parameters": [
        {
          "id": "country",
          "label": "Country",
          "type": "select",
          "defaultValue": "united_states",
          "help": "Filter the public brewery directory by country.",
          "options": [
            {
              "label": "United States",
              "value": "united_states"
            },
            {
              "label": "Ireland",
              "value": "ireland"
            },
            {
              "label": "France",
              "value": "france"
            },
            {
              "label": "South Korea",
              "value": "south_korea"
            }
          ]
        },
        {
          "id": "type",
          "label": "Brewery type",
          "type": "select",
          "defaultValue": "all",
          "help": "Optionally filter the business model.",
          "options": [
            {
              "label": "All types",
              "value": "all"
            },
            {
              "label": "Micro",
              "value": "micro"
            },
            {
              "label": "Brewpub",
              "value": "brewpub"
            },
            {
              "label": "Regional",
              "value": "regional"
            },
            {
              "label": "Contract",
              "value": "contract"
            }
          ]
        }
      ]
    },
    {
      "id": "rick-morty-characters",
      "name": "Rick and Morty Characters",
      "provider": "Rick and Morty API",
      "category": "Entertainment",
      "description": "Search characters and inspect species, status, origin, current location, images, and episode counts.",
      "documentationUrl": "https://rickandmortyapi.com/documentation/#character",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=rick-morty-characters",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The API project is open source under BSD, but its official About page says show data and images are used without an ownership claim and belong to their respective owners. Do not treat character images as BSD-licensed reusable media.",
      "parameters": [
        {
          "id": "name",
          "label": "Character name",
          "type": "text",
          "defaultValue": "Rick",
          "help": "Search character names using the provider’s documented partial-name filter.",
          "minLength": 1
        },
        {
          "id": "status",
          "label": "Status",
          "type": "select",
          "defaultValue": "all",
          "help": "Optionally filter characters by the provider’s documented life-status values.",
          "options": [
            {
              "label": "All statuses",
              "value": "all"
            },
            {
              "label": "Alive",
              "value": "alive"
            },
            {
              "label": "Dead",
              "value": "dead"
            },
            {
              "label": "Unknown",
              "value": "unknown"
            }
          ]
        }
      ]
    },
    {
      "id": "wikimedia-pageviews",
      "name": "Wikimedia Pageviews",
      "provider": "Wikimedia Foundation",
      "category": "Knowledge",
      "description": "Chart daily Wikipedia article traffic across desktop, mobile web, and app access.",
      "documentationUrl": "https://doc.wikimedia.org/generated-data-platform/aqs/analytics-api/reference/page-views.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=wikimedia-pageviews",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "article",
          "label": "Article title",
          "type": "text",
          "defaultValue": "Singapore",
          "help": "Use an English Wikipedia article title."
        },
        {
          "id": "days",
          "label": "History days",
          "type": "number",
          "defaultValue": "14",
          "help": "Chart between 7 and 90 completed days.",
          "min": 7,
          "max": 90
        }
      ]
    },
    {
      "id": "openf1-historical",
      "name": "Jolpica F1 Qualifying",
      "provider": "Jolpica",
      "category": "Sports",
      "description": "Inspect Formula 1 qualifying classification, drivers, constructors, and Q1/Q2/Q3 lap times.",
      "documentationUrl": "https://github.com/jolpica/jolpica-f1/blob/main/docs/README.md",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=openf1-historical",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "This qualifying-specific Jolpica demo complements the separate drivers, constructors, and races catalogue demo. Keep automated request volume modest.",
      "parameters": [
        {
          "id": "season",
          "label": "Season",
          "type": "select",
          "defaultValue": "2025",
          "help": "Choose a completed Formula 1 season.",
          "options": [
            {
              "label": "2025",
              "value": "2025"
            },
            {
              "label": "2024",
              "value": "2024"
            },
            {
              "label": "2023",
              "value": "2023"
            }
          ]
        },
        {
          "id": "round",
          "label": "Race round",
          "type": "number",
          "defaultValue": "1",
          "help": "Choose the Grand Prix round number.",
          "min": 1,
          "max": 30
        }
      ]
    },
    {
      "id": "packagist-search",
      "name": "Packagist Package Search",
      "provider": "Packagist",
      "category": "Developer",
      "description": "Search Composer packages for metadata, stars, licenses, and source links.",
      "documentationUrl": "https://packagist.org/apidoc",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=packagist-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Composer package search is anonymous and community maintained. Packagist recommends avoiding synchronized scheduled jobs, identifying API clients with a contact-bearing User-Agent, and limiting parallel requests to 10. Normal browser JavaScript cannot set User-Agent, so keep this browser demo and automated verification bounded.",
      "parameters": [
        {
          "id": "query",
          "label": "Package search",
          "type": "text",
          "defaultValue": "react",
          "help": "Search package names and descriptions.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Packages",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 package records.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "nhtsa-vehicle-recalls",
      "name": "NHTSA Vehicle Recalls",
      "provider": "NHTSA",
      "category": "Vehicle",
      "description": "Search U.S. vehicle recall campaigns by make, model, and year.",
      "documentationUrl": "https://www.nhtsa.gov/nhtsa-datasets-and-apis",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nhtsa-vehicle-recalls",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "make",
          "label": "Vehicle make",
          "type": "text",
          "defaultValue": "honda",
          "help": "Use an American-style vehicle make such as Honda or Toyota."
        },
        {
          "id": "model",
          "label": "Vehicle model",
          "type": "text",
          "defaultValue": "accord",
          "help": "Use a model name supported by the selected manufacturer."
        },
        {
          "id": "year",
          "label": "Model year",
          "type": "number",
          "defaultValue": "2020",
          "help": "Narrow by model year to reduce response size.",
          "min": 1949,
          "max": 2027,
          "step": 1
        }
      ]
    },
    {
      "id": "anilist-graphql",
      "name": "AniList Media Search",
      "provider": "AniList",
      "category": "Entertainment",
      "description": "Search anime and manga titles with status, year, score, formats, genres, and cover images.",
      "documentationUrl": "https://docs.anilist.co/guide/graphql/",
      "method": "POST",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=anilist-graphql",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "reason": "AniList documents Retry-After and X-RateLimit-Reset on HTTP 429, and may temporarily lower its normal quota during degraded service. Generic health verification records the first 429 and defers another provider request to a later independent run.",
        "policyUrl": "https://docs.anilist.co/guide/rate-limiting"
      },
      "usageNote": "AniList provides a public GraphQL API and documents rate-limit headers plus Retry-After on HTTP 429. Its normal quota may be temporarily reduced during degraded service, so keep browser checks bounded and never retry a 429 immediately.",
      "parameters": [
        {
          "id": "query",
          "label": "Anime or manga search",
          "type": "text",
          "defaultValue": "Fullmetal Alchemist",
          "help": "Search titles by English or romanized name."
        },
        {
          "id": "mediaType",
          "label": "Media type",
          "type": "select",
          "defaultValue": "ANIME",
          "help": "Search anime or manga media.",
          "options": [
            {
              "label": "Anime",
              "value": "ANIME"
            },
            {
              "label": "Manga",
              "value": "MANGA"
            }
          ]
        },
        {
          "id": "page",
          "label": "Page",
          "type": "number",
          "defaultValue": "1",
          "help": "Return page 1 to 10.",
          "min": 1,
          "max": 10
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 20 records.",
          "min": 1,
          "max": 20
        }
      ]
    },
    {
      "id": "openverse-search",
      "name": "Openverse Media Search",
      "provider": "Openverse",
      "category": "Media",
      "description": "Search openly licensed images and audio by keyword, then reuse attribution-ready media results.",
      "documentationUrl": "https://api.openverse.org/v1/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=openverse-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Anonymous Openverse requests are rate limited. Openverse aggregates openly licensed media but does not guarantee license metadata accuracy; verify each work’s source license and attribution requirements before reuse.",
      "parameters": [
        {
          "id": "query",
          "label": "Media search",
          "type": "text",
          "defaultValue": "space",
          "help": "Search openly licensed media titles, descriptions, and tags.",
          "minLength": 1
        },
        {
          "id": "contentType",
          "label": "Media type",
          "type": "select",
          "defaultValue": "image",
          "help": "Query images or audio separately.",
          "options": [
            {
              "label": "Images",
              "value": "image"
            },
            {
              "label": "Audio",
              "value": "audio"
            }
          ]
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 media records.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "apple-itunes-search",
      "name": "Apple iTunes Search",
      "provider": "Apple",
      "category": "Media",
      "description": "Search Apple music and podcast catalog identities, metadata, and storefront links without embedding promotional artwork or previews.",
      "documentationUrl": "https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/Searching.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=apple-itunes-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Apple defines entity values relative to the selected media type and documents an approximate 20 calls/minute Search API limit subject to change. This demo exposes compatible music/podcast result types and derives the media parameter from that declared entity. Apple promotional-content terms impose store-promotion, badge, attribution, streaming, and placement conditions, so the semantic card intentionally does not embed artwork or audio/video previews.",
      "parameters": [
        {
          "id": "query",
          "label": "Search term",
          "type": "text",
          "defaultValue": "Beatles",
          "help": "Search across Apple public media indexes.",
          "minLength": 1
        },
        {
          "id": "entity",
          "label": "Result type",
          "type": "select",
          "defaultValue": "song",
          "help": "Choose one result entity; Public-API derives the compatible Apple media category from this same selection.",
          "options": [
            {
              "label": "Music · Song",
              "value": "song"
            },
            {
              "label": "Music · Track",
              "value": "musicTrack"
            },
            {
              "label": "Music · Album",
              "value": "album"
            },
            {
              "label": "Music · Artist",
              "value": "musicArtist"
            },
            {
              "label": "Music · Video",
              "value": "musicVideo"
            },
            {
              "label": "Music · Mix",
              "value": "mix"
            },
            {
              "label": "Podcast · Show",
              "value": "podcast"
            },
            {
              "label": "Podcast · Author",
              "value": "podcastAuthor"
            }
          ]
        },
        {
          "id": "country",
          "label": "Country",
          "type": "text",
          "defaultValue": "sg",
          "help": "Use a two-letter ISO 3166-1 alpha-2 country code for the iTunes Store storefront, such as SG or US.",
          "minLength": 2,
          "maxLength": 2,
          "pattern": "[A-Za-z]{2}",
          "patternDescription": "must contain exactly two letters for an ISO 3166-1 alpha-2 country code."
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 results.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "hebcal-calendar",
      "name": "Hebcal Calendar",
      "provider": "Hebcal",
      "category": "Calendar",
      "description": "Browse a full Hebrew year of Jewish holidays, weekly Torah portions, Rosh Chodesh, and modern observances.",
      "documentationUrl": "https://www.hebcal.com/home/195/jewish-calendar-rest-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=hebcal-calendar",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "rateLimitStatuses": [
          429
        ],
        "reason": "Hebcal documents HTTP 429 after more than 90 requests in a 10-second window. Automated verification records the first 429 and defers another provider request instead of compounding the rate limit.",
        "policyUrl": "https://www.hebcal.com/home/developer-apis"
      },
      "usageNote": "Hebcal Jewish Calendar API content is CC BY 4.0 and requires attribution. No API key is required. Hebcal warns that clients making more than 90 requests in a 10-second window may receive HTTP 429, so automated checks stay bounded and do not immediately retry a rate-limited request.",
      "parameters": [
        {
          "id": "year",
          "label": "Hebrew year",
          "type": "number",
          "defaultValue": "5787",
          "help": "Use a four-digit Hebrew year. Public-API sends yt=H so the provider interprets the year as Hebrew, not Gregorian.",
          "min": 5700,
          "max": 5800,
          "step": 1
        },
        {
          "id": "israel",
          "label": "Holiday schedule",
          "type": "select",
          "defaultValue": "off",
          "help": "Choose the Diaspora or Israel holiday schedule for the full Hebrew year.",
          "options": [
            {
              "label": "Diaspora",
              "value": "off"
            },
            {
              "label": "Israel",
              "value": "on"
            }
          ]
        }
      ]
    },
    {
      "id": "aladhan-prayer-times",
      "name": "AlAdhan Prayer Times",
      "provider": "Al-Adhan",
      "category": "Calendar",
      "description": "Return prayer timings, Hijri date metadata, and calculation data from coordinates.",
      "documentationUrl": "https://aladhan.com/prayer-times-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=aladhan-prayer-times",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The calculation-method selector is limited to AlAdhan’s current built-in method IDs. Method 11 is the default Singapore preset. Custom method 99 is excluded because this demo does not expose the required methodSettings contract.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "Use a valid WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "Use a valid WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "method",
          "label": "Calculation method",
          "type": "select",
          "defaultValue": "11",
          "help": "Choose one built-in method advertised by AlAdhan. Method 11 is the Singapore preset.",
          "options": [
            {
              "label": "11 — Majlis Ugama Islam Singapura, Singapore",
              "value": "11"
            },
            {
              "label": "17 — JAKIM, Malaysia",
              "value": "17"
            },
            {
              "label": "3 — Muslim World League",
              "value": "3"
            },
            {
              "label": "2 — Islamic Society of North America (ISNA)",
              "value": "2"
            },
            {
              "label": "5 — Egyptian General Authority of Survey",
              "value": "5"
            },
            {
              "label": "4 — Umm Al-Qura University, Makkah",
              "value": "4"
            },
            {
              "label": "1 — University of Islamic Sciences, Karachi",
              "value": "1"
            },
            {
              "label": "7 — Institute of Geophysics, University of Tehran",
              "value": "7"
            },
            {
              "label": "0 — Shia Ithna-Ashari, Leva Institute, Qum",
              "value": "0"
            },
            {
              "label": "8 — Gulf Region",
              "value": "8"
            },
            {
              "label": "9 — Kuwait",
              "value": "9"
            },
            {
              "label": "10 — Qatar",
              "value": "10"
            },
            {
              "label": "12 — Union Organization Islamic de France",
              "value": "12"
            },
            {
              "label": "13 — Diyanet İşleri Başkanlığı, Turkey",
              "value": "13"
            },
            {
              "label": "14 — Spiritual Administration of Muslims of Russia",
              "value": "14"
            },
            {
              "label": "15 — Moonsighting Committee Worldwide",
              "value": "15"
            },
            {
              "label": "16 — Dubai",
              "value": "16"
            },
            {
              "label": "18 — Tunisia",
              "value": "18"
            },
            {
              "label": "19 — Algeria",
              "value": "19"
            },
            {
              "label": "20 — Kementerian Agama Republik Indonesia",
              "value": "20"
            },
            {
              "label": "21 — Morocco",
              "value": "21"
            },
            {
              "label": "22 — Comunidade Islamica de Lisboa",
              "value": "22"
            },
            {
              "label": "23 — Ministry of Awqaf, Islamic Affairs and Holy Places, Jordan",
              "value": "23"
            }
          ]
        },
        {
          "id": "date",
          "label": "Date",
          "type": "date",
          "defaultValue": "2026-10-09",
          "help": "Use a Gregorian date in YYYY-MM-DD format. Public-API converts it to AlAdhan’s DD-MM-YYYY path format."
        }
      ]
    },
    {
      "id": "jolpica-f1",
      "name": "Jolpica F1 Data",
      "provider": "Jolpica",
      "category": "Sports",
      "description": "Browse Formula 1 season driver, constructor, or race-catalogue records from the Ergast-compatible Jolpica API.",
      "documentationUrl": "https://github.com/jolpica/jolpica-f1/blob/main/docs/README.md",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=jolpica-f1",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Non-commercial use under CC BY-NC-SA 4.0. Unauthenticated access is currently limited to 4 requests/second and 500 requests/hour; cache historical data where practical. The dataset selector changes the response shape: drivers and constructors are season participation catalogues, while races are the season calendar, not standings or race results.",
      "parameters": [
        {
          "id": "season",
          "label": "Season",
          "type": "select",
          "defaultValue": "2025",
          "help": "Choose an F1 season.",
          "options": [
            {
              "label": "2025",
              "value": "2025"
            },
            {
              "label": "2024",
              "value": "2024"
            },
            {
              "label": "2023",
              "value": "2023"
            }
          ]
        },
        {
          "id": "dataset",
          "label": "Dataset",
          "type": "select",
          "defaultValue": "drivers",
          "help": "Pick a public F1 data table.",
          "options": [
            {
              "label": "Drivers",
              "value": "drivers"
            },
            {
              "label": "Constructors",
              "value": "constructors"
            },
            {
              "label": "Races",
              "value": "races"
            }
          ]
        },
        {
          "id": "limit",
          "label": "Rows",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 30 rows.",
          "min": 1,
          "max": 30
        }
      ]
    },
    {
      "id": "hn-search-algolia",
      "name": "HN Search",
      "provider": "Algolia",
      "category": "News",
      "description": "Search Hacker News stories and comments with scoring, points, and publication data.",
      "documentationUrl": "https://hn.algolia.com/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=hn-search-algolia",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Search term",
          "type": "text",
          "defaultValue": "OpenAI",
          "help": "Search public Hacker News posts and comments.",
          "minLength": 1
        },
        {
          "id": "tag",
          "label": "Content type",
          "type": "select",
          "defaultValue": "story",
          "help": "Choose stories or comments.",
          "options": [
            {
              "label": "Stories",
              "value": "story"
            },
            {
              "label": "Comments",
              "value": "comment"
            },
            {
              "label": "Stories and comments",
              "value": "(story,comment)"
            }
          ]
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 20 search hits.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "bank-of-canada-valet",
      "name": "Bank of Canada Valet",
      "provider": "Bank of Canada",
      "category": "Finance",
      "description": "Read official BOC observations such as USD/CAD and interest-rate series.",
      "documentationUrl": "https://www.bankofcanada.ca/valet-api-how-to/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=bank-of-canada-valet",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "series",
          "label": "Series",
          "type": "text",
          "defaultValue": "FXUSDCAD",
          "help": "Use one public Bank of Canada series code. This card intentionally renders one request-bound series at a time.",
          "minLength": 1,
          "pattern": "[A-Za-z0-9_.-]+",
          "patternDescription": "must be one Bank of Canada series code using only letters, digits, underscores, periods, or hyphens."
        },
        {
          "id": "startDate",
          "label": "Start date",
          "type": "date",
          "defaultValue": "2026-09-09",
          "help": "Bank of Canada Valet requires YYYY-MM-DD."
        },
        {
          "id": "endDate",
          "label": "End date",
          "type": "date",
          "defaultValue": "2026-10-09",
          "help": "Bank of Canada Valet requires YYYY-MM-DD on or after the start date.",
          "minimumFromField": "startDate"
        }
      ]
    },
    {
      "id": "swiss-transit-connections",
      "name": "Swiss Transit Connections",
      "provider": "Swiss Mobility",
      "category": "Utility",
      "description": "Search Swiss public-transit connections by origin and destination with transfers and timing metadata.",
      "keywords": [
        "train connections",
        "rail journey",
        "public transport"
      ],
      "documentationUrl": "https://transport.opendata.ch/docs.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=swiss-transit-connections",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "from",
          "label": "Origin",
          "type": "text",
          "defaultValue": "Zurich",
          "help": "Enter a station or place name.",
          "minLength": 1
        },
        {
          "id": "to",
          "label": "Destination",
          "type": "text",
          "defaultValue": "Geneva",
          "help": "Enter a destination station or place name.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Connections",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 10 connections.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "nasa-power-climate",
      "name": "NASA POWER Climate",
      "provider": "NASA POWER",
      "category": "Environment",
      "description": "Fetch climate and weather variables such as temperature, humidity, solar radiation, and precipitation.",
      "keywords": [
        "climate data by coordinates",
        "weather by coordinates",
        "daily climate variables"
      ],
      "documentationUrl": "https://power.larc.nasa.gov/docs/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nasa-power-climate",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "startDate",
          "label": "Start date",
          "type": "date",
          "defaultValue": "2026-09-09",
          "help": "Choose an ISO date in YYYY-MM-DD format. Public-API converts it to NASA POWER’s YYYYMMDD wire format."
        },
        {
          "id": "endDate",
          "label": "End date",
          "type": "date",
          "defaultValue": "2026-10-09",
          "help": "Choose an ISO date in YYYY-MM-DD format on or after the start date. Public-API converts it to NASA POWER’s YYYYMMDD wire format.",
          "minimumFromField": "startDate"
        },
        {
          "id": "parameters",
          "label": "Parameters",
          "type": "text",
          "defaultValue": "T2M,PRECTOTCORR,WS10M,RH2M,ALLSKY_SFC_SW_DWN",
          "help": "Comma-separated POWER parameter codes.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "open-meteo-elevation",
      "name": "Open-Meteo Elevation",
      "provider": "Open-Meteo",
      "category": "Geo",
      "description": "Fetch terrain elevation in meters for selected WGS84 coordinates from the Copernicus DEM 2021 GLO-90 dataset.",
      "documentationUrl": "https://open-meteo.com/en/docs/elevation-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-meteo-elevation",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Copernicus DEM 2021 GLO-90 terrain data at 90 m resolution. Open-Meteo requires clear attribution to both the Copernicus programme and Open-Meteo.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        }
      ]
    },
    {
      "id": "zippopotam-postcode",
      "name": "Zippopotam Postcode",
      "provider": "Zippopotam",
      "category": "Geo",
      "description": "Convert a country code and postal code into city, state, and coordinate metadata.",
      "documentationUrl": "https://docs.zippopotam.us/docs/v1/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=zippopotam-postcode",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Zippopotam.us v1 looks up places by ISO 3166-1 alpha-2 country and country-specific postal code; one postal code may return multiple places, and the documented latitude/longitude fields are JSON strings. Use focused user-driven lookups rather than broad scans.",
      "parameters": [
        {
          "id": "country",
          "label": "Country code",
          "type": "text",
          "defaultValue": "us",
          "help": "Use a supported ISO 3166-1 alpha-2 country code such as US, GB, or MY.",
          "minLength": 2,
          "maxLength": 2,
          "pattern": "[A-Za-z]{2}",
          "patternDescription": "must contain exactly two letters for an ISO 3166-1 alpha-2 country code."
        },
        {
          "id": "postalCode",
          "label": "Postcode",
          "type": "text",
          "defaultValue": "10001",
          "help": "Provide a supported country-specific postcode."
        }
      ]
    },
    {
      "id": "irail-liveboard",
      "name": "Belgian Rail Liveboard",
      "provider": "iRail",
      "category": "Utility",
      "description": "Read live Belgian train departures or arrivals with platforms, delays, cancellations, and destinations.",
      "documentationUrl": "https://docs.irail.be/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=irail-liveboard",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Public community service. Keep requests user-driven and retain a modest refresh interval.",
      "parameters": [
        {
          "id": "station",
          "label": "Station",
          "type": "select",
          "defaultValue": "Brussels-South",
          "help": "Choose a Belgian railway station.",
          "options": [
            {
              "label": "Brussels-South",
              "value": "Brussels-South"
            },
            {
              "label": "Gent-Sint-Pieters",
              "value": "Gent-Sint-Pieters"
            },
            {
              "label": "Antwerpen-Centraal",
              "value": "Antwerpen-Centraal"
            },
            {
              "label": "Brugge",
              "value": "Brugge"
            }
          ]
        },
        {
          "id": "direction",
          "label": "Board direction",
          "type": "select",
          "defaultValue": "departure",
          "help": "Show departing or arriving services.",
          "options": [
            {
              "label": "Departures",
              "value": "departure"
            },
            {
              "label": "Arrivals",
              "value": "arrival"
            }
          ]
        }
      ]
    },
    {
      "id": "spaceflight-news",
      "name": "Spaceflight News",
      "provider": "The Space Devs",
      "category": "News",
      "description": "Browse recent spaceflight reporting with publishers, summaries, images, publication dates, and related missions.",
      "documentationUrl": "https://api.spaceflightnewsapi.net/v4/docs/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=spaceflight-news",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "News search",
          "type": "text",
          "defaultValue": "NASA",
          "help": "Search titles and summaries from indexed spaceflight publishers.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Articles",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 10 articles.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "launch-library-upcoming",
      "name": "Upcoming Space Launches",
      "provider": "The Space Devs",
      "category": "Calendar",
      "description": "Track upcoming rocket launches with mission, provider, pad, status, image, and scheduled launch time.",
      "documentationUrl": "https://ll.thespacedevs.com/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=launch-library-upcoming",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 240,
        "retryOnNon2xx": false,
        "reason": "TheSpaceDevs documents anonymous Launch Library access at up to 15 requests per hour. Automated production verification therefore spaces probes by at least four minutes and never adds an immediate same-run retry after a non-2xx response.",
        "policyUrl": "https://thespacedevs.com/llapi"
      },
      "usageNote": "Launch Library 2.3.0 is the current supported production API; 2.2.0 is unsupported. Anonymous production access is limited to 15 requests per hour. Automated verification is conservatively spaced to at most one production request every four minutes; use the provider development endpoint for repeated integration testing.",
      "parameters": [
        {
          "id": "query",
          "label": "Launch search",
          "type": "text",
          "defaultValue": "SpaceX",
          "help": "Filter upcoming launches by the provider's documented mission, launch, pad, rocket, spacecraft, or launch-service-provider search fields.",
          "minLength": 1,
          "maxLength": 120
        },
        {
          "id": "limit",
          "label": "Launches",
          "type": "number",
          "defaultValue": "4",
          "help": "Return between 1 and 6 upcoming launches.",
          "min": 1,
          "max": 6,
          "step": 1
        }
      ]
    },
    {
      "id": "wiktionary-entry",
      "name": "Wiktionary Definitions",
      "provider": "Wikimedia Foundation",
      "category": "Language",
      "description": "Look up structured English definitions, parts of speech, examples, related words, and language information.",
      "documentationUrl": "https://en.wiktionary.org/api/rest_v1/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=wiktionary-entry",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "word",
          "label": "English word",
          "type": "text",
          "defaultValue": "hello",
          "help": "Enter one English Wiktionary headword.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "animechan-random-quote",
      "name": "Anime Quote Generator",
      "provider": "AnimeChan",
      "category": "Entertainment",
      "description": "Generate an anime quote with its character and series metadata for cards, prompts, and entertainment demos.",
      "documentationUrl": "https://animechan.io/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=animechan-random-quote",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The keyless free tier allows 100 requests per day per IP address. Exceeding that limit returns HTTP 429, and the free-tier window refills 24 hours after its first request. Keep requests user-driven and avoid high-frequency refreshes.",
      "parameters": []
    },
    {
      "id": "jokeapi-safe",
      "name": "Safe Joke Generator",
      "provider": "JokeAPI",
      "category": "Games",
      "description": "Generate a safe joke with category, language, delivery style, and moderation flags.",
      "documentationUrl": "https://v2.jokeapi.dev/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=jokeapi-safe",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Safe mode is always enabled. The anonymous service permits up to 120 requests per minute.",
      "parameters": [
        {
          "id": "category",
          "label": "Category",
          "type": "select",
          "defaultValue": "Programming",
          "help": "Choose a safe joke category.",
          "options": [
            {
              "label": "Programming",
              "value": "Programming"
            },
            {
              "label": "Pun",
              "value": "Pun"
            },
            {
              "label": "Miscellaneous",
              "value": "Misc"
            },
            {
              "label": "Christmas",
              "value": "Christmas"
            }
          ]
        },
        {
          "id": "type",
          "label": "Joke format",
          "type": "select",
          "defaultValue": "twopart",
          "help": "Return a one-line or setup-and-delivery joke.",
          "options": [
            {
              "label": "Setup and delivery",
              "value": "twopart"
            },
            {
              "label": "Single line",
              "value": "single"
            }
          ]
        }
      ]
    },
    {
      "id": "dummyjson-recipes",
      "name": "Recipe Explorer",
      "provider": "DummyJSON",
      "category": "Food",
      "description": "Prototype a recipe application using structured ingredients, instructions, cuisine, ratings, and food imagery.",
      "documentationUrl": "https://dummyjson.com/docs/recipes",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=dummyjson-recipes",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "DummyJSON supplies synthetic placeholder data intended for prototypes, demonstrations, and UI development. Its repository code licence does not establish reuse rights for individual recipe content or images.",
      "parameters": [
        {
          "id": "query",
          "label": "Recipe search",
          "type": "text",
          "defaultValue": "pasta",
          "help": "Search recipe names and indexed recipe text.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Recipes",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 10 recipes.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "brasilapi-postcode",
      "name": "Brazil Postcode Explorer",
      "provider": "BrasilAPI",
      "category": "Geo",
      "description": "Resolve a Brazilian CEP into address, neighbourhood, city, state, timezone, provider, and coordinates.",
      "documentationUrl": "https://brasilapi.com.br/docs#tag/CEP-V2",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=brasilapi-postcode",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Use bounded single-CEP lookups only. BrasilAPI asks clients not to crawl or full-scan the CEP range.",
      "parameters": [
        {
          "id": "postcode",
          "label": "Brazilian CEP",
          "type": "text",
          "defaultValue": "01310930",
          "help": "Enter exactly eight digits, with or without a hyphen.",
          "pattern": "\\d{5}-?\\d{3}",
          "patternDescription": "must contain exactly eight digits, optionally formatted as 12345-678."
        }
      ]
    },
    {
      "id": "poetrydb-poems",
      "name": "PoetryDB Reader",
      "provider": "PoetryDB",
      "category": "Books",
      "description": "Read a small random selection of public-domain poems from a selected author with titles and full lines.",
      "documentationUrl": "https://github.com/thundercomb/poetrydb",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=poetrydb-poems",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "author",
          "label": "Poet",
          "type": "select",
          "defaultValue": "Emily Dickinson",
          "help": "Choose a poet represented in PoetryDB.",
          "options": [
            {
              "label": "Emily Dickinson",
              "value": "Emily Dickinson"
            },
            {
              "label": "William Shakespeare",
              "value": "William Shakespeare"
            },
            {
              "label": "William Blake",
              "value": "William Blake"
            },
            {
              "label": "Edgar Allan Poe",
              "value": "Edgar Allan Poe"
            }
          ]
        },
        {
          "id": "count",
          "label": "Poems",
          "type": "number",
          "defaultValue": "3",
          "help": "Return between 1 and 4 randomly selected poems.",
          "min": 1,
          "max": 4
        }
      ]
    },
    {
      "id": "coingecko-keyless-market",
      "name": "CoinGecko Keyless Market",
      "provider": "CoinGecko",
      "category": "Finance",
      "description": "Read a keyless cryptocurrency price snapshot with market cap, 24-hour volume, and daily change.",
      "documentationUrl": "https://docs.coingecko.com/docs/keyless-public-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=coingecko-keyless-market",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "reason": "CoinGecko says HTTP 429 means the rate limit was exceeded and all requests, including errors, count toward the per-minute limit. Generic health verification records the first 429 and defers another provider request to a later independent run instead of immediately adding another counted call.",
        "policyUrl": "https://docs.coingecko.com/docs/errors-and-rate-limits"
      },
      "usageNote": "Shared keyless IP-based rate-limit pool for light, non-commercial experimentation. CoinGecko says HTTP 429 means the rate limit was exceeded, to reduce call frequency, and that all requests including 4xx/5xx count toward the per-minute limit.",
      "parameters": [
        {
          "id": "coin",
          "label": "Cryptocurrency",
          "type": "select",
          "defaultValue": "bitcoin",
          "help": "Choose one CoinGecko asset identifier.",
          "options": [
            {
              "label": "Bitcoin",
              "value": "bitcoin"
            },
            {
              "label": "Ethereum",
              "value": "ethereum"
            },
            {
              "label": "Solana",
              "value": "solana"
            },
            {
              "label": "Dogecoin",
              "value": "dogecoin"
            }
          ]
        },
        {
          "id": "currency",
          "label": "Quote currency",
          "type": "select",
          "defaultValue": "usd",
          "help": "Choose a supported quote currency.",
          "options": [
            {
              "label": "USD",
              "value": "usd"
            },
            {
              "label": "SGD",
              "value": "sgd"
            },
            {
              "label": "EUR",
              "value": "eur"
            }
          ]
        }
      ]
    },
    {
      "id": "swapi-people",
      "name": "Star Wars People",
      "provider": "SWAPI",
      "category": "Entertainment",
      "description": "Search Star Wars characters and inspect species-era profile fields including birth year, homeworld, and films.",
      "documentationUrl": "https://swapi.dev/documentation",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=swapi-people",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Character search",
          "type": "text",
          "defaultValue": "Luke",
          "help": "Search Star Wars character names."
        }
      ]
    },
    {
      "id": "malaysia-core-cpi",
      "name": "Malaysia Core CPI",
      "provider": "data.gov.my",
      "category": "Economy",
      "description": "Track Malaysia’s monthly overall core consumer price index, with index level and reporting month kept explicit.",
      "documentationUrl": "https://data.gov.my/data-catalogue/cpi_core",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=malaysia-core-cpi",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "DOSM defines this as a monthly CPI index with base 2010 = 100, not an inflation percentage. Core CPI excludes volatile-price or government-administered items. The demo filters division=overall and retains CC BY 4.0 attribution.",
      "parameters": [
        {
          "id": "limit",
          "label": "Months",
          "type": "number",
          "defaultValue": "12",
          "help": "Return between 6 and 60 monthly overall-index observations.",
          "min": 6,
          "max": 60,
          "step": 1
        }
      ]
    },
    {
      "id": "malaysia-household-income",
      "name": "Malaysia Household Income",
      "provider": "data.gov.my",
      "category": "Economy",
      "description": "Compare Malaysia mean and median nominal gross monthly household income across published HIES survey observations.",
      "documentationUrl": "https://data.gov.my/data-catalogue/hh_income",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=malaysia-household-income",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "DOSM publishes nominal RM values that are not inflation-adjusted. HIES observations are survey years, not a complete consecutive annual series.",
      "parameters": [
        {
          "id": "limit",
          "label": "Survey observations",
          "type": "number",
          "defaultValue": "10",
          "help": "Return between 6 and 30 published HIES observations.",
          "min": 6,
          "max": 30,
          "step": 1
        }
      ]
    },
    {
      "id": "malaysia-population",
      "name": "Malaysia Population",
      "provider": "data.gov.my",
      "category": "Economy",
      "description": "Track Malaysia national total population by year using both sexes, all ages, and all ethnicities.",
      "documentationUrl": "https://data.gov.my/data-catalogue/population_malaysia",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=malaysia-population",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "DOSM publishes population in thousands of people ('000). This demo filters all demographic dimensions to their overall totals so each row is one national yearly observation.",
      "parameters": [
        {
          "id": "limit",
          "label": "Years",
          "type": "number",
          "defaultValue": "10",
          "help": "Return between 6 and 57 annual national-total observations.",
          "min": 6,
          "max": 57,
          "step": 1
        }
      ]
    },
    {
      "id": "openfda-food-recalls",
      "name": "openFDA Food Recalls",
      "provider": "U.S. FDA",
      "category": "Food",
      "description": "Explore FDA food recall notices by product, manufacturer, reason, and enforcement event.",
      "documentationUrl": "https://open.fda.gov/apis/food/enforcement/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=openfda-food-recalls",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Recall search",
          "type": "text",
          "defaultValue": "peanut",
          "help": "Search one quoted phrase across FDA product descriptions and reasons for recall.",
          "minLength": 1,
          "maxLength": 80,
          "pattern": "[^\"\\\\]+",
          "patternDescription": "must not contain double quotes or backslashes because those characters alter openFDA search syntax."
        },
        {
          "id": "limit",
          "label": "Records",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 30 records.",
          "min": 1,
          "max": 30
        }
      ]
    },
    {
      "id": "iconify-search",
      "name": "Iconify Search",
      "provider": "Iconify",
      "category": "Utility",
      "description": "Search Iconify icon identifiers and preserve the matching icon-set author and licence metadata for UI prototyping.",
      "documentationUrl": "https://iconify.design/docs/api/search.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=iconify-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Show icon licensing and attribution context when exporting catalog entries.",
      "parameters": [
        {
          "id": "query",
          "label": "Icon keyword",
          "type": "text",
          "defaultValue": "home",
          "help": "Search icon keywords across public sets."
        },
        {
          "id": "limit",
          "label": "Icons",
          "type": "number",
          "defaultValue": "32",
          "help": "Iconify accepts 32 to 999 search results; this demo caps the browser payload at 60.",
          "min": 32,
          "max": 60
        }
      ]
    },
    {
      "id": "homebrew-formula-json",
      "name": "Homebrew Formula JSON",
      "provider": "Homebrew",
      "category": "Developer",
      "description": "Inspect one exact Homebrew formula or cask token, preserving package identity, version, dependencies or app artifacts, licence, and platform metadata.",
      "documentationUrl": "https://formulae.brew.sh/docs/api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=homebrew-formula-json",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Homebrew API is community-maintained; keep request volume low for reliability.",
      "parameters": [
        {
          "id": "formula",
          "label": "Formula or cask token",
          "type": "text",
          "defaultValue": "node",
          "help": "Enter the exact current Homebrew formula/cask token used in formulae.brew.sh URLs; aliases and former tokens are not direct JSON endpoint names.",
          "minLength": 1
        },
        {
          "id": "collection",
          "label": "Collection",
          "type": "select",
          "defaultValue": "formula",
          "help": "Select Formula or Cask metadata source.",
          "options": [
            {
              "label": "Formula",
              "value": "formula"
            },
            {
              "label": "Cask",
              "value": "cask"
            }
          ]
        }
      ]
    },
    {
      "id": "npm-download-counts",
      "name": "npm Download Counts",
      "provider": "npm",
      "category": "Developer",
      "description": "Track npm package download counts via point windows suitable for popularity trend snapshots.",
      "documentationUrl": "https://github.com/npm/registry/blob/main/docs/download-counts.md",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=npm-download-counts",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "packageName",
          "label": "Package name",
          "type": "text",
          "defaultValue": "react",
          "help": "Use npm scope syntax if needed (left side only)."
        },
        {
          "id": "period",
          "label": "Window",
          "type": "select",
          "defaultValue": "last-week",
          "help": "Choose a point download period.",
          "options": [
            {
              "label": "Last week",
              "value": "last-week"
            },
            {
              "label": "Last month",
              "value": "last-month"
            },
            {
              "label": "Last day",
              "value": "last-day"
            }
          ]
        }
      ]
    },
    {
      "id": "geoboundaries-admin-boundaries",
      "name": "geoBoundaries Admin Boundaries",
      "provider": "geoBoundaries",
      "category": "Geo",
      "description": "Inspect gbOpen administrative-boundary layer metadata, provenance, per-unit geometry statistics, and provider download links.",
      "documentationUrl": "https://www.geoboundaries.org/api.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=geoboundaries-admin-boundaries",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "geoBoundaries requires attribution for programmatic/API use. This demo uses gbOpen. The returned boundaryLicense is the original source-data license; geometry is provided through download URLs, and meanAreaSqKM/meanPerimeterLengthKM are averages across administrative units rather than total country measurements. Country code ALL is supported but returns a large multi-country layer collection; prefer a specific ISO code when you only need one country.",
      "parameters": [
        {
          "id": "countryIso",
          "label": "Country ISO",
          "type": "text",
          "defaultValue": "SGP",
          "help": "Use an ISO 3166-1 alpha-3 country code such as SGP, GBR, or USA. The special ALL code returns a multi-country collection for the selected administrative level.",
          "minLength": 3,
          "maxLength": 3,
          "pattern": "[A-Za-z]{3}",
          "patternDescription": "must contain exactly three letters (an ISO 3166-1 alpha-3 code or the special ALL code)."
        },
        {
          "id": "adminLevel",
          "label": "Admin level",
          "type": "select",
          "defaultValue": "ADM0",
          "help": "geoBoundaries accepts ADM0 through ADM5, but available levels vary by country.",
          "options": [
            {
              "label": "ADM0",
              "value": "ADM0"
            },
            {
              "label": "ADM1",
              "value": "ADM1"
            },
            {
              "label": "ADM2",
              "value": "ADM2"
            },
            {
              "label": "ADM3",
              "value": "ADM3"
            },
            {
              "label": "ADM4",
              "value": "ADM4"
            },
            {
              "label": "ADM5",
              "value": "ADM5"
            }
          ]
        }
      ]
    },
    {
      "id": "osrm-route",
      "name": "OSRM Route",
      "provider": "Project OSRM",
      "category": "Geo",
      "description": "Calculate route distance, estimated duration, snapped endpoints, route geometry, and turn-by-turn steps on public roads from start to destination.",
      "documentationUrl": "https://project-osrm.org/docs/v26.6.1/http",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=osrm-route",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 1,
        "retryOnNon2xx": false,
        "reason": "The official OSRM demo-server policy says not to exceed one request per second. Automated verification therefore uses a cadence-aware journey and does not immediately retry a non-2xx response.",
        "policyUrl": "https://github.com/Project-OSRM/osrm-backend/wiki/Demo-server"
      },
      "usageNote": "The public OSRM demo server is restricted to reasonable, non-commercial use, must not exceed 1 request per second, and provides no uptime, latency, or data-update guarantees. Keep requests bounded; self-host OSRM for production workloads.",
      "parameters": [
        {
          "id": "startLatitude",
          "label": "Start latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "Source latitude in degrees.",
          "min": -90,
          "max": 90
        },
        {
          "id": "startLongitude",
          "label": "Start longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "Source longitude in degrees.",
          "min": -180,
          "max": 180
        },
        {
          "id": "endLatitude",
          "label": "End latitude",
          "type": "number",
          "defaultValue": "1.290270",
          "help": "Destination latitude in degrees.",
          "min": -90,
          "max": 90
        },
        {
          "id": "endLongitude",
          "label": "End longitude",
          "type": "number",
          "defaultValue": "103.851959",
          "help": "Destination longitude in degrees.",
          "min": -180,
          "max": 180
        },
        {
          "id": "alternatives",
          "label": "Alternatives",
          "type": "number",
          "defaultValue": "1",
          "help": "Request up to one to three alternative routes; OSRM does not guarantee that every requested alternative exists.",
          "min": 1,
          "max": 3,
          "step": 1
        }
      ]
    },
    {
      "id": "opendota-pro-matches",
      "name": "OpenDota Matches",
      "provider": "OpenDota",
      "category": "Games",
      "description": "Pull the provider-defined recent batch of professional Dota 2 matches with league and team metadata for esports inspection.",
      "documentationUrl": "https://docs.opendota.com/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=opendota-pro-matches",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "OpenDota /proMatches does not expose a result-count limit; it currently returns a provider-sized recent batch and supports less_than_match_id only for older-match pagination. The Request Lab therefore does not claim a non-existent limit control.",
      "parameters": []
    },
    {
      "id": "openligadb-matches",
      "name": "OpenLigaDB",
      "provider": "OpenLigaDB",
      "category": "Sports",
      "description": "Read community football match schedules and outcomes from OpenLigaDB leagues.",
      "documentationUrl": "https://api.openligadb.de/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=openligadb-matches",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "OpenLigaDB is a community-maintained, keyless API whose data is licensed under ODbL 1.0. The provider asks clients to query sparingly and documents a limit of 60 requests per minute and IP.",
      "parameters": [
        {
          "id": "league",
          "label": "League shortcut",
          "type": "text",
          "defaultValue": "bl1",
          "help": "Use a short league identifier, such as bl1."
        },
        {
          "id": "season",
          "label": "Season year",
          "type": "number",
          "defaultValue": "2025",
          "help": "Use a published season start year.",
          "min": 2000,
          "max": 2026
        },
        {
          "id": "matchday",
          "label": "Matchday",
          "type": "number",
          "defaultValue": "1",
          "help": "Load one matchday to keep the browser response small and reliable.",
          "min": 1,
          "max": 50
        }
      ]
    },
    {
      "id": "uk-parliament-members",
      "name": "UK Parliament Members",
      "provider": "UK Parliament",
      "category": "Government",
      "description": "Search current members of the UK House of Commons or House of Lords with party and latest-house membership metadata.",
      "documentationUrl": "https://members-api.parliament.uk/index.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=uk-parliament-members",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Member name",
          "type": "text",
          "defaultValue": "Rishi",
          "help": "Match current Commons or Lords members whose name contains this text."
        },
        {
          "id": "limit",
          "label": "Members",
          "type": "number",
          "defaultValue": "10",
          "help": "Return between 1 and 20 members. The provider calls this parameter take and caps it at 20.",
          "min": 1,
          "max": 20
        }
      ]
    },
    {
      "id": "mlb-stats-api",
      "name": "MLB Stats",
      "provider": "MLB",
      "category": "Sports",
      "description": "Pull MLB schedule snapshots and scoreboard data for date-based sports viewing and trend surfaces.",
      "documentationUrl": "https://github.com/toddrob99/MLB-StatsAPI/wiki/Endpoints",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=mlb-stats-api",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Unofficial MLB Stats API; this demo is intentionally fixed to MLB sportId=1 so Minor League schedules are not presented as MLB. MLB content/copyright terms apply.",
      "parameters": [
        {
          "id": "date",
          "label": "Schedule date",
          "type": "date",
          "defaultValue": "2026-10-09",
          "help": "Use a published game date in YYYY-MM-DD format."
        }
      ]
    },
    {
      "id": "google-dns-doh",
      "name": "Google DNS over HTTPS",
      "provider": "Google Public DNS",
      "category": "Developer",
      "description": "Resolve a domain name to its DNS records over HTTPS for developer troubleshooting and diagnostics.",
      "documentationUrl": "https://developers.google.com/speed/public-dns/docs/doh/json",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=google-dns-doh",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "name",
          "label": "Domain name",
          "type": "text",
          "defaultValue": "example.com",
          "help": "Enter a domain name to resolve. Google requires a non-empty DNS name; escaped-label and trailing-dot length rules remain provider-validated.",
          "minLength": 1
        },
        {
          "id": "type",
          "label": "Record type",
          "type": "select",
          "defaultValue": "A",
          "help": "Choose a DNS record type.",
          "options": [
            {
              "label": "A (IPv4)",
              "value": "A"
            },
            {
              "label": "AAAA (IPv6)",
              "value": "AAAA"
            },
            {
              "label": "MX (Mail)",
              "value": "MX"
            },
            {
              "label": "TXT",
              "value": "TXT"
            },
            {
              "label": "CNAME",
              "value": "CNAME"
            },
            {
              "label": "NS",
              "value": "NS"
            }
          ]
        }
      ]
    },
    {
      "id": "color-api",
      "name": "The Color API",
      "provider": "TheColorAPI",
      "category": "Utility",
      "description": "Convert a hex color into RGB, HSL, HSV, CMYK, a named color match, and a contrast recommendation.",
      "documentationUrl": "https://www.thecolorapi.com/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=color-api",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "hex",
          "label": "Hex color",
          "type": "text",
          "defaultValue": "24B1E0",
          "help": "Enter 3 or 6 hexadecimal digits, with or without the leading #.",
          "pattern": "#?(?:[0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})",
          "patternDescription": "must be a 3- or 6-digit hexadecimal color, with an optional leading #."
        }
      ]
    },
    {
      "id": "nasa-image-search",
      "name": "NASA Image & Video Library",
      "provider": "NASA",
      "category": "Media",
      "description": "Search NASA imagery, video, and audio with titles, descriptions, and thumbnail links.",
      "documentationUrl": "https://images.nasa.gov/docs/images.nasa.gov_api_docs.pdf",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nasa-image-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "NASA Images search defaults to 100 results per page; this browser demo requests eight. NASA content is generally not subject to U.S. copyright, but NASA brand identifiers and some third-party material have separate restrictions. Acknowledge NASA as the source and review NASA Media Usage Guidelines before reuse.",
      "parameters": [
        {
          "id": "query",
          "label": "Search term",
          "type": "text",
          "defaultValue": "moon",
          "help": "Search NASA media titles and descriptions.",
          "minLength": 1
        },
        {
          "id": "mediaType",
          "label": "Media type",
          "type": "select",
          "defaultValue": "image",
          "help": "Filter by media type.",
          "options": [
            {
              "label": "Image",
              "value": "image"
            },
            {
              "label": "Video",
              "value": "video"
            },
            {
              "label": "Audio",
              "value": "audio"
            }
          ]
        }
      ]
    },
    {
      "id": "lichess-top-players",
      "name": "Lichess Top Players",
      "provider": "Lichess",
      "category": "Games",
      "description": "Browse the current Lichess leaderboard for a chosen time control, including titles and ratings.",
      "documentationUrl": "https://lichess.org/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=lichess-top-players",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "reason": "Lichess says clients receiving HTTP 429 must wait a full minute before resuming API usage; generic health verification records the first 429 and defers another provider request to a later independent run.",
        "policyUrl": "https://lichess.org/page/api-tips"
      },
      "usageNote": "Public read-only endpoint. Lichess asks clients to make only one API request at a time and, after HTTP 429, wait a full minute before resuming API usage.",
      "parameters": [
        {
          "id": "perfType",
          "label": "Time control",
          "type": "select",
          "defaultValue": "blitz",
          "help": "Choose a Lichess rating leaderboard.",
          "options": [
            {
              "label": "Bullet",
              "value": "bullet"
            },
            {
              "label": "Blitz",
              "value": "blitz"
            },
            {
              "label": "Rapid",
              "value": "rapid"
            },
            {
              "label": "Classical",
              "value": "classical"
            }
          ]
        },
        {
          "id": "count",
          "label": "Players",
          "type": "number",
          "defaultValue": "5",
          "help": "Return between 1 and 10 top players.",
          "min": 1,
          "max": 10
        }
      ]
    },
    {
      "id": "pubmed-search",
      "name": "PubMed Search",
      "provider": "NCBI PubMed",
      "category": "Research",
      "description": "Search PubMed and return matching article identifiers along with the total result count.",
      "documentationUrl": "https://www.ncbi.nlm.nih.gov/books/NBK25499/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=pubmed-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "NCBI recommends no more than 3 E-utility requests per second without an API key and encourages distributed software developers to register tool/email identifiers. This bounded search returns PMIDs only; NCBI disclaimer and copyright terms apply to downstream content.",
      "parameters": [
        {
          "id": "term",
          "label": "Search term",
          "type": "text",
          "defaultValue": "covid",
          "help": "Search PubMed indexed terms and MeSH headings.",
          "minLength": 1
        },
        {
          "id": "retmax",
          "label": "Results",
          "type": "number",
          "defaultValue": "5",
          "help": "Return between 1 and 10 article identifiers.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "rxnorm-drug-search",
      "name": "RxNorm Drug Search",
      "provider": "U.S. National Library of Medicine",
      "category": "Health",
      "description": "Look up standardized drug names, brand products, and dosage forms from the RxNorm terminology.",
      "documentationUrl": "https://lhncbc.nlm.nih.gov/RxNav/APIs/RxNormAPIs.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=rxnorm-drug-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Data source: U.S. National Library of Medicine (NLM) RxNorm. For terminology normalization demonstrations only. Never treat this response as medical or prescribing advice.",
      "parameters": [
        {
          "id": "name",
          "label": "Drug name",
          "type": "text",
          "defaultValue": "ibuprofen",
          "help": "Enter a generic or brand drug name.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "inaturalist-observations",
      "name": "iNaturalist Observations",
      "provider": "iNaturalist",
      "category": "Biodiversity",
      "description": "Browse real, photographed species observations with location, date, and taxonomy.",
      "documentationUrl": "https://www.inaturalist.org/pages/api+reference",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=inaturalist-observations",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "rateLimitStatuses": [
          429
        ],
        "reason": "iNaturalist recommends about one API request per second and around 10,000 requests per day, and may throttle excess traffic with HTTP 429. Generic verification records the 429 and defers another provider request instead of immediately retrying.",
        "policyUrl": "https://www.inaturalist.org/pages/api+recommended+practices"
      },
      "usageNote": "Public read-only search. Keep automated requests near 1 request/second and about 10,000/day; respect HTTP 429 throttling. Photo rights are per image. iNaturalist warns that obscured API records can still expose exact dates and other clues; the semantic card coarsens restricted dates and withholds place labels, while Raw JSON remains the provider response.",
      "parameters": [
        {
          "id": "taxonName",
          "label": "Species search",
          "type": "text",
          "defaultValue": "Panthera",
          "help": "Search by scientific or common name. Taxon-name matches can include descendant taxa.",
          "minLength": 1
        },
        {
          "id": "perPage",
          "label": "Observations",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 10 observations.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "first-epss",
      "name": "FIRST EPSS Score",
      "provider": "FIRST.org",
      "category": "Developer",
      "description": "Look up a CVE's Exploit Prediction Scoring System probability and percentile of real-world exploitation.",
      "documentationUrl": "https://www.first.org/epss/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=first-epss",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "EPSS is a probability estimate, not a guarantee of exploitation. Use alongside CVSS and CISA KEV status.",
      "parameters": [
        {
          "id": "cve",
          "label": "CVE identifier",
          "type": "text",
          "defaultValue": "CVE-2021-44228",
          "help": "Enter a published CVE identifier using the CVE-YYYY-NNNN format.",
          "pattern": "CVE-[0-9]{4}-[0-9]{4,}",
          "patternDescription": "must use the CVE-YYYY-NNNN format with four or more sequence digits."
        }
      ]
    },
    {
      "id": "endoflife-date",
      "name": "endoflife.date Lifecycle",
      "provider": "endoflife.date",
      "category": "Developer",
      "description": "Check release, support, and end-of-life dates for popular software products and runtimes.",
      "documentationUrl": "https://endoflife.date/docs/api/v1/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=endoflife-date",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "product",
          "label": "Product",
          "type": "select",
          "defaultValue": "nodejs",
          "help": "Choose a tracked product.",
          "options": [
            {
              "label": "Node.js",
              "value": "nodejs"
            },
            {
              "label": "Python",
              "value": "python"
            },
            {
              "label": "PostgreSQL",
              "value": "postgresql"
            },
            {
              "label": "Ubuntu",
              "value": "ubuntu"
            },
            {
              "label": "PHP",
              "value": "php"
            },
            {
              "label": "Java (OpenJDK)",
              "value": "java"
            }
          ]
        }
      ]
    },
    {
      "id": "deps-dev",
      "name": "deps.dev Package Insights",
      "provider": "Google Open Source Insights",
      "category": "Developer",
      "description": "Inspect a package's published versions, default release, publish dates, and deprecation status across supported ecosystems.",
      "keywords": [
        "package versions",
        "default package version",
        "package deprecation"
      ],
      "documentationUrl": "https://docs.deps.dev/api/v3/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=deps-dev",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "system",
          "label": "Package ecosystem",
          "type": "select",
          "defaultValue": "npm",
          "help": "Choose a package system.",
          "options": [
            {
              "label": "npm",
              "value": "npm"
            },
            {
              "label": "PyPI",
              "value": "pypi"
            },
            {
              "label": "Maven",
              "value": "maven"
            },
            {
              "label": "Go",
              "value": "go"
            },
            {
              "label": "Cargo",
              "value": "cargo"
            }
          ]
        },
        {
          "id": "packageName",
          "label": "Package name",
          "type": "text",
          "defaultValue": "react",
          "help": "Enter a package name for the selected ecosystem.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "ecb-fx-rates",
      "name": "Coinbase Exchange Rates",
      "provider": "Coinbase",
      "category": "Finance",
      "description": "Read current fiat and crypto exchange rates for a selected base currency from Coinbase.",
      "documentationUrl": "https://docs.cdp.coinbase.com/coinbase-app/track-apis/exchange-rates",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=ecb-fx-rates",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "currency",
          "label": "Base currency",
          "type": "select",
          "defaultValue": "EUR",
          "help": "Choose the base currency for the rate table.",
          "options": [
            {
              "label": "Euro",
              "value": "EUR"
            },
            {
              "label": "US Dollar",
              "value": "USD"
            },
            {
              "label": "Singapore Dollar",
              "value": "SGD"
            },
            {
              "label": "British Pound",
              "value": "GBP"
            }
          ]
        }
      ]
    },
    {
      "id": "un-sdg-goals",
      "name": "UN Sustainable Development Goals",
      "provider": "United Nations Statistics Division",
      "category": "Government",
      "description": "Browse the official United Nations Sustainable Development Goal catalogue with goal codes, titles, descriptions, and API paths.",
      "documentationUrl": "https://unstats.un.org/SDGAPI/swagger/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=un-sdg-goals",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "datacite-search",
      "name": "DataCite DOI Search",
      "provider": "DataCite",
      "category": "Research",
      "description": "Search DOI records for research datasets, software, preprints, and publications.",
      "documentationUrl": "https://support.datacite.org/docs/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=datacite-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "reason": "DataCite returns HTTP 429 when rate limited and recommends incremental backoff after failures. Generic health verification records the first 429 and defers another provider request to a later independent run instead of immediately retrying.",
        "policyUrl": "https://support.datacite.org/docs/rate-limit"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Research query",
          "type": "text",
          "defaultValue": "climate change",
          "help": "Search DataCite-indexed titles and metadata.",
          "minLength": 1
        },
        {
          "id": "count",
          "label": "Results",
          "type": "number",
          "defaultValue": "5",
          "help": "Return between 1 and 10 DOI records.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "ror-search",
      "name": "ROR Organization Registry",
      "provider": "Research Organization Registry",
      "category": "Research",
      "description": "Look up standardized identifiers, names, locations, and links for universities and research institutions.",
      "documentationUrl": "https://ror.readme.io/docs/rest-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=ror-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Organization search",
          "type": "text",
          "defaultValue": "stanford",
          "help": "Search research organization names or external identifiers for an interactive choice.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "celestrak-satellites",
      "name": "CelesTrak Orbital Elements",
      "provider": "CelesTrak",
      "category": "Geo",
      "description": "Inspect a bounded CelesTrak General Perturbations orbital-element set for space stations or operational GPS satellites.",
      "keywords": [
        "satellite orbit",
        "orbital elements",
        "space stations",
        "GPS satellites"
      ],
      "documentationUrl": "https://celestrak.org/NORAD/documentation/gp-data-formats.php",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=celestrak-satellites",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "cadence-limited",
        "minimumIntervalSeconds": 7200,
        "retryOnNon2xx": false,
        "reason": "CelesTrak asks machine clients to download GP data only once per update and to stop immediately after any non-200 response.",
        "policyUrl": "https://celestrak.org/usage-policy.php"
      },
      "usageNote": "CelesTrak JSON uses CCSDS OMM keywords for GP elements. Values describe an orbit at the supplied epoch, not a live position. This browser demo intentionally excludes large Active and Starlink groups to reduce provider load and payload size. GP data updates about every two hours; automated verification must not poll more often than the update cadence and must stop immediately after any non-200 response.",
      "parameters": [
        {
          "id": "group",
          "label": "Bounded satellite group",
          "type": "select",
          "defaultValue": "stations",
          "help": "Choose a bounded GP group. Large Active and Starlink sets are intentionally excluded from this browser demo.",
          "options": [
            {
              "label": "Space stations",
              "value": "stations"
            },
            {
              "label": "GPS operational",
              "value": "gps-ops"
            }
          ]
        }
      ]
    },
    {
      "id": "cleveland-museum-search",
      "name": "Cleveland Museum Open Access",
      "provider": "The Cleveland Museum of Art",
      "category": "Media",
      "description": "Search image-bearing artwork records explicitly designated CC0 by the museum's open-access program.",
      "documentationUrl": "https://www.clevelandart.org/open-access-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=cleveland-museum-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "This demo explicitly requests image-bearing records marked CC0 by the Cleveland Museum of Art. CMA waives its applicable rights through CC0, but its terms disclaim warranties about third-party rights; verify the source artwork page before downstream reuse.",
      "parameters": [
        {
          "id": "query",
          "label": "Artwork search",
          "type": "text",
          "defaultValue": "monet",
          "help": "Search artwork titles, artists, or subjects.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 10 artworks.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "scryfall-card-search",
      "name": "Scryfall Card Search",
      "provider": "Scryfall",
      "category": "Games",
      "description": "Search Magic: The Gathering cards with mana cost, type, set, and full card artwork.",
      "documentationUrl": "https://scryfall.com/docs/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=scryfall-card-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "rateLimitStatuses": [
          429
        ],
        "reason": "Scryfall documents a rate limit under 10 requests per second and asks clients not to power through 429 responses; this verifier makes one live request and never immediately retries a 429.",
        "policyUrl": "https://scryfall.com/docs/faqs"
      },
      "usageNote": "Scryfall asks clients to stay under 10 requests per second and never power through HTTP 429 responses. Requests use HTTPS and send Accept: application/json; the browser supplies its own User-Agent because application code cannot set the forbidden User-Agent header. Keep searches interactive and modest.",
      "parameters": [
        {
          "id": "query",
          "label": "Card search",
          "type": "text",
          "defaultValue": "dragon",
          "help": "Search card names, types, or rules text.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "dnd5e-spell-lookup",
      "name": "D&D 5e Spell Lookup",
      "provider": "D&D 5e API",
      "category": "Games",
      "description": "Look up a Dungeons & Dragons 5th edition spell with range, components, and effect description.",
      "documentationUrl": "https://www.dnd5eapi.co/docs/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=dnd5e-spell-lookup",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "spellIndex",
          "label": "Spell",
          "type": "text",
          "defaultValue": "fireball",
          "help": "Enter the exact 2014 spell resource slug, such as magic-missile.",
          "minLength": 1,
          "maxLength": 80,
          "pattern": "[a-z0-9]+(?:-[a-z0-9]+)*",
          "patternDescription": "must be a lowercase D&D 5e resource slug using letters, numbers, and single hyphens."
        }
      ]
    },
    {
      "id": "qr-code-generator",
      "name": "QR Code Generator",
      "provider": "goQR.me",
      "category": "Utility",
      "description": "Generate a scannable QR code image for any text or URL, entirely from a GET request.",
      "documentationUrl": "https://goqr.me/api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "image",
      "responseContentTypes": [
        "image/png"
      ],
      "requestLabUrl": "/Public-API/#/request-lab?api=qr-code-generator",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The response body is a binary PNG image, not JSON; the Response details tab shows a metadata summary instead.",
      "parameters": [
        {
          "id": "data",
          "label": "Text or URL",
          "type": "text",
          "defaultValue": "https://example.com",
          "help": "Enter the text or URL to encode."
        },
        {
          "id": "size",
          "label": "Image size",
          "type": "select",
          "defaultValue": "200x200",
          "help": "Choose the output image dimensions.",
          "options": [
            {
              "label": "150 × 150",
              "value": "150x150"
            },
            {
              "label": "200 × 200",
              "value": "200x200"
            },
            {
              "label": "300 × 300",
              "value": "300x300"
            }
          ]
        }
      ]
    },
    {
      "id": "where-the-iss-at",
      "name": "Where The ISS At",
      "provider": "Where The ISS At",
      "category": "Geo",
      "description": "Track the International Space Station's current latitude, longitude, altitude, and velocity.",
      "documentationUrl": "https://wheretheiss.at/w/developer",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=where-the-iss-at",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The provider limits requests to roughly one per second. This demo makes one current-position request per user run and reports provider orbital position data in kilometers.",
      "parameters": []
    },
    {
      "id": "eurostat-population",
      "name": "Eurostat Population Statistics",
      "provider": "Eurostat",
      "category": "Economy",
      "description": "Read Eurostat population-on-1-January totals by country and published reference year.",
      "documentationUrl": "https://ec.europa.eu/eurostat/web/user-guides/data-browser/api-data-access/api-getting-started",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=eurostat-population",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses Eurostat dataset demo_pjan with annual frequency, unit Number, age Total, and sex Total. The dataset currently publishes through reference year 2025.",
      "parameters": [
        {
          "id": "country",
          "label": "Country",
          "type": "select",
          "defaultValue": "DE",
          "help": "Choose an EU member state.",
          "options": [
            {
              "label": "Germany",
              "value": "DE"
            },
            {
              "label": "France",
              "value": "FR"
            },
            {
              "label": "Italy",
              "value": "IT"
            },
            {
              "label": "Spain",
              "value": "ES"
            },
            {
              "label": "Netherlands",
              "value": "NL"
            }
          ]
        },
        {
          "id": "year",
          "label": "Reference year",
          "type": "number",
          "defaultValue": "2025",
          "help": "Choose a published demo_pjan reference year from 2010 through 2025.",
          "min": 2010,
          "max": 2025,
          "step": 1
        }
      ]
    },
    {
      "id": "bls-timeseries",
      "name": "BLS Labor Statistics",
      "provider": "U.S. Bureau of Labor Statistics",
      "category": "Economy",
      "description": "Read official U.S. economic time series including unemployment rate and consumer price index.",
      "documentationUrl": "https://www.bls.gov/developers/api_signature.htm",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=bls-timeseries",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "rateLimitStatuses": [
          429
        ],
        "reason": "BLS limits unregistered Version 1.0 users to 25 queries per day and returns HTTP 429 when query limits are exceeded. Automated verification records the first 429 and defers another provider request to a later independent run instead of immediately consuming another query.",
        "policyUrl": "https://www.bls.gov/developers/api_FAQs.htm"
      },
      "usageNote": "Uses BLS Public Data API Version 1.0 because it is the explicitly unregistered public API. The single-series GET returns the past three years. Unregistered users may make 25 queries per day and up to 50 requests per 10 seconds. Cite the API retrieval date and state that BLS cannot vouch for data or analyses after retrieval. BLS may limit or block attempts to exceed or circumvent usage limits.",
      "parameters": [
        {
          "id": "seriesId",
          "label": "Series",
          "type": "select",
          "defaultValue": "LNS14000000",
          "help": "Choose a tracked BLS time series.",
          "options": [
            {
              "label": "Unemployment rate",
              "value": "LNS14000000"
            },
            {
              "label": "CPI — all items",
              "value": "CUUR0000SA0"
            },
            {
              "label": "CPI — food",
              "value": "CUUR0000SAF1"
            }
          ]
        }
      ]
    },
    {
      "id": "fema-disasters",
      "name": "FEMA Disaster Declarations",
      "provider": "FEMA OpenFEMA",
      "category": "Government",
      "description": "Browse recently declared geographic areas within United States federal disaster declarations.",
      "documentationUrl": "https://www.fema.gov/about/openfema/disaster-declarations-summaries",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=fema-disasters",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "DisasterDeclarationsSummaries is area-level: one federal declaration can appear in many rows, one per designated geographic area. OpenFEMA describes the source as raw NEMIS data that may contain a small percentage of human error.",
      "parameters": [
        {
          "id": "limit",
          "label": "Declared-area rows",
          "type": "number",
          "defaultValue": "5",
          "help": "Return between 1 and 10 recent designated-area records; repeated disaster IDs are expected.",
          "min": 1,
          "max": 10
        }
      ]
    },
    {
      "id": "noaa-tides",
      "name": "NOAA Tides & Currents",
      "provider": "NOAA Tides and Currents",
      "category": "Weather",
      "description": "Read NOAA CO-OPS' latest coastal water-level observation with station, datum, timestamp, and quality-control context.",
      "documentationUrl": "https://api.tidesandcurrents.noaa.gov/api/prod/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=noaa-tides",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The demo requests NOAA CO-OPS water_level date=latest, which NOAA defines as the last available data point within 18 minutes. Values are metric relative to MLLW and timestamps use GMT; the provider may mark the latest value preliminary or verified.",
      "parameters": [
        {
          "id": "station",
          "label": "CO-OPS station",
          "type": "select",
          "defaultValue": "8518750",
          "help": "Choose a NOAA coastal water-level station.",
          "options": [
            {
              "label": "The Battery, NY",
              "value": "8518750"
            },
            {
              "label": "San Francisco, CA",
              "value": "9414290"
            },
            {
              "label": "Key West, FL",
              "value": "8724580"
            }
          ]
        }
      ]
    },
    {
      "id": "rdap-domain-lookup",
      "name": "RDAP Domain Lookup",
      "provider": "RDAP.org",
      "category": "Developer",
      "description": "Look up a domain's registration status, registrar, nameservers, and key events using the modern WHOIS replacement.",
      "documentationUrl": "https://about.rdap.org/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=rdap-domain-lookup",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "domain",
          "label": "Domain name",
          "type": "text",
          "defaultValue": "google.com",
          "help": "Enter a registered domain name."
        }
      ]
    },
    {
      "id": "languagetool-grammar-check",
      "name": "LanguageTool Grammar Check",
      "provider": "LanguageTool",
      "category": "Language",
      "description": "Check English text for grammar, spelling, and style issues with rule-based suggestions.",
      "keywords": [
        "spell check",
        "proofreading",
        "grammar correction"
      ],
      "documentationUrl": "https://languagetool.org/http-api/",
      "method": "POST",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=languagetool-grammar-check",
      "agentExecution": {
        "mode": "manual-only",
        "reason": "LanguageTool’s free public endpoint prohibits automated requests. Use a self-hosted or Enterprise instance for automation.",
        "policyUrl": "https://dev.languagetool.org/public-http-api.html"
      },
      "usageNote": "For interactive, human-driven checks only. The free public endpoint prohibits automated requests; use a self-hosted or Enterprise instance for automation. Submitted text is sent to LanguageTool: do not send confidential text.",
      "parameters": [
        {
          "id": "text",
          "label": "Text to check",
          "type": "text",
          "defaultValue": "This are a test.",
          "help": "Enter a short English sentence to check."
        }
      ]
    },
    {
      "id": "doaj-search",
      "name": "DOAJ Open Access Articles",
      "provider": "Directory of Open Access Journals",
      "category": "Research",
      "description": "Search fully open-access journal articles with authors, journal, and identifiers.",
      "documentationUrl": "https://doaj.org/api/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=doaj-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "DOAJ states its website search and API remain fully open and current after the March 2026 Premium Metadata Services change. Article metadata is publisher-supplied discovery metadata and may contain source errors.",
      "parameters": [
        {
          "id": "query",
          "label": "Article search",
          "type": "text",
          "defaultValue": "climate",
          "help": "Search open-access article titles and metadata.",
          "minLength": 1
        },
        {
          "id": "pageSize",
          "label": "Results",
          "type": "number",
          "defaultValue": "5",
          "help": "Return between 1 and 10 articles.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "pubchem-compound",
      "name": "PubChem Compound Lookup",
      "provider": "PubChem",
      "category": "Research",
      "description": "Look up a chemical compound's molecular formula, weight, and IUPAC name by common name.",
      "documentationUrl": "https://pubchem.ncbi.nlm.nih.gov/docs/pug-rest-tutorial",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=pubchem-compound",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "name",
          "label": "Compound name",
          "type": "text",
          "defaultValue": "aspirin",
          "help": "Enter a common chemical or drug name.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "chembl-molecule",
      "name": "ChEMBL Molecule Profile",
      "provider": "ChEMBL",
      "category": "Health",
      "description": "Inspect a ChEMBL molecule's development phase, calculated properties, structure identifiers, and classifications.",
      "documentationUrl": "https://www.ebi.ac.uk/chembl/api/data/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=chembl-molecule",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "For research and education demonstrations only. Not a substitute for clinical or regulatory drug information.",
      "parameters": [
        {
          "id": "chemblId",
          "label": "ChEMBL ID",
          "type": "text",
          "defaultValue": "CHEMBL25",
          "help": "Enter a ChEMBL molecule identifier (CHEMBL25 is aspirin)."
        }
      ]
    },
    {
      "id": "uniprot-protein",
      "name": "UniProt Protein Lookup",
      "provider": "UniProt",
      "category": "Research",
      "description": "Look up a protein's function, organism, gene, and annotation score by accession number.",
      "documentationUrl": "https://www.uniprot.org/help/accession_numbers",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=uniprot-protein",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "accession",
          "label": "UniProt accession",
          "type": "text",
          "defaultValue": "P05067",
          "help": "Use the official 6- or 10-character UniProtKB accession format, such as P05067 or A0A023GPI8.",
          "pattern": "[OPQ][0-9][A-Z0-9]{3}[0-9]|[A-NR-Z][0-9](?:[A-Z][A-Z0-9]{2}[0-9]){1,2}",
          "patternDescription": "must be a valid 6- or 10-character UniProtKB accession."
        }
      ]
    },
    {
      "id": "rcsb-pdb-entry",
      "name": "RCSB Protein Data Bank Entry",
      "provider": "RCSB PDB",
      "category": "Research",
      "description": "Inspect an experimentally determined PDB structure's method, archive facts, and primary publication details.",
      "documentationUrl": "https://www.rcsb.org/docs/programmatic-access/web-apis-overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=rcsb-pdb-entry",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "RCSB and wwPDB are transitioning to 12-character extended PDB IDs. This direct core-entry demo accepts a current four-character PDB ID or its official transitional pdb_0000XXXX alias; because the live Data API does not currently resolve that alias directly, the browser normalizes the one-to-one transitional form back to its four-character ID at the provider boundary. Extended-only IDs issued after the July 21, 2027 archive transition are not yet claimed as supported and this contract must be re-evaluated before that cutover.",
      "parameters": [
        {
          "id": "entryId",
          "label": "PDB entry ID",
          "type": "text",
          "defaultValue": "4HHB",
          "help": "Enter 4HHB or its transitional extended alias pdb_00004hhb. Extended-only IDs issued after the 2027 transition are not yet supported by this direct core-entry demo.",
          "minLength": 4,
          "maxLength": 12,
          "pattern": "(?:[A-Za-z0-9]{4}|[Pp][Dd][Bb]_0000[A-Za-z0-9]{4})",
          "patternDescription": "must be a four-character PDB ID or a transitional pdb_0000XXXX extended alias for an entry that still has a legacy ID."
        }
      ]
    },
    {
      "id": "ensembl-gene-lookup",
      "name": "Ensembl Gene Lookup",
      "provider": "Ensembl",
      "category": "Research",
      "description": "Inspect an Ensembl gene's stable identity, species, genome assembly location, strand, biotype, description, and canonical transcript when supplied.",
      "documentationUrl": "https://rest.ensembl.org/documentation/info/lookup",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=ensembl-gene-lookup",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Ensembl lookup/id accepts stable IDs for genes, transcripts, proteins, and other features. This demo accepts only unversioned Ensembl gene stable IDs and requires the returned ID to match with object_type Gene. The classic REST service remains available but is frozen at Ensembl release 116; newer datasets are moving to the new Ensembl platform and its GraphQL/refget services.",
      "parameters": [
        {
          "id": "geneId",
          "label": "Ensembl gene ID",
          "type": "text",
          "defaultValue": "ENSG00000157764",
          "help": "Enter an unversioned Ensembl gene stable ID (default is human BRAF). Transcript, protein, and version-suffixed IDs are rejected before the provider request.",
          "pattern": "ENS[A-Z]*G[0-9]{11}",
          "patternDescription": "must be an unversioned Ensembl gene stable ID such as ENSG00000157764."
        }
      ]
    },
    {
      "id": "obis-marine-occurrences",
      "name": "OBIS Marine Occurrences",
      "provider": "Ocean Biodiversity Information System",
      "category": "Biodiversity",
      "description": "Inspect OBIS marine occurrence records by scientific name with occurrence status, record basis, event date, coordinates, dataset provenance, and provider QC flags.",
      "documentationUrl": "https://api.obis.org/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=obis-marine-occurrences",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "OBIS aggregates Darwin Core occurrence records from many datasets with varying licences and data quality. Keep occurrence status, source dataset, identifiers, coordinates and provider QC flags visible rather than treating every returned row as equivalent evidence.",
      "parameters": [
        {
          "id": "scientificName",
          "label": "Species (scientific name)",
          "type": "text",
          "defaultValue": "Delphinus delphis",
          "help": "Enter a marine species scientific name. OBIS may resolve historical or synonym names to a current accepted scientific name.",
          "minLength": 1
        },
        {
          "id": "size",
          "label": "Occurrences",
          "type": "number",
          "defaultValue": "5",
          "help": "Return between 1 and 10 occurrence records.",
          "min": 1,
          "max": 10,
          "step": 1
        }
      ]
    },
    {
      "id": "worms-species-lookup",
      "name": "WoRMS Marine Species Registry",
      "provider": "World Register of Marine Species",
      "category": "Biodiversity",
      "description": "Resolve a marine scientific name in WoRMS while preserving whether the queried name is accepted and, when it is not, the current accepted name and AphiaID.",
      "documentationUrl": "https://www.marinespecies.org/rest/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=worms-species-lookup",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "WoRMS AphiaRecords preserve the queried name and its taxonomic status. valid_AphiaID identifies the current final accepted name; do not hide synonym or unaccepted-name relationships. AphiaRecordsByName documents HTTP 204 as Nothing found.",
      "parameters": [
        {
          "id": "name",
          "label": "Species (scientific name)",
          "type": "text",
          "defaultValue": "Delphinus delphis",
          "help": "Enter a marine species scientific name."
        }
      ]
    },
    {
      "id": "paleobiodb-taxa",
      "name": "Paleobiology Database Taxa",
      "provider": "Paleobiology Database",
      "category": "Nature",
      "description": "Inspect a Paleobiology Database taxon with rank, accepted-name identity, extancy, and the provider’s fossil-occurrence count.",
      "documentationUrl": "https://paleobiodb.org/data1.2/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=paleobiodb-taxa",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "PBDB defines n_occs as fossil occurrences identified as the named taxon or any of its subtaxa. It is not a direct-only count for the exact name.",
      "parameters": [
        {
          "id": "name",
          "label": "Taxon name",
          "type": "text",
          "defaultValue": "Tyrannosaurus",
          "help": "Enter a genus or species name."
        }
      ]
    },
    {
      "id": "usgs-water-legacy",
      "name": "USGS Water Data V1",
      "provider": "U.S. Geological Survey",
      "category": "Environment",
      "description": "Read the latest continuous USGS sensor observation for streamflow or gage height at a monitoring location.",
      "documentationUrl": "https://api.waterdata.usgs.gov/docs/ogcapi/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=usgs-water-legacy",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses the modern USGS Water Data API V1 latest-continuous collection. API keys are optional and only increase rate limits; observations can be provisional or approved.",
      "parameters": [
        {
          "id": "site",
          "label": "Monitoring site",
          "type": "text",
          "defaultValue": "01646500",
          "help": "Enter one USGS monitoring-location number (default is the Potomac River near Washington, D.C.).",
          "minLength": 1,
          "maxLength": 32,
          "pattern": "[0-9]+",
          "patternDescription": "must contain only the numeric USGS monitoring-location identifier, without an agency prefix or comma-separated list."
        },
        {
          "id": "parameter",
          "label": "Measurement",
          "type": "select",
          "defaultValue": "00060",
          "help": "Choose the continuous sensor quantity to read.",
          "options": [
            {
              "label": "Streamflow / discharge (00060)",
              "value": "00060"
            },
            {
              "label": "Gage height (00065)",
              "value": "00065"
            }
          ]
        }
      ]
    },
    {
      "id": "rubygems-lookup",
      "name": "RubyGems Package Lookup",
      "provider": "RubyGems.org",
      "category": "Developer",
      "description": "Inspect a Ruby gem's latest version, downloads, authors, and license.",
      "documentationUrl": "https://guides.rubygems.org/rubygems-org-api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=rubygems-lookup",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "gemName",
          "label": "Gem name",
          "type": "text",
          "defaultValue": "rails",
          "help": "Enter a published RubyGems package name."
        }
      ]
    },
    {
      "id": "nuget-package-lookup",
      "name": "NuGet Package Lookup",
      "provider": "NuGet Gallery",
      "category": "Developer",
      "description": "Browse a .NET package's published version history from the NuGet registration catalog.",
      "documentationUrl": "https://learn.microsoft.com/nuget/api/overview",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nuget-package-lookup",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses NuGet.org’s SemVer 2 registration hive. Packages with 128+ versions can omit registration leaves from the index; this one-request demo reports page ranges honestly instead of following extra page requests.",
      "parameters": [
        {
          "id": "packageId",
          "label": "Package ID",
          "type": "text",
          "defaultValue": "newtonsoft.json",
          "help": "Enter a published NuGet package identifier."
        }
      ]
    },
    {
      "id": "internet-archive-search",
      "name": "Internet Archive Search",
      "provider": "Internet Archive",
      "category": "Media",
      "description": "Search millions of archived books, audio, video, and software items with cover thumbnails.",
      "documentationUrl": "https://archive.org/advancedsearch.php",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=internet-archive-search",
      "agentExecution": {
        "mode": "manual-only",
        "reason": "Internet Archive requires every automated request to send a descriptive User-Agent identifying the tool/version and AI model. Browser JavaScript cannot set that protected header, so structured agent execution cannot satisfy the provider bot policy.",
        "policyUrl": "https://archive.org/developers/bots.html"
      },
      "usageNote": "Human-triggered interactive searches remain available in Request Lab. Internet Archive does not guarantee the copyright status of items; verify each item page and any uploader-supplied rights or license metadata before reuse.",
      "parameters": [
        {
          "id": "query",
          "label": "Search term",
          "type": "text",
          "defaultValue": "singapore",
          "help": "Search titles and descriptions across the archive.",
          "minLength": 1
        },
        {
          "id": "mediaType",
          "label": "Media type",
          "type": "select",
          "defaultValue": "texts",
          "help": "Filter by archived media type.",
          "options": [
            {
              "label": "Texts & books",
              "value": "texts"
            },
            {
              "label": "Audio",
              "value": "audio"
            },
            {
              "label": "Movies",
              "value": "movies"
            },
            {
              "label": "Software",
              "value": "software"
            }
          ]
        }
      ]
    },
    {
      "id": "ipwhois-lookup",
      "name": "IPWhoIs Geolocation",
      "provider": "ipwho.is",
      "category": "Developer",
      "description": "Inspect approximate IP-based location, timezone, ASN, network organization, and ISP metadata for one public IPv4 or IPv6 address.",
      "documentationUrl": "https://ipwhois.io/documentation",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=ipwhois-lookup",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "IP geolocation is approximate network-derived data, not device GPS or a precise personal address. The free endpoint allows 1,000 requests/day; browser CORS requests are counted per domain, so the quota is shared across Public-API traffic from this origin.",
      "parameters": [
        {
          "id": "ip",
          "label": "IP address",
          "type": "text",
          "defaultValue": "8.8.8.8",
          "help": "Enter one public IPv4 or IPv6 address. Reserved or invalid addresses can return HTTP 200 with success=false."
        }
      ]
    },
    {
      "id": "newton-math-solver",
      "name": "Newton Math Solver",
      "provider": "Newton API",
      "category": "Knowledge",
      "description": "Run a bounded symbolic-math operation and inspect the provider-returned expression and result.",
      "keywords": [
        "symbolic math",
        "solve equation",
        "differentiate",
        "factor polynomial"
      ],
      "documentationUrl": "https://github.com/aunyks/newton-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=newton-math-solver",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "A community-maintained symbolic math service. The legacy newton.now.sh hostname redirects to the current newton.vercel.app deployment; Public-API calls the Vercel deployment directly to avoid a redirect dependency. Treat this as an education demo rather than a guaranteed-uptime dependency.",
      "parameters": [
        {
          "id": "operation",
          "label": "Operation",
          "type": "select",
          "defaultValue": "simplify",
          "help": "Choose a math operation.",
          "options": [
            {
              "label": "Simplify",
              "value": "simplify"
            },
            {
              "label": "Factor",
              "value": "factor"
            },
            {
              "label": "Derive",
              "value": "derive"
            },
            {
              "label": "Zeroes",
              "value": "zeroes"
            }
          ]
        },
        {
          "id": "expression",
          "label": "Expression",
          "type": "text",
          "defaultValue": "2x+2x",
          "help": "Use ^ for powers and avoid spaces.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "datamuse-rhymes",
      "name": "Datamuse Sounds-Like Finder",
      "provider": "Datamuse",
      "category": "Language",
      "description": "Find English words and phrases pronounced similarly to a supplied term using Datamuse's documented sounds-like constraint.",
      "keywords": [
        "pronunciation",
        "phonetic similarity",
        "sounds like"
      ],
      "documentationUrl": "https://www.datamuse.com/api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=datamuse-rhymes",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The stable catalog ID is retained for deep-link compatibility, but the live request now uses the documented sl=sounds-like contract rather than the older undocumented rel_rhy parameter. Datamuse says result score values are useful only for ordering, asks public apps to acknowledge Datamuse, and allows keyless use up to 100,000 requests/day only through 2026-12-31; starting 2027-01-01 every request will require an API key, so this browser-native demo must be re-evaluated before then.",
      "parameters": [
        {
          "id": "word",
          "label": "Sounds like",
          "type": "text",
          "defaultValue": "orange",
          "help": "Enter an English word or phrase. Datamuse will rank vocabulary entries with similar pronunciation.",
          "minLength": 1,
          "maxLength": 80
        }
      ]
    },
    {
      "id": "open5e-monster-search",
      "name": "Open5e Monster Search",
      "provider": "Open5e",
      "category": "Games",
      "description": "Search the current Open5e V2 creature catalogue for open-license tabletop RPG monsters with source-aware combat statistics.",
      "documentationUrl": "https://open5e.com/api-docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open5e-monster-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses the current Open5e V2 creatures endpoint with case-insensitive name matching. The live demo caps results at 8 and requests only the source, identity, combat, movement, and perception fields used by the semantic card; familiar monster names can appear more than once when different source documents or game systems provide distinct versions.",
      "parameters": [
        {
          "id": "search",
          "label": "Monster name contains",
          "type": "text",
          "defaultValue": "dragon",
          "help": "Case-insensitive partial-name search across Open5e V2 creatures."
        }
      ]
    },
    {
      "id": "dicebear-avatar",
      "name": "DiceBear Avatar Generator",
      "provider": "DiceBear",
      "category": "Utility",
      "description": "Generate a deterministic SVG avatar from any seed text, useful for prototype user profiles.",
      "documentationUrl": "https://www.dicebear.com/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "image",
      "responseContentTypes": [
        "image/svg+xml"
      ],
      "requestLabUrl": "/Public-API/#/request-lab?api=dicebear-avatar",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "style",
          "label": "Avatar style",
          "type": "select",
          "defaultValue": "identicon",
          "help": "Choose a DiceBear avatar style.",
          "options": [
            {
              "label": "Identicon",
              "value": "identicon"
            },
            {
              "label": "Bottts",
              "value": "bottts"
            },
            {
              "label": "Pixel art",
              "value": "pixel-art"
            },
            {
              "label": "Thumbs",
              "value": "thumbs"
            }
          ]
        },
        {
          "id": "seed",
          "label": "Seed text",
          "type": "text",
          "defaultValue": "test",
          "help": "Any text seed deterministically generates the same avatar."
        }
      ]
    },
    {
      "id": "catfacts",
      "name": "Cat Facts Generator",
      "provider": "Cat Facts API",
      "category": "Nature",
      "description": "Generate a random, bite-sized fact about cats for lightweight content demos.",
      "documentationUrl": "https://catfact.ninja/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=catfacts",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "gleif-lei",
      "name": "GLEIF LEI Explorer",
      "provider": "GLEIF",
      "category": "Finance",
      "description": "Search official legal entities by name and review LEI status, headquarters, registration state, and available corporate relationship links.",
      "documentationUrl": "https://www.gleif.org/en/lei-data/gleif-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=gleif-lei",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "GLEIF API legal-name search can use provider matching rather than exact text equality. Treat the provider-owned LEI as the stable entity identity and review the returned legal name/status before using a result.",
      "parameters": [
        {
          "id": "query",
          "label": "Legal name",
          "type": "text",
          "defaultValue": "Royal Bank of Canada",
          "help": "Enter a legal name fragment to search public LEI records.",
          "minLength": 1
        },
        {
          "id": "count",
          "label": "Results",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 50 records.",
          "min": 1,
          "max": 50,
          "step": 1
        }
      ]
    },
    {
      "id": "fdic-bankfind",
      "name": "FDIC BankFind Suite",
      "provider": "FDIC",
      "category": "Finance",
      "description": "Search FDIC institution records by bank name and inspect operating status, headquarters, reported assets/deposits, office counts, and regulator metadata.",
      "documentationUrl": "https://api.fdic.gov/banks/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=fdic-bankfind",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "bankName",
          "label": "Bank name",
          "type": "text",
          "defaultValue": "Wells Fargo",
          "help": "Search FDIC bank metadata by public institution name.",
          "minLength": 1
        },
        {
          "id": "count",
          "label": "Results",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 20 institutions.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "uk-food-hygiene",
      "name": "UK Food Hygiene Ratings",
      "provider": "Food Standards Agency",
      "category": "Food",
      "description": "Search food establishments by name and inspect provider ratings, inspection dates, local-authority identity, and FHRS component scores.",
      "documentationUrl": "https://api.ratings.food.gov.uk/help",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=uk-food-hygiene",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "For FHRS, the overall rating runs 0–5 with higher better, while Hygiene/Structural/Confidence intervention scores run in the opposite direction with lower better. Component scores apply to FHRS, not FHIS, and may be absent after a rescore.",
      "parameters": [
        {
          "id": "name",
          "label": "Establishment name",
          "type": "text",
          "defaultValue": "Cafe",
          "help": "Search UK food businesses by name."
        },
        {
          "id": "count",
          "label": "Results",
          "type": "number",
          "defaultValue": "5",
          "help": "Return between 1 and 50 establishments from the first result page.",
          "min": 1,
          "max": 50
        }
      ]
    },
    {
      "id": "uk-flood-monitoring",
      "name": "UK Flood Monitoring",
      "provider": "DEFRA",
      "category": "Environment",
      "description": "Find Environment Agency monitoring stations for an exact river name, including location, status, catchment, and available measurement types.",
      "keywords": [
        "flood stations",
        "river monitoring",
        "Environment Agency stations"
      ],
      "documentationUrl": "https://environment.data.gov.uk/flood-monitoring/doc/reference",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=uk-flood-monitoring",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The provider documents riverName as an exact-match filter. This endpoint returns station and available-measure metadata, not current readings or flood warnings.",
      "parameters": [
        {
          "id": "riverName",
          "label": "Exact river name",
          "type": "text",
          "defaultValue": "River Severn",
          "help": "Use the Environment Agency river name exactly; the provider does not treat this field as a contains search.",
          "minLength": 1
        },
        {
          "id": "count",
          "label": "Stations",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 50 matching station records.",
          "min": 1,
          "max": 50
        }
      ]
    },
    {
      "id": "unhcr-refugees",
      "name": "UNHCR Refugee Statistics",
      "provider": "UNHCR",
      "category": "Data",
      "description": "Read UNHCR end-of-year displacement population figures for one ISO3 country of origin and reporting year.",
      "documentationUrl": "https://www.unhcr.org/refugee-statistics/insights/explainers/forcibly-displaced-api.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=unhcr-refugees",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The request sets cf_type=ISO so the origin input is interpreted as ISO3. Country of asylum is omitted, so UNHCR aggregates that dimension into one year-end row.",
      "parameters": [
        {
          "id": "origin",
          "label": "Origin country ISO3",
          "type": "text",
          "defaultValue": "SYR",
          "help": "Use exactly three ISO 3166-1 alpha-3 letters such as SYR; cf_type=ISO makes UNHCR interpret this field as ISO3.",
          "minLength": 3,
          "maxLength": 3,
          "pattern": "[A-Za-z]{3}",
          "patternDescription": "must contain exactly three letters for an ISO 3166-1 alpha-3 country code."
        },
        {
          "id": "year",
          "label": "Year",
          "type": "number",
          "defaultValue": "2025",
          "help": "Choose a published annual end-of-year snapshot from 2010 through 2025.",
          "min": 2010,
          "max": 2025
        }
      ]
    },
    {
      "id": "hdx-humanitarian-datasets",
      "name": "IFRC GO Emergency Events",
      "provider": "IFRC GO",
      "category": "Data",
      "description": "Review recent IFRC GO emergency events ordered by disaster start date, with source-specific field-report impacts when available.",
      "documentationUrl": "https://goadmin.ifrc.org/api-docs/swagger-ui/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=hdx-humanitarian-datasets",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "IFRC GO exposes event-level and field-report impact figures from different sources. Keep IFRC, government, and other-source figures separate and verify source reports before operational decisions.",
      "parameters": []
    },
    {
      "id": "open-meteo-climate",
      "name": "Open-Meteo Climate",
      "provider": "Open-Meteo",
      "category": "Environment",
      "description": "Retrieve climate-model projections and historical climate indicators for a chosen location and period.",
      "documentationUrl": "https://open-meteo.com/en/docs/climate-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-meteo-climate",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Open-Meteo climate projections use downscaled HighResMIP / CMIP6 climate models. Treat them as modelled projections rather than observations, and retain the selected model and date range when presenting outcomes.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "startYear",
          "label": "Start year",
          "type": "number",
          "defaultValue": "2020",
          "help": "Choose a projection window start year.",
          "min": 1950,
          "max": 2050
        },
        {
          "id": "endYear",
          "label": "End year",
          "type": "number",
          "defaultValue": "2026",
          "help": "Choose a projection window end year greater than or equal to the start year.",
          "min": 1950,
          "max": 2050,
          "minimumFromField": "startYear"
        },
        {
          "id": "model",
          "label": "Model",
          "type": "select",
          "defaultValue": "CMCC_CM2_VHR4",
          "help": "Select one of the seven climate models currently documented by Open-Meteo.",
          "options": [
            {
              "label": "CMCC CM2 VHR4",
              "value": "CMCC_CM2_VHR4"
            },
            {
              "label": "FGOALS f3 H",
              "value": "FGOALS_f3_H"
            },
            {
              "label": "HiRAM SIT HR",
              "value": "HiRAM_SIT_HR"
            },
            {
              "label": "MRI AGCM3 2 S",
              "value": "MRI_AGCM3_2_S"
            },
            {
              "label": "EC-Earth3P HR",
              "value": "EC_Earth3P_HR"
            },
            {
              "label": "MPI ESM1 2 XR",
              "value": "MPI_ESM1_2_XR"
            },
            {
              "label": "NICAM16 8S",
              "value": "NICAM16_8S"
            }
          ]
        }
      ]
    },
    {
      "id": "models-dev",
      "name": "Hugging Face Model Search",
      "provider": "Hugging Face",
      "category": "Developer",
      "description": "Search public AI model metadata, downloads, likes, pipeline tags, and update timestamps.",
      "documentationUrl": "https://huggingface.co/docs/hub/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=models-dev",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Model search",
          "type": "text",
          "defaultValue": "gpt",
          "help": "Search public model IDs. Hugging Face documents this search string as being contained in returned model IDs.",
          "minLength": 1
        },
        {
          "id": "count",
          "label": "Results",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 25 models.",
          "min": 1,
          "max": 25,
          "step": 1
        }
      ]
    },
    {
      "id": "vatcomply",
      "name": "VATComply Exchange Rates",
      "provider": "VATComply",
      "category": "Finance",
      "description": "Read daily currency exchange rates for a selected base currency and target symbols from VATComply’s /rates endpoint.",
      "documentationUrl": "https://api.vatcomply.com/docs",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=vatcomply",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "This Public-API entry calls VATComply’s /rates endpoint only. VAT-number and IBAN validation are separate provider operations and are not part of this demo.",
      "parameters": [
        {
          "id": "base",
          "label": "Base currency",
          "type": "text",
          "defaultValue": "EUR",
          "help": "Use a supported three-letter currency code such as EUR, USD, or SGD.",
          "minLength": 3,
          "maxLength": 3,
          "pattern": "[A-Za-z]{3}",
          "patternDescription": "must be a three-letter currency code."
        },
        {
          "id": "symbols",
          "label": "Target currencies",
          "type": "text",
          "defaultValue": "USD,SGD,GBP",
          "help": "Comma-separate supported three-letter currency codes. VATComply filters the response to those currencies.",
          "minLength": 3,
          "pattern": "[A-Za-z]{3}(?:\\s*,\\s*[A-Za-z]{3})*",
          "patternDescription": "must be a comma-separated list of three-letter currency codes."
        }
      ]
    },
    {
      "id": "mempool-space-btc",
      "name": "mempool.space Bitcoin",
      "provider": "mempool.space",
      "category": "Finance",
      "description": "Read mempool.space recommended Bitcoin transaction fee rates for fastest, half-hour, hour, economy, and minimum targets.",
      "documentationUrl": "https://mempool.space/docs/api/rest",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=mempool-space-btc",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": []
    },
    {
      "id": "metacpan",
      "name": "MetaCPAN API",
      "provider": "MetaCPAN",
      "category": "Developer",
      "description": "Find the latest indexed CPAN release metadata for an exact Perl module name.",
      "documentationUrl": "https://github.com/metacpan/metacpan-api/blob/master/docs/API-docs.md",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=metacpan",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Module name",
          "type": "text",
          "defaultValue": "Mojolicious",
          "help": "Enter an exact Perl module name. MetaCPAN searches module.name and keeps only the latest indexed release.",
          "minLength": 1
        },
        {
          "id": "count",
          "label": "Maximum matches",
          "type": "number",
          "defaultValue": "6",
          "help": "Limit the exact-name result set to between 1 and 20 records.",
          "min": 1,
          "max": 20
        }
      ]
    },
    {
      "id": "hexpm",
      "name": "Hex.pm Package API",
      "provider": "Hex.pm",
      "category": "Developer",
      "description": "Fetch Elixir package metadata, maintainers, licensing, and versioning from the official package registry.",
      "documentationUrl": "https://hex.pm/docs/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=hexpm",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "package",
          "label": "Package",
          "type": "text",
          "defaultValue": "ecto",
          "help": "Enter an official Hex package name."
        }
      ]
    },
    {
      "id": "pub-dev",
      "name": "pub.dev Package Lookup",
      "provider": "pub.dev",
      "category": "Developer",
      "description": "Inspect one Dart or Flutter package with its latest release, SDK constraints, topics, and version history.",
      "documentationUrl": "https://pub.dev/help/api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=pub-dev",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses the Hosted Pub Repository Specification v2 package endpoint and its recommended v2 media type. Direct package misses are provider HTTP 404 responses, not semantic empty package objects.",
      "parameters": [
        {
          "id": "packageName",
          "label": "Package name",
          "type": "text",
          "defaultValue": "riverpod",
          "help": "Enter an exact package name from pub.dev."
        }
      ]
    },
    {
      "id": "go-module-proxy",
      "name": "Go Module Proxy",
      "provider": "Go",
      "category": "Developer",
      "description": "Read the official Go module proxy version list for one module path.",
      "documentationUrl": "https://go.dev/ref/mod",
      "method": "GET",
      "keyRequired": false,
      "responseType": "text",
      "responseContentTypes": [
        "text/plain"
      ],
      "requestLabUrl": "/Public-API/#/request-lab?api=go-module-proxy",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "module",
          "label": "Module path",
          "type": "text",
          "defaultValue": "github.com/gin-gonic/gin",
          "help": "Enter a fully-qualified module path."
        }
      ]
    },
    {
      "id": "flathub-appstream",
      "name": "Flathub Appstream",
      "provider": "Flathub",
      "category": "Developer",
      "description": "Inspect one Flathub desktop application with screenshots, release history, license, categories, and project links.",
      "documentationUrl": "https://docs.flathub.org/docs/for-app-authors/appstream/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=flathub-appstream",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "appId",
          "label": "Flathub app ID",
          "type": "text",
          "defaultValue": "org.gnome.Calculator",
          "help": "Enter an exact non-empty Flathub application ID.",
          "minLength": 1
        }
      ]
    },
    {
      "id": "openssf-scorecard",
      "name": "OpenSSF Scorecard",
      "provider": "OpenSSF",
      "category": "Security",
      "description": "Review repository-level security scores, risk signals, and repository policy metadata from OpenSSF Scorecard.",
      "documentationUrl": "https://github.com/ossf/scorecard",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=openssf-scorecard",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The score is heuristic; validate security posture independently before making operational decisions.",
      "parameters": [
        {
          "id": "repository",
          "label": "Repository",
          "type": "text",
          "defaultValue": "github.com/ossf/scorecard",
          "help": "Enter owner/repo or a full github.com/owner/repo path."
        }
      ]
    },
    {
      "id": "opencitations-index",
      "name": "OpenCitations Citation Count",
      "provider": "OpenCitations",
      "category": "Research",
      "description": "Look up the number of incoming citations recorded in OpenCitations Index v2 for a DOI.",
      "documentationUrl": "https://opencitations.net/index/api/v2",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=opencitations-index",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "OpenCitations citation-count is index-scoped, not a universal citation total. Anonymous REST API calls are rate-limited to 180 requests/minute per IP; OpenCitations recommends data dumps for large-scale retrieval.",
      "parameters": [
        {
          "id": "doi",
          "label": "DOI",
          "type": "text",
          "defaultValue": "10.1109/5.771073",
          "help": "Use a valid DOI string."
        }
      ]
    },
    {
      "id": "vam-collections",
      "name": "V&A Collections",
      "provider": "V&A",
      "category": "Media",
      "description": "Browse artworks, objects, and exhibition-linked metadata from the V&A Collection API.",
      "documentationUrl": "https://developers.vam.ac.uk/guide/v2/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=vam-collections",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Collection search",
          "type": "text",
          "defaultValue": "eastern",
          "help": "Search museum records by keyword.",
          "minLength": 1
        },
        {
          "id": "count",
          "label": "Records",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 20 records.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "github-global-advisories",
      "name": "GitHub Global Advisories",
      "provider": "GitHub",
      "category": "Security",
      "description": "Search GitHub-reviewed global security advisories by ecosystem and severity without authentication.",
      "documentationUrl": "https://docs.github.com/en/rest/security-advisories/global-advisories",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=github-global-advisories",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "rateLimitStatuses": [
          403,
          429
        ],
        "reason": "GitHub documents HTTP 403 or 429 for primary or secondary rate-limit exhaustion and requires clients to wait for x-ratelimit-reset, Retry-After, or at least one minute before retrying. Generic health verification therefore records the first 403/429 and defers another provider request to a later independent run.",
        "policyUrl": "https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api"
      },
      "usageNote": "Public global advisories are available without authentication. GitHub may return HTTP 403 or 429 for primary or secondary rate-limit exhaustion and requires clients to wait for the reset/Retry-After window before retrying. Keep anonymous request volume modest and review upstream package guidance before acting on a result.",
      "parameters": [
        {
          "id": "ecosystem",
          "label": "Ecosystem",
          "type": "select",
          "defaultValue": "npm",
          "help": "Filter advisories by package ecosystem.",
          "options": [
            {
              "label": "npm",
              "value": "npm"
            },
            {
              "label": "pip",
              "value": "pip"
            },
            {
              "label": "Maven",
              "value": "maven"
            },
            {
              "label": "NuGet",
              "value": "nuget"
            },
            {
              "label": "RubyGems",
              "value": "rubygems"
            },
            {
              "label": "Composer",
              "value": "composer"
            },
            {
              "label": "Go",
              "value": "go"
            },
            {
              "label": "Rust",
              "value": "rust"
            }
          ]
        },
        {
          "id": "severity",
          "label": "Severity",
          "type": "select",
          "defaultValue": "high",
          "help": "Filter by GitHub advisory severity.",
          "options": [
            {
              "label": "Low",
              "value": "low"
            },
            {
              "label": "Medium",
              "value": "medium"
            },
            {
              "label": "High",
              "value": "high"
            },
            {
              "label": "Critical",
              "value": "critical"
            }
          ]
        },
        {
          "id": "limit",
          "label": "Advisories",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 20 advisories.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "dblp-search",
      "name": "DBLP Publication Search",
      "provider": "DBLP",
      "category": "Research",
      "description": "Search computer-science publication titles and inspect authors, venues, years, DOI, and persistent DBLP record URLs.",
      "documentationUrl": "https://blog.dblp.org/2024/09/09/introducing-our-public-sparql-query-service/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=dblp-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "rateLimitStatuses": [
          429
        ],
        "reason": "DBLP documents HTTP 429 with Retry-After for excessive automated traffic. Automated verification records a 429 and defers another provider request instead of immediately retrying against the live beta service.",
        "policyUrl": "https://dblp.org/faq/Am%2BI%2Ballowed%2Bto%2Bcrawl%2Bthe%2Bdblp%2Bwebsite"
      },
      "usageNote": "Uses DBLP’s official public SPARQL service, which is currently described as public beta. DBLP asks clients not to overwhelm live APIs; its current crawling guidance says HTTP 429 responses carry Retry-After and recommends waiting at least one or two seconds between automated requests.",
      "parameters": [
        {
          "id": "query",
          "label": "Publication title search",
          "type": "text",
          "defaultValue": "large language models",
          "help": "Case-insensitive substring search over DBLP publication titles.",
          "minLength": 1,
          "maxLength": 120
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 20 matching publications.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "citybikes-network",
      "name": "CityBikes Live Stations",
      "provider": "CityBikes",
      "category": "Geo",
      "description": "Inspect live bike-sharing stations, available bicycles, empty docks, and coordinates for a selected city network.",
      "documentationUrl": "https://docs.citybik.es/api/v2",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=citybikes-network",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "CityBikes limits the public API to 300 requests/hour and requires a clear CityBikes source link in projects using the API. Cache repeated network reads and avoid aggressive polling.",
      "parameters": [
        {
          "id": "network",
          "label": "Bike network",
          "type": "select",
          "defaultValue": "youbike-taipei",
          "help": "Choose a public bike-sharing network.",
          "options": [
            {
              "label": "Taipei · YouBike",
              "value": "youbike-taipei"
            },
            {
              "label": "Paris · Vélib",
              "value": "velib"
            },
            {
              "label": "London · Santander Cycles",
              "value": "santander-cycles"
            },
            {
              "label": "New York · Citi Bike",
              "value": "citi-bike-nyc"
            },
            {
              "label": "Barcelona · Bicing",
              "value": "bicing"
            }
          ]
        }
      ]
    },
    {
      "id": "wikimedia-commons-search",
      "name": "Wikimedia Commons Search",
      "provider": "Wikimedia Foundation",
      "category": "Media",
      "description": "Search Wikimedia Commons files and return browser-ready thumbnails with license metadata.",
      "documentationUrl": "https://www.mediawiki.org/wiki/API:Main_page",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=wikimedia-commons-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Wikimedia asks API clients to identify themselves; browser requests send Api-User-Agent: Public-API/0.1 (https://yapweijun1996.github.io/Public-API/). Respect the license and attribution metadata attached to each media result; Commons content does not share one universal license.",
      "parameters": [
        {
          "id": "query",
          "label": "Media search",
          "type": "text",
          "defaultValue": "Singapore skyline",
          "help": "Search file titles and descriptions on Wikimedia Commons.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 12 media files.",
          "min": 1,
          "max": 12,
          "step": 1
        }
      ]
    },
    {
      "id": "jsdelivr-package",
      "name": "jsDelivr Package Metadata",
      "provider": "jsDelivr",
      "category": "Developer",
      "description": "Inspect npm package tags and published versions from the jsDelivr public package metadata API.",
      "documentationUrl": "https://www.jsdelivr.com/docs/data.jsdelivr.com",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=jsdelivr-package",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "packageName",
          "label": "npm package",
          "type": "text",
          "defaultValue": "react",
          "help": "Enter an npm package name available through jsDelivr."
        }
      ]
    },
    {
      "id": "canada-open-data-search",
      "name": "Canada Open Data Search",
      "provider": "Government of Canada",
      "category": "Government",
      "description": "Search Canada’s open-government dataset and publication catalogue through its CKAN API.",
      "documentationUrl": "https://open.canada.ca/en/access-our-application-programming-interface-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=canada-open-data-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "query",
          "label": "Catalogue search",
          "type": "text",
          "defaultValue": "artificial intelligence",
          "help": "Search Canadian datasets and publications by keyword.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Results",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 20 catalogue records.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "gbif-occurrence-search",
      "name": "GBIF Occurrence Search",
      "provider": "GBIF",
      "category": "Biodiversity",
      "description": "Find real-world biodiversity occurrence records with species, observation date, locality, and coordinates.",
      "documentationUrl": "https://techdocs.gbif.org/en/openapi/v1/occurrence",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=gbif-occurrence-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Occurrence records come from many publishers with varying licences and data quality. Treat locations and identifications as source data rather than authoritative ground truth.",
      "parameters": [
        {
          "id": "scientificName",
          "label": "Scientific name",
          "type": "text",
          "defaultValue": "Panthera leo",
          "help": "Use a scientific species or taxon name.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Records",
          "type": "number",
          "defaultValue": "6",
          "help": "Return between 1 and 20 occurrence records.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "open-meteo-ensemble",
      "name": "Open-Meteo Ensemble Forecast",
      "provider": "Open-Meteo",
      "category": "Weather",
      "description": "Compare ensemble forecast members to understand uncertainty around temperature, rain, and wind predictions.",
      "documentationUrl": "https://open-meteo.com/en/docs/ensemble-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-meteo-ensemble",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Uses the documented ICON seamless EPS model. Ensemble members represent forecast uncertainty, not independent observations; communicate the spread or range instead of treating any one member as certain.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "variable",
          "label": "Forecast variable",
          "type": "select",
          "defaultValue": "temperature_2m",
          "help": "Choose the hourly quantity to compare across ensemble members.",
          "options": [
            {
              "label": "Temperature · 2 m",
              "value": "temperature_2m"
            },
            {
              "label": "Precipitation",
              "value": "precipitation"
            },
            {
              "label": "Wind speed · 10 m",
              "value": "wind_speed_10m"
            }
          ]
        },
        {
          "id": "forecastDays",
          "label": "Forecast days",
          "type": "number",
          "defaultValue": "3",
          "help": "Request between 1 and 7 whole forecast days.",
          "min": 1,
          "max": 7,
          "step": 1
        }
      ]
    },
    {
      "id": "world-bank-indicator-explorer",
      "name": "World Bank Indicator Explorer",
      "provider": "World Bank",
      "category": "Economy",
      "description": "Explore selectable World Bank development indicators by country and year range instead of relying on one hard-coded series.",
      "documentationUrl": "https://datahelpdesk.worldbank.org/knowledgebase/articles/889392-about-the-indicators-api-documentation",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=world-bank-indicator-explorer",
      "agentExecution": {
        "mode": "enabled"
      },
      "parameters": [
        {
          "id": "country",
          "label": "Country code",
          "type": "text",
          "defaultValue": "SGP",
          "help": "Use an ISO 3166-1 alpha-2 or alpha-3 country code such as SG or SGP.",
          "minLength": 2,
          "maxLength": 3,
          "pattern": "[A-Za-z]{2,3}",
          "patternDescription": "must contain exactly two or three letters for an ISO 3166-1 alpha-2 or alpha-3 country code."
        },
        {
          "id": "indicator",
          "label": "Indicator",
          "type": "select",
          "defaultValue": "SP.DYN.LE00.IN",
          "help": "Choose a commonly used World Bank indicator.",
          "options": [
            {
              "label": "Life expectancy",
              "value": "SP.DYN.LE00.IN"
            },
            {
              "label": "GDP · current US$",
              "value": "NY.GDP.MKTP.CD"
            },
            {
              "label": "GDP per capita · current US$",
              "value": "NY.GDP.PCAP.CD"
            },
            {
              "label": "Population",
              "value": "SP.POP.TOTL"
            },
            {
              "label": "Inflation · consumer prices %",
              "value": "FP.CPI.TOTL.ZG"
            },
            {
              "label": "Unemployment · %",
              "value": "SL.UEM.TOTL.ZS"
            },
            {
              "label": "Internet users · %",
              "value": "IT.NET.USER.ZS"
            }
          ]
        },
        {
          "id": "startYear",
          "label": "Start year",
          "type": "number",
          "defaultValue": "2015",
          "help": "Beginning of the requested time series.",
          "min": 1960,
          "max": 2100,
          "step": 1
        },
        {
          "id": "endYear",
          "label": "End year",
          "type": "number",
          "defaultValue": "2025",
          "help": "End of the requested time series; choose a year greater than or equal to the start year.",
          "min": 1960,
          "max": 2100,
          "step": 1,
          "minimumFromField": "startYear"
        }
      ]
    },
    {
      "id": "exchange-rate-current",
      "name": "Current FX Rates",
      "provider": "ExchangeRate-API",
      "category": "Finance",
      "description": "Read a current keyless exchange-rate table for a selected base currency.",
      "keywords": [
        "currency conversion",
        "convert currency",
        "foreign exchange",
        "FX conversion"
      ],
      "documentationUrl": "https://www.exchangerate-api.com/docs/free",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=exchange-rate-current",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "reason": "ExchangeRate-API says its open endpoint returns HTTP 429 when rate limited and that the rate limit remains in effect for about 20 minutes. Generic health verification records the first 429 and defers another provider request to a later independent run instead of retrying within that window.",
        "policyUrl": "https://www.exchangerate-api.com/docs/free"
      },
      "usageNote": "The open endpoint requires ExchangeRate-API attribution, updates once per day, permits caching but not redistribution, and returns HTTP 429 when rate limited. The provider says a rate-limited IP is allowed again after about 20 minutes.",
      "parameters": [
        {
          "id": "base",
          "label": "Base currency",
          "type": "select",
          "defaultValue": "SGD",
          "help": "Choose the currency whose current cross-rates should be displayed.",
          "options": [
            {
              "label": "SGD · Singapore Dollar",
              "value": "SGD"
            },
            {
              "label": "MYR · Malaysian Ringgit",
              "value": "MYR"
            },
            {
              "label": "USD · US Dollar",
              "value": "USD"
            },
            {
              "label": "EUR · Euro",
              "value": "EUR"
            },
            {
              "label": "GBP · Pound Sterling",
              "value": "GBP"
            },
            {
              "label": "JPY · Japanese Yen",
              "value": "JPY"
            },
            {
              "label": "AUD · Australian Dollar",
              "value": "AUD"
            }
          ]
        }
      ]
    },
    {
      "id": "circl-vulnerability",
      "name": "CIRCL Vulnerability Lookup",
      "provider": "CIRCL",
      "category": "Security",
      "description": "Fetch a normalized CVE 5 record from CIRCL Vulnerability-Lookup with CNA descriptions and affected products.",
      "documentationUrl": "https://vulnerability.circl.lu/api/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=circl-vulnerability",
      "agentExecution": {
        "mode": "manual-only",
        "reason": "CIRCL requires automated clients to send a meaningful User-Agent containing a contact URL or email. Browser JavaScript cannot set that protected header, so generic structured execution cannot satisfy the provider policy.",
        "policyUrl": "https://vulnerability.circl.lu/.well-known/api-policy.json"
      },
      "usageNote": "CIRCL permits anonymous use up to 20 requests per minute and requires automated clients to identify themselves with a meaningful User-Agent containing a contact URL or email. This browser workbench cannot set that protected header, so structured agent execution and automated live verification are disabled; the human-triggered Request Lab remains available for targeted interactive lookups. Use vulnerability records as investigation evidence, not as an automatic patching decision, and confirm affected versions and remediation guidance from the vendor or package ecosystem.",
      "parameters": [
        {
          "id": "cve",
          "label": "CVE ID",
          "type": "text",
          "defaultValue": "CVE-2021-44228",
          "help": "Enter a published CVE identifier using the CVE-YYYY-NNNN format.",
          "pattern": "CVE-[0-9]{4}-[0-9]{4,}",
          "patternDescription": "must use the CVE-YYYY-NNNN format with four or more sequence digits."
        }
      ]
    },
    {
      "id": "open-meteo-seasonal",
      "name": "Open-Meteo Seasonal Outlook",
      "provider": "Open-Meteo",
      "category": "Weather",
      "description": "Compare calendar-aligned weekly ECMWF EC46 temperature and precipitation means with model-climatology anomalies over a bounded forecast-day horizon.",
      "keywords": [
        "seasonal forecast",
        "long range weather",
        "weather anomaly",
        "ECMWF EC46",
        "climate outlook"
      ],
      "documentationUrl": "https://open-meteo.com/en/docs/seasonal-forecast-api",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=open-meteo-seasonal",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Seasonal data are coarse-resolution ensemble area forecasts and are not bias-corrected. The provider input is a forecast-day horizon, while weekly products are calendar-aligned: a 42-day horizon can intersect seven labelled weekly buckets because the first or final bucket may be partial. Do not interpret returned bucket count as an exact number of requested weeks.",
      "parameters": [
        {
          "id": "latitude",
          "label": "Latitude",
          "type": "number",
          "defaultValue": "1.3521",
          "help": "A WGS84 latitude from -90 to 90.",
          "min": -90,
          "max": 90
        },
        {
          "id": "longitude",
          "label": "Longitude",
          "type": "number",
          "defaultValue": "103.8198",
          "help": "A WGS84 longitude from -180 to 180.",
          "min": -180,
          "max": 180
        },
        {
          "id": "forecastDays",
          "label": "Forecast horizon (days)",
          "type": "number",
          "defaultValue": "42",
          "help": "Request 1–46 whole forecast days of EC46 weekly products. Calendar-aligned weekly buckets can include partial boundary weeks, so their count may differ from forecast days divided by seven.",
          "min": 1,
          "max": 46,
          "step": 1
        }
      ]
    },
    {
      "id": "nhtsa-safety-ratings",
      "name": "NHTSA Safety Ratings",
      "provider": "NHTSA",
      "category": "Vehicle",
      "description": "Look up official U.S. NCAP crash-test, rollover, complaint, recall, and investigation facts for one NHTSA VehicleId.",
      "keywords": [
        "car safety rating",
        "crash test rating",
        "NCAP",
        "vehicle rollover",
        "vehicle safety"
      ],
      "documentationUrl": "https://www.nhtsa.gov/nhtsa-datasets-and-apis",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=nhtsa-safety-ratings",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "Ratings describe the provider record for a specific NHTSA VehicleId. “Not Rated” is a provider value, not a zero-star rating. NHTSA calls OverallRating the Overall Vehicle Score; do not confuse it with an overall frontal or side crash rating. Overall Vehicle Scores and frontal crash ratings should only be compared with vehicles in the same class and within ±250 lb, while side and rollover ratings may be compared across classes. This VehicleId response does not include the curb-weight/class facts needed to validate an Overall/frontal competitive comparison. This demo is not a VIN eligibility or recall-repair lookup.",
      "parameters": [
        {
          "id": "vehicleId",
          "label": "NHTSA Vehicle ID",
          "type": "text",
          "defaultValue": "19426",
          "help": "Enter a canonical VehicleId returned by the NHTSA Safety Ratings API, for example 19426 for a 2024 Toyota Camry FWD. This demo supports IDs from 1 to 999999; that workbench bound is not a provider-wide maximum.",
          "minLength": 1,
          "maxLength": 6,
          "pattern": "[1-9][0-9]{0,5}",
          "patternDescription": "must be a canonical positive decimal ID from 1 to 999999."
        }
      ]
    },
    {
      "id": "singstat-cpi-monthly",
      "name": "Singapore CPI Monthly",
      "provider": "Singapore Department of Statistics",
      "category": "Singapore",
      "description": "Read the official seasonally adjusted Singapore all-items Consumer Price Index with 2024 as the base year.",
      "keywords": [
        "Singapore CPI",
        "Singapore inflation",
        "consumer price index",
        "SingStat prices"
      ],
      "documentationUrl": "https://tablebuilder.singstat.gov.sg/view-api/for-developers",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=singstat-cpi-monthly",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "SingStat Developer APIs are rate-limited to 100 calls per minute per IP. This demo asks the provider for the latest 12 All Items observations using the documented limit and key-descending sort parameters instead of downloading the full history. Values may be revised; preserve the provider update date and 2024-base-year index context.",
      "parameters": []
    },
    {
      "id": "openalex-works-search",
      "name": "OpenAlex Works Search",
      "provider": "OpenAlex",
      "category": "Research",
      "description": "Search the OpenAlex research graph for works with citation counts, DOI identity, authorship, and open-access status.",
      "keywords": [
        "research graph",
        "academic works",
        "citation search",
        "open access papers",
        "scholarly graph"
      ],
      "documentationUrl": "https://help.openalex.org/api/searching/",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=openalex-works-search",
      "agentExecution": {
        "mode": "enabled"
      },
      "automatedVerification": {
        "mode": "enabled",
        "retryOnRateLimit": false,
        "reason": "OpenAlex requires exponential backoff after HTTP 429. Generic health verification records the first 429 and defers another provider request to a later independent run instead of retrying immediately.",
        "policyUrl": "https://help.openalex.org/api/errors/"
      },
      "usageNote": "Casual OpenAlex API use can be keyless; a free API key raises the daily usage budget. This demo uses the current documented search/per_page/select request shape. Citation counts and open-access metadata are OpenAlex graph facts and may differ from other indexes.",
      "parameters": [
        {
          "id": "query",
          "label": "Works search",
          "type": "text",
          "defaultValue": "artificial intelligence",
          "help": "Search OpenAlex indexed works by text.",
          "minLength": 1
        },
        {
          "id": "limit",
          "label": "Works",
          "type": "number",
          "defaultValue": "8",
          "help": "Return between 1 and 20 research works.",
          "min": 1,
          "max": 20,
          "step": 1
        }
      ]
    },
    {
      "id": "oecd-cli",
      "name": "OECD Composite Leading Indicator",
      "provider": "OECD",
      "category": "Economy",
      "description": "Track the OECD harmonised monthly Composite Leading Indicator for a selected economy as a directional turning-point signal.",
      "keywords": [
        "OECD CLI",
        "leading indicator",
        "business cycle",
        "economic turning point",
        "macro outlook"
      ],
      "documentationUrl": "https://www.oecd.org/en/data/insights/data-explainers/2024/09/api.html",
      "method": "GET",
      "keyRequired": false,
      "responseType": "json",
      "requestLabUrl": "/Public-API/#/request-lab?api=oecd-cli",
      "agentExecution": {
        "mode": "enabled"
      },
      "usageNote": "The OECD CLI is designed for qualitative short-term movement and turning-point signals, not as a quantitative GDP forecast. OECD Data Explorer APIs are free of charge and rate-limited.",
      "parameters": [
        {
          "id": "area",
          "label": "Economy",
          "type": "select",
          "defaultValue": "USA",
          "help": "Choose an OECD CLI reference area.",
          "options": [
            {
              "label": "United States",
              "value": "USA"
            },
            {
              "label": "Japan",
              "value": "JPN"
            },
            {
              "label": "Germany",
              "value": "DEU"
            },
            {
              "label": "United Kingdom",
              "value": "GBR"
            },
            {
              "label": "Canada",
              "value": "CAN"
            },
            {
              "label": "Australia",
              "value": "AUS"
            }
          ]
        },
        {
          "id": "startYear",
          "label": "Start year",
          "type": "number",
          "defaultValue": "2025",
          "help": "Beginning year for the monthly CLI series.",
          "min": 2000,
          "max": 2100
        }
      ]
    }
  ]
}
