{
  "schemaVersion": "1.0",
  "item": {
    "slug": "price-api",
    "name": "Price Api",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/datadrivenconstruction/price-api",
    "canonicalUrl": "https://clawhub.ai/datadrivenconstruction/price-api",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/price-api",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=price-api",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "claw.json",
      "instructions.md",
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/price-api"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/price-api",
    "agentPageUrl": "https://openagent3.xyz/skills/price-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/price-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/price-api/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Overview",
        "body": "Material prices fluctuate constantly. This skill fetches prices from open sources, tracks trends, and updates cost databases with current market data."
      },
      {
        "title": "Python Implementation",
        "body": "import requests\nimport pandas as pd\nfrom typing import Dict, Any, List, Optional\nfrom dataclasses import dataclass, field\nfrom datetime import datetime, timedelta\nfrom enum import Enum\nimport json\n\n\nclass MaterialCategory(Enum):\n    \"\"\"Construction material categories.\"\"\"\n    CONCRETE = \"concrete\"\n    STEEL = \"steel\"\n    LUMBER = \"lumber\"\n    COPPER = \"copper\"\n    ALUMINUM = \"aluminum\"\n    CEMENT = \"cement\"\n    AGGREGATES = \"aggregates\"\n    ASPHALT = \"asphalt\"\n\n\n@dataclass\nclass MaterialPrice:\n    \"\"\"Material price point.\"\"\"\n    material: str\n    price: float\n    unit: str\n    currency: str\n    source: str\n    date: datetime\n    region: str = \"\"\n\n\n@dataclass\nclass PriceTrend:\n    \"\"\"Price trend analysis.\"\"\"\n    material: str\n    current_price: float\n    week_change: float\n    month_change: float\n    year_change: float\n    trend_direction: str  # 'up', 'down', 'stable'\n\n\nclass OpenPriceAPI:\n    \"\"\"Client for open material price APIs.\"\"\"\n\n    # Commodity price sources\n    FRED_BASE = \"https://api.stlouisfed.org/fred/series/observations\"\n\n    # FRED Series IDs for construction commodities\n    FRED_SERIES = {\n        'steel': 'WPU101',\n        'lumber': 'WPS0811',\n        'concrete': 'WPU133',\n        'copper': 'PCOPPUSDM',\n        'aluminum': 'PALUMUSDM'\n    }\n\n    def __init__(self, fred_api_key: Optional[str] = None):\n        self.fred_api_key = fred_api_key\n\n    def get_fred_prices(self, material: str,\n                        start_date: str = None,\n                        end_date: str = None) -> List[MaterialPrice]:\n        \"\"\"Get prices from FRED API.\"\"\"\n\n        if material.lower() not in self.FRED_SERIES:\n            return []\n\n        series_id = self.FRED_SERIES[material.lower()]\n\n        if start_date is None:\n            start_date = (datetime.now() - timedelta(days=365)).strftime('%Y-%m-%d')\n        if end_date is None:\n            end_date = datetime.now().strftime('%Y-%m-%d')\n\n        params = {\n            'series_id': series_id,\n            'observation_start': start_date,\n            'observation_end': end_date,\n            'file_type': 'json'\n        }\n\n        if self.fred_api_key:\n            params['api_key'] = self.fred_api_key\n\n        try:\n            response = requests.get(self.FRED_BASE, params=params)\n            if response.status_code != 200:\n                return []\n\n            data = response.json()\n            observations = data.get('observations', [])\n\n            prices = []\n            for obs in observations:\n                try:\n                    price = float(obs['value'])\n                    prices.append(MaterialPrice(\n                        material=material,\n                        price=price,\n                        unit='index',\n                        currency='USD',\n                        source='FRED',\n                        date=datetime.strptime(obs['date'], '%Y-%m-%d'),\n                        region='US'\n                    ))\n                except (ValueError, KeyError):\n                    continue\n\n            return prices\n\n        except Exception as e:\n            print(f\"Error fetching FRED data: {e}\")\n            return []\n\n    def to_dataframe(self, prices: List[MaterialPrice]) -> pd.DataFrame:\n        \"\"\"Convert prices to DataFrame.\"\"\"\n        data = [{\n            'material': p.material,\n            'price': p.price,\n            'unit': p.unit,\n            'currency': p.currency,\n            'source': p.source,\n            'date': p.date,\n            'region': p.region\n        } for p in prices]\n        return pd.DataFrame(data)\n\n\nclass ConstructionPriceTracker:\n    \"\"\"Track and analyze construction material prices.\"\"\"\n\n    # Default regional factors\n    REGIONAL_FACTORS = {\n        'US_National': 1.0,\n        'US_Northeast': 1.15,\n        'US_Southeast': 0.95,\n        'US_Midwest': 0.92,\n        'US_West': 1.10,\n        'Germany': 1.25,\n        'UK': 1.20,\n        'France': 1.18\n    }\n\n    def __init__(self):\n        self.price_cache: Dict[str, pd.DataFrame] = {}\n\n    def calculate_trend(self, prices: pd.DataFrame) -> PriceTrend:\n        \"\"\"Calculate price trend from historical data.\"\"\"\n\n        if prices.empty or 'price' not in prices.columns:\n            return None\n\n        prices = prices.sort_values('date')\n        current = prices['price'].iloc[-1]\n\n        # Calculate changes\n        week_ago_idx = len(prices) - 7 if len(prices) >= 7 else 0\n        month_ago_idx = len(prices) - 30 if len(prices) >= 30 else 0\n        year_ago_idx = len(prices) - 365 if len(prices) >= 365 else 0\n\n        week_price = prices['price'].iloc[week_ago_idx]\n        month_price = prices['price'].iloc[month_ago_idx]\n        year_price = prices['price'].iloc[year_ago_idx]\n\n        week_change = ((current - week_price) / week_price * 100) if week_price else 0\n        month_change = ((current - month_price) / month_price * 100) if month_price else 0\n        year_change = ((current - year_price) / year_price * 100) if year_price else 0\n\n        # Determine trend\n        if month_change > 5:\n            trend = 'up'\n        elif month_change < -5:\n            trend = 'down'\n        else:\n            trend = 'stable'\n\n        return PriceTrend(\n            material=prices['material'].iloc[0],\n            current_price=current,\n            week_change=round(week_change, 2),\n            month_change=round(month_change, 2),\n            year_change=round(year_change, 2),\n            trend_direction=trend\n        )\n\n    def apply_regional_factor(self, base_price: float,\n                              region: str) -> float:\n        \"\"\"Apply regional price factor.\"\"\"\n        factor = self.REGIONAL_FACTORS.get(region, 1.0)\n        return base_price * factor\n\n    def update_cost_database(self, cost_df: pd.DataFrame,\n                             price_updates: Dict[str, float],\n                             date_column: str = 'last_updated') -> pd.DataFrame:\n        \"\"\"Update cost database with new prices.\"\"\"\n        updated = cost_df.copy()\n\n        for material, price in price_updates.items():\n            # Find rows with this material\n            mask = updated['material'].str.lower() == material.lower()\n            if mask.any():\n                # Calculate adjustment factor\n                old_price = updated.loc[mask, 'unit_price'].mean()\n                factor = price / old_price if old_price > 0 else 1\n\n                # Update prices\n                updated.loc[mask, 'unit_price'] *= factor\n                updated.loc[mask, date_column] = datetime.now()\n\n        return updated\n\n\nclass MaterialPriceEstimator:\n    \"\"\"Estimate material prices when API data unavailable.\"\"\"\n\n    # Reference prices (USD per unit, as of 2024)\n    REFERENCE_PRICES = {\n        'concrete_m3': 120,\n        'rebar_ton': 800,\n        'structural_steel_ton': 1200,\n        'lumber_mbf': 450,\n        'copper_wire_kg': 12,\n        'brick_1000': 550,\n        'cement_ton': 130,\n        'sand_m3': 35,\n        'gravel_m3': 40,\n        'drywall_m2': 8,\n        'insulation_m2': 25\n    }\n\n    def estimate_price(self, material: str,\n                       region: str = 'US_National',\n                       inflation_adjustment: float = 0) -> float:\n        \"\"\"Estimate current price for material.\"\"\"\n        base_price = self.REFERENCE_PRICES.get(material, 0)\n\n        if base_price == 0:\n            return 0\n\n        # Apply inflation\n        adjusted = base_price * (1 + inflation_adjustment)\n\n        # Apply regional factor\n        tracker = ConstructionPriceTracker()\n        return tracker.apply_regional_factor(adjusted, region)\n\n    def bulk_estimate(self, materials: List[str],\n                      region: str = 'US_National') -> pd.DataFrame:\n        \"\"\"Estimate prices for multiple materials.\"\"\"\n        estimates = []\n        for material in materials:\n            price = self.estimate_price(material, region)\n            estimates.append({\n                'material': material,\n                'estimated_price': price,\n                'region': region,\n                'source': 'estimate',\n                'date': datetime.now()\n            })\n        return pd.DataFrame(estimates)"
      },
      {
        "title": "Quick Start",
        "body": "# Initialize price API\napi = OpenPriceAPI(fred_api_key=\"your_key\")\n\n# Get steel prices\nsteel_prices = api.get_fred_prices('steel')\ndf = api.to_dataframe(steel_prices)\nprint(df.tail())\n\n# Analyze trend\ntracker = ConstructionPriceTracker()\ntrend = tracker.calculate_trend(df)\nprint(f\"Steel trend: {trend.trend_direction}, YoY: {trend.year_change}%\")"
      },
      {
        "title": "1. Update Cost Database",
        "body": "tracker = ConstructionPriceTracker()\n\n# New prices from market\nupdates = {'steel': 1250, 'concrete': 135, 'lumber': 480}\n\n# Update database\nupdated_db = tracker.update_cost_database(cost_df, updates)"
      },
      {
        "title": "2. Regional Pricing",
        "body": "base_price = 120  # concrete USD/m3\nberlin_price = tracker.apply_regional_factor(base_price, 'Germany')\nprint(f\"Berlin price: ${berlin_price}/m3\")"
      },
      {
        "title": "3. Bulk Estimation",
        "body": "estimator = MaterialPriceEstimator()\n\nmaterials = ['concrete_m3', 'rebar_ton', 'lumber_mbf']\nestimates = estimator.bulk_estimate(materials, region='US_West')\nprint(estimates)"
      },
      {
        "title": "Resources",
        "body": "DDC Book: Chapter 2.2 - Open Data Sources\nFRED API: https://fred.stlouisfed.org/docs/api/"
      }
    ],
    "body": "Price API for Construction Materials\nOverview\n\nMaterial prices fluctuate constantly. This skill fetches prices from open sources, tracks trends, and updates cost databases with current market data.\n\nPython Implementation\nimport requests\nimport pandas as pd\nfrom typing import Dict, Any, List, Optional\nfrom dataclasses import dataclass, field\nfrom datetime import datetime, timedelta\nfrom enum import Enum\nimport json\n\n\nclass MaterialCategory(Enum):\n    \"\"\"Construction material categories.\"\"\"\n    CONCRETE = \"concrete\"\n    STEEL = \"steel\"\n    LUMBER = \"lumber\"\n    COPPER = \"copper\"\n    ALUMINUM = \"aluminum\"\n    CEMENT = \"cement\"\n    AGGREGATES = \"aggregates\"\n    ASPHALT = \"asphalt\"\n\n\n@dataclass\nclass MaterialPrice:\n    \"\"\"Material price point.\"\"\"\n    material: str\n    price: float\n    unit: str\n    currency: str\n    source: str\n    date: datetime\n    region: str = \"\"\n\n\n@dataclass\nclass PriceTrend:\n    \"\"\"Price trend analysis.\"\"\"\n    material: str\n    current_price: float\n    week_change: float\n    month_change: float\n    year_change: float\n    trend_direction: str  # 'up', 'down', 'stable'\n\n\nclass OpenPriceAPI:\n    \"\"\"Client for open material price APIs.\"\"\"\n\n    # Commodity price sources\n    FRED_BASE = \"https://api.stlouisfed.org/fred/series/observations\"\n\n    # FRED Series IDs for construction commodities\n    FRED_SERIES = {\n        'steel': 'WPU101',\n        'lumber': 'WPS0811',\n        'concrete': 'WPU133',\n        'copper': 'PCOPPUSDM',\n        'aluminum': 'PALUMUSDM'\n    }\n\n    def __init__(self, fred_api_key: Optional[str] = None):\n        self.fred_api_key = fred_api_key\n\n    def get_fred_prices(self, material: str,\n                        start_date: str = None,\n                        end_date: str = None) -> List[MaterialPrice]:\n        \"\"\"Get prices from FRED API.\"\"\"\n\n        if material.lower() not in self.FRED_SERIES:\n            return []\n\n        series_id = self.FRED_SERIES[material.lower()]\n\n        if start_date is None:\n            start_date = (datetime.now() - timedelta(days=365)).strftime('%Y-%m-%d')\n        if end_date is None:\n            end_date = datetime.now().strftime('%Y-%m-%d')\n\n        params = {\n            'series_id': series_id,\n            'observation_start': start_date,\n            'observation_end': end_date,\n            'file_type': 'json'\n        }\n\n        if self.fred_api_key:\n            params['api_key'] = self.fred_api_key\n\n        try:\n            response = requests.get(self.FRED_BASE, params=params)\n            if response.status_code != 200:\n                return []\n\n            data = response.json()\n            observations = data.get('observations', [])\n\n            prices = []\n            for obs in observations:\n                try:\n                    price = float(obs['value'])\n                    prices.append(MaterialPrice(\n                        material=material,\n                        price=price,\n                        unit='index',\n                        currency='USD',\n                        source='FRED',\n                        date=datetime.strptime(obs['date'], '%Y-%m-%d'),\n                        region='US'\n                    ))\n                except (ValueError, KeyError):\n                    continue\n\n            return prices\n\n        except Exception as e:\n            print(f\"Error fetching FRED data: {e}\")\n            return []\n\n    def to_dataframe(self, prices: List[MaterialPrice]) -> pd.DataFrame:\n        \"\"\"Convert prices to DataFrame.\"\"\"\n        data = [{\n            'material': p.material,\n            'price': p.price,\n            'unit': p.unit,\n            'currency': p.currency,\n            'source': p.source,\n            'date': p.date,\n            'region': p.region\n        } for p in prices]\n        return pd.DataFrame(data)\n\n\nclass ConstructionPriceTracker:\n    \"\"\"Track and analyze construction material prices.\"\"\"\n\n    # Default regional factors\n    REGIONAL_FACTORS = {\n        'US_National': 1.0,\n        'US_Northeast': 1.15,\n        'US_Southeast': 0.95,\n        'US_Midwest': 0.92,\n        'US_West': 1.10,\n        'Germany': 1.25,\n        'UK': 1.20,\n        'France': 1.18\n    }\n\n    def __init__(self):\n        self.price_cache: Dict[str, pd.DataFrame] = {}\n\n    def calculate_trend(self, prices: pd.DataFrame) -> PriceTrend:\n        \"\"\"Calculate price trend from historical data.\"\"\"\n\n        if prices.empty or 'price' not in prices.columns:\n            return None\n\n        prices = prices.sort_values('date')\n        current = prices['price'].iloc[-1]\n\n        # Calculate changes\n        week_ago_idx = len(prices) - 7 if len(prices) >= 7 else 0\n        month_ago_idx = len(prices) - 30 if len(prices) >= 30 else 0\n        year_ago_idx = len(prices) - 365 if len(prices) >= 365 else 0\n\n        week_price = prices['price'].iloc[week_ago_idx]\n        month_price = prices['price'].iloc[month_ago_idx]\n        year_price = prices['price'].iloc[year_ago_idx]\n\n        week_change = ((current - week_price) / week_price * 100) if week_price else 0\n        month_change = ((current - month_price) / month_price * 100) if month_price else 0\n        year_change = ((current - year_price) / year_price * 100) if year_price else 0\n\n        # Determine trend\n        if month_change > 5:\n            trend = 'up'\n        elif month_change < -5:\n            trend = 'down'\n        else:\n            trend = 'stable'\n\n        return PriceTrend(\n            material=prices['material'].iloc[0],\n            current_price=current,\n            week_change=round(week_change, 2),\n            month_change=round(month_change, 2),\n            year_change=round(year_change, 2),\n            trend_direction=trend\n        )\n\n    def apply_regional_factor(self, base_price: float,\n                              region: str) -> float:\n        \"\"\"Apply regional price factor.\"\"\"\n        factor = self.REGIONAL_FACTORS.get(region, 1.0)\n        return base_price * factor\n\n    def update_cost_database(self, cost_df: pd.DataFrame,\n                             price_updates: Dict[str, float],\n                             date_column: str = 'last_updated') -> pd.DataFrame:\n        \"\"\"Update cost database with new prices.\"\"\"\n        updated = cost_df.copy()\n\n        for material, price in price_updates.items():\n            # Find rows with this material\n            mask = updated['material'].str.lower() == material.lower()\n            if mask.any():\n                # Calculate adjustment factor\n                old_price = updated.loc[mask, 'unit_price'].mean()\n                factor = price / old_price if old_price > 0 else 1\n\n                # Update prices\n                updated.loc[mask, 'unit_price'] *= factor\n                updated.loc[mask, date_column] = datetime.now()\n\n        return updated\n\n\nclass MaterialPriceEstimator:\n    \"\"\"Estimate material prices when API data unavailable.\"\"\"\n\n    # Reference prices (USD per unit, as of 2024)\n    REFERENCE_PRICES = {\n        'concrete_m3': 120,\n        'rebar_ton': 800,\n        'structural_steel_ton': 1200,\n        'lumber_mbf': 450,\n        'copper_wire_kg': 12,\n        'brick_1000': 550,\n        'cement_ton': 130,\n        'sand_m3': 35,\n        'gravel_m3': 40,\n        'drywall_m2': 8,\n        'insulation_m2': 25\n    }\n\n    def estimate_price(self, material: str,\n                       region: str = 'US_National',\n                       inflation_adjustment: float = 0) -> float:\n        \"\"\"Estimate current price for material.\"\"\"\n        base_price = self.REFERENCE_PRICES.get(material, 0)\n\n        if base_price == 0:\n            return 0\n\n        # Apply inflation\n        adjusted = base_price * (1 + inflation_adjustment)\n\n        # Apply regional factor\n        tracker = ConstructionPriceTracker()\n        return tracker.apply_regional_factor(adjusted, region)\n\n    def bulk_estimate(self, materials: List[str],\n                      region: str = 'US_National') -> pd.DataFrame:\n        \"\"\"Estimate prices for multiple materials.\"\"\"\n        estimates = []\n        for material in materials:\n            price = self.estimate_price(material, region)\n            estimates.append({\n                'material': material,\n                'estimated_price': price,\n                'region': region,\n                'source': 'estimate',\n                'date': datetime.now()\n            })\n        return pd.DataFrame(estimates)\n\nQuick Start\n# Initialize price API\napi = OpenPriceAPI(fred_api_key=\"your_key\")\n\n# Get steel prices\nsteel_prices = api.get_fred_prices('steel')\ndf = api.to_dataframe(steel_prices)\nprint(df.tail())\n\n# Analyze trend\ntracker = ConstructionPriceTracker()\ntrend = tracker.calculate_trend(df)\nprint(f\"Steel trend: {trend.trend_direction}, YoY: {trend.year_change}%\")\n\nCommon Use Cases\n1. Update Cost Database\ntracker = ConstructionPriceTracker()\n\n# New prices from market\nupdates = {'steel': 1250, 'concrete': 135, 'lumber': 480}\n\n# Update database\nupdated_db = tracker.update_cost_database(cost_df, updates)\n\n2. Regional Pricing\nbase_price = 120  # concrete USD/m3\nberlin_price = tracker.apply_regional_factor(base_price, 'Germany')\nprint(f\"Berlin price: ${berlin_price}/m3\")\n\n3. Bulk Estimation\nestimator = MaterialPriceEstimator()\n\nmaterials = ['concrete_m3', 'rebar_ton', 'lumber_mbf']\nestimates = estimator.bulk_estimate(materials, region='US_West')\nprint(estimates)\n\nResources\nDDC Book: Chapter 2.2 - Open Data Sources\nFRED API: https://fred.stlouisfed.org/docs/api/"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/datadrivenconstruction/price-api",
    "publisherUrl": "https://clawhub.ai/datadrivenconstruction/price-api",
    "owner": "datadrivenconstruction",
    "version": "2.1.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/price-api",
    "downloadUrl": "https://openagent3.xyz/downloads/price-api",
    "agentUrl": "https://openagent3.xyz/skills/price-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/price-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/price-api/agent.md"
  }
}