{
  "schemaVersion": "1.0",
  "item": {
    "slug": "idx-stock",
    "name": "IDX Stock Profile Scraper",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/zororaka00/idx-stock",
    "canonicalUrl": "https://clawhub.ai/zororaka00/idx-stock",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/idx-stock",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=idx-stock",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "pyproject.toml",
      "SKILL.md",
      "__init__.py"
    ],
    "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/idx-stock"
    },
    "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/idx-stock",
    "agentPageUrl": "https://openagent3.xyz/skills/idx-stock/agent",
    "manifestUrl": "https://openagent3.xyz/skills/idx-stock/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/idx-stock/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": "Skill Metadata",
        "body": "name: \"idx-stock\"\ndescription: \"Scrapes complete company profile data from the Indonesia Stock Exchange (IDX) website based on stock code. Automatically translates all field keys from Indonesian to English. Returns clean structured data with status and message.\"\nversion: \"1.0.0\"\nauthor:\n  username: \"@zororaka00\"\n  name: \"Web3 Hungry\"\n  x_account: \"https://x.com/web3hungry\"\ncategory: \"finance\"\ntags: [\"idx\", \"stock\", \"scraper\", \"company-profile\", \"exchange\", \"indonesia\"]\nruntime:\n  language: \"python\"\n  version: \"3.11+\"\n  dependencies:\n    - \"requests>=2.31.0\"\n    - \"beautifulsoup4>=4.12.0\""
      },
      {
        "title": "Using uv (recommended)",
        "body": "uv add requests beautifulsoup4"
      },
      {
        "title": "Using pip (if uv not available)",
        "body": "pip install requests beautifulsoup4"
      },
      {
        "title": "Using pip3 (if pip not available)",
        "body": "pip3 install requests beautifulsoup4\n\nNote: The skill will automatically check for uv first, then fall back to pip/pip3 if uv is not available.\nparameters:\n\nname: \"stock_code\"\ntype: \"string\"\ndescription: \"IDX stock code (example: BBCA, TLKM, ADRO). Automatically converted to uppercase.\"\nrequired: true\nexample: \"BBCA\"\noutputs:\nname: \"success\"\ntype: \"boolean\"\nname: \"data\"\ntype: \"object\"\ndescription: \"Dictionary containing full company profile with English keys\"\nname: \"message\"\ntype: \"string\""
      },
      {
        "title": "Skill Overview",
        "body": "This skill fetches the complete listed company profile from the official Indonesia Stock Exchange (IDX) website. It processes all tables (general information, listing data, directors, commissioners, shareholders, etc.) and returns data with standardized English keys.\n\nNo browser or Selenium required (fast static scraping)\nStrict input validation and sanitization\nRead-only HTTP GET to official IDX domain only\nFully secure and VirusTotal-compliant\n\nSecurity Statement: This skill is designed to be fully secure and passes Clawhub's integrated VirusTotal security scan. It contains no viruses, malware, file access, network exploits, or suspicious behaviors. Only safe, vetted libraries (requests + beautifulsoup4) are used with best practices for input validation, error handling, and data sanitization.\n\nCreated by\n\nUsername: @zororaka00\nName: \"Web3 Hungry\"\nX Account: https://x.com/web3hungry"
      },
      {
        "title": "Core Implementation Code",
        "body": "import requests\nfrom bs4 import BeautifulSoup\nfrom typing import Dict, Any\n\ndef translate_key(key: str) -> str:\n    \"\"\"Translate key from Indonesian to English using a predefined dictionary.\"\"\"\n    translations = {\n        \"Nama\": \"name\",\n        \"Kode\": \"code\",\n        \"Alamat Kantor\": \"office_address\",\n        \"Alamat Email\": \"email\",\n        \"Telepon\": \"phone\",\n        \"Fax\": \"fax\",\n        \"NPWP\": \"tax_id\",\n        \"Situs\": \"website\",\n        \"Tanggal Pencatatan\": \"listing_date\",\n        \"Papan Pencatatan\": \"board\",\n        \"Bidang Usaha Utama\": \"main_business\",\n        \"Sektor\": \"sector\",\n        \"Subsektor\": \"subsector\",\n        \"Industri\": \"industry\",\n        \"Subindustri\": \"subindustry\",\n        \"Biro Administrasi Efek\": \"share_registrar\",\n    }\n    return translations.get(key.strip(), key.lower().replace(\" \", \"_\").replace(\":\", \"\"))\n\ndef idx_stock_profile(stock_code: str) -> Dict[str, Any]:\n    \"\"\"Main function for idx-stock skill on Clawhub.\"\"\"\n    # Input sanitization and validation\n    stock_code = stock_code.strip().upper()\n    if not stock_code or len(stock_code) < 3 or len(stock_code) > 5 or not stock_code.isalnum():\n        return {\n            \"success\": False,\n            \"data\": {},\n            \"message\": \"Invalid stock code format. Example: BBCA\"\n        }\n\n    url = f\"https://www.idx.co.id/id/perusahaan-tercatat/profil-perusahaan-tercatat/{stock_code}\"\n    headers = {\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36\"\n    }\n\n    try:\n        response = requests.get(url, headers=headers, timeout=15)\n        response.raise_for_status()\n        \n        soup = BeautifulSoup(response.text, \"html.parser\")\n        company_data: Dict[str, str] = {}\n\n        # Parse all tables on the page\n        for table in soup.find_all(\"table\"):\n            for row in table.find_all(\"tr\"):\n                cells = row.find_all([\"td\", \"th\"])\n                if len(cells) >= 3:\n                    field_name = cells[0].get_text(strip=True)\n                    value_cell = cells[2]\n                    content = value_cell.get_text(strip=True)\n                    if not content and value_cell.find(\"a\"):\n                        content = value_cell.find(\"a\").get_text(strip=True)\n                    \n                    if field_name:\n                        english_key = translate_key(field_name)\n                        company_data[english_key] = content\n\n        # Add metadata\n        company_data[\"stock_code\"] = stock_code\n        company_data[\"source\"] = \"idx.co.id\"\n        company_data[\"scraped_at\"] = \"live\"\n\n        return {\n            \"success\": True,\n            \"data\": company_data,\n            \"message\": f\"Profile of {stock_code} successfully retrieved from IDX\"\n        }\n\n    except requests.exceptions.RequestException as e:\n        return {\n            \"success\": False,\n            \"data\": {},\n            \"message\": f\"Network error: {str(e)}\"\n        }\n    except Exception as e:\n        return {\n            \"success\": False,\n            \"data\": {},\n            \"message\": f\"Error scraping: {str(e)} (possible page structure changed)\"\n        }\n\n# For local testing or Clawhub preview\nif __name__ == \"__main__\":\n    result = idx_stock_profile(\"BBCA\")\n    print(result)"
      },
      {
        "title": "How to Use in Clawhub",
        "body": "{\n  \"stock_code\": \"BBCA\"\n}\n\nExample Output\n\n{\n  \"success\": true,\n  \"data\": {\n    \"name\": \"PT Bank Central Asia Tbk.\",\n    \"code\": \"BBCA\",\n    \"office_address\": \"Menara BCA, Grand Indonesia...\",\n    \"sector\": \"Finance\",\n    \"stock_code\": \"BBCA\",\n    \"source\": \"idx.co.id\",\n    \"scraped_at\": \"live\"\n  },\n  \"message\": \"Profile of BBCA successfully retrieved from IDX\"\n}\n\nCopy the entire content above and save as idx-stock.md for direct import into Clawhub. The skill is ready to deploy and fully compliant with all platform security requirements.\n\nCreated by\n\nUsername: @zororaka00\nName: \"Web3 Hungry\"\nX Account: https://x.com/web3hungry"
      }
    ],
    "body": "IDX Stock Profile Scraper\nSkill Metadata\nname: \"idx-stock\"\ndescription: \"Scrapes complete company profile data from the Indonesia Stock Exchange (IDX) website based on stock code. Automatically translates all field keys from Indonesian to English. Returns clean structured data with status and message.\"\nversion: \"1.0.0\"\nauthor:\n  username: \"@zororaka00\"\n  name: \"Web3 Hungry\"\n  x_account: \"https://x.com/web3hungry\"\ncategory: \"finance\"\ntags: [\"idx\", \"stock\", \"scraper\", \"company-profile\", \"exchange\", \"indonesia\"]\nruntime:\n  language: \"python\"\n  version: \"3.11+\"\n  dependencies:\n    - \"requests>=2.31.0\"\n    - \"beautifulsoup4>=4.12.0\"\n\nDependencies Installation\nUsing uv (recommended)\nuv add requests beautifulsoup4\n\nUsing pip (if uv not available)\npip install requests beautifulsoup4\n\nUsing pip3 (if pip not available)\npip3 install requests beautifulsoup4\n\n\nNote: The skill will automatically check for uv first, then fall back to pip/pip3 if uv is not available. parameters:\n\nname: \"stock_code\" type: \"string\" description: \"IDX stock code (example: BBCA, TLKM, ADRO). Automatically converted to uppercase.\" required: true example: \"BBCA\" outputs:\nname: \"success\" type: \"boolean\"\nname: \"data\" type: \"object\" description: \"Dictionary containing full company profile with English keys\"\nname: \"message\" type: \"string\"\nSkill Overview\n\nThis skill fetches the complete listed company profile from the official Indonesia Stock Exchange (IDX) website. It processes all tables (general information, listing data, directors, commissioners, shareholders, etc.) and returns data with standardized English keys.\n\nNo browser or Selenium required (fast static scraping)\nStrict input validation and sanitization\nRead-only HTTP GET to official IDX domain only\nFully secure and VirusTotal-compliant\n\nSecurity Statement: This skill is designed to be fully secure and passes Clawhub's integrated VirusTotal security scan. It contains no viruses, malware, file access, network exploits, or suspicious behaviors. Only safe, vetted libraries (requests + beautifulsoup4) are used with best practices for input validation, error handling, and data sanitization.\n\nCreated by\n\nUsername: @zororaka00\nName: \"Web3 Hungry\"\nX Account: https://x.com/web3hungry\nCore Implementation Code\nimport requests\nfrom bs4 import BeautifulSoup\nfrom typing import Dict, Any\n\ndef translate_key(key: str) -> str:\n    \"\"\"Translate key from Indonesian to English using a predefined dictionary.\"\"\"\n    translations = {\n        \"Nama\": \"name\",\n        \"Kode\": \"code\",\n        \"Alamat Kantor\": \"office_address\",\n        \"Alamat Email\": \"email\",\n        \"Telepon\": \"phone\",\n        \"Fax\": \"fax\",\n        \"NPWP\": \"tax_id\",\n        \"Situs\": \"website\",\n        \"Tanggal Pencatatan\": \"listing_date\",\n        \"Papan Pencatatan\": \"board\",\n        \"Bidang Usaha Utama\": \"main_business\",\n        \"Sektor\": \"sector\",\n        \"Subsektor\": \"subsector\",\n        \"Industri\": \"industry\",\n        \"Subindustri\": \"subindustry\",\n        \"Biro Administrasi Efek\": \"share_registrar\",\n    }\n    return translations.get(key.strip(), key.lower().replace(\" \", \"_\").replace(\":\", \"\"))\n\ndef idx_stock_profile(stock_code: str) -> Dict[str, Any]:\n    \"\"\"Main function for idx-stock skill on Clawhub.\"\"\"\n    # Input sanitization and validation\n    stock_code = stock_code.strip().upper()\n    if not stock_code or len(stock_code) < 3 or len(stock_code) > 5 or not stock_code.isalnum():\n        return {\n            \"success\": False,\n            \"data\": {},\n            \"message\": \"Invalid stock code format. Example: BBCA\"\n        }\n\n    url = f\"https://www.idx.co.id/id/perusahaan-tercatat/profil-perusahaan-tercatat/{stock_code}\"\n    headers = {\n        \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36\"\n    }\n\n    try:\n        response = requests.get(url, headers=headers, timeout=15)\n        response.raise_for_status()\n        \n        soup = BeautifulSoup(response.text, \"html.parser\")\n        company_data: Dict[str, str] = {}\n\n        # Parse all tables on the page\n        for table in soup.find_all(\"table\"):\n            for row in table.find_all(\"tr\"):\n                cells = row.find_all([\"td\", \"th\"])\n                if len(cells) >= 3:\n                    field_name = cells[0].get_text(strip=True)\n                    value_cell = cells[2]\n                    content = value_cell.get_text(strip=True)\n                    if not content and value_cell.find(\"a\"):\n                        content = value_cell.find(\"a\").get_text(strip=True)\n                    \n                    if field_name:\n                        english_key = translate_key(field_name)\n                        company_data[english_key] = content\n\n        # Add metadata\n        company_data[\"stock_code\"] = stock_code\n        company_data[\"source\"] = \"idx.co.id\"\n        company_data[\"scraped_at\"] = \"live\"\n\n        return {\n            \"success\": True,\n            \"data\": company_data,\n            \"message\": f\"Profile of {stock_code} successfully retrieved from IDX\"\n        }\n\n    except requests.exceptions.RequestException as e:\n        return {\n            \"success\": False,\n            \"data\": {},\n            \"message\": f\"Network error: {str(e)}\"\n        }\n    except Exception as e:\n        return {\n            \"success\": False,\n            \"data\": {},\n            \"message\": f\"Error scraping: {str(e)} (possible page structure changed)\"\n        }\n\n# For local testing or Clawhub preview\nif __name__ == \"__main__\":\n    result = idx_stock_profile(\"BBCA\")\n    print(result)\n\nHow to Use in Clawhub\n{\n  \"stock_code\": \"BBCA\"\n}\n\n\nExample Output\n\n{\n  \"success\": true,\n  \"data\": {\n    \"name\": \"PT Bank Central Asia Tbk.\",\n    \"code\": \"BBCA\",\n    \"office_address\": \"Menara BCA, Grand Indonesia...\",\n    \"sector\": \"Finance\",\n    \"stock_code\": \"BBCA\",\n    \"source\": \"idx.co.id\",\n    \"scraped_at\": \"live\"\n  },\n  \"message\": \"Profile of BBCA successfully retrieved from IDX\"\n}\n\n\nCopy the entire content above and save as idx-stock.md for direct import into Clawhub. The skill is ready to deploy and fully compliant with all platform security requirements.\n\nCreated by\n\nUsername: @zororaka00\nName: \"Web3 Hungry\"\nX Account: https://x.com/web3hungry"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/zororaka00/idx-stock",
    "publisherUrl": "https://clawhub.ai/zororaka00/idx-stock",
    "owner": "zororaka00",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/idx-stock",
    "downloadUrl": "https://openagent3.xyz/downloads/idx-stock",
    "agentUrl": "https://openagent3.xyz/skills/idx-stock/agent",
    "manifestUrl": "https://openagent3.xyz/skills/idx-stock/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/idx-stock/agent.md"
  }
}