SafeSkill API 文档
SafeSkill 通过 RESTful API 提供 AI Agent Skill 安全检测能力。支持通过文件上传、URL 或 Skill 名称提交检测,包含静态分析、外链威胁情报、LLM 语义分析与动态沙箱检测。
Base URL:
https://api.safeskill.cn认证方式
所有 API 请求需通过 apikey 参数进行认证。登录后在用户中心获取 API Key。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
apikey | string | Yes | 用于认证的 API 密钥 |
调用流程
1提交 Skill(文件 / URL / 名称)
2获取 SHA256
3轮询报告接口
4获取检测结果
POST
/api/v1/scan
通过文件上传、URL 或 Skill 名称提交安全扫描。系统自动识别输入类型并执行相应的检测流程。
POSThttps://api.safeskill.cn/api/v1/scan
每次请求仅提供 file、url、name 中的一个。使用 file 时 Content-Type 为 multipart/form-data;使用 url 或 name 时使用 application/json。仅支持 Skill 文件,非 Skill 文件将被拒绝(response_code: -2)。
* 互斥参数 — 每次请求只能提供 file、url、name 中的一个。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
apikey | string | Yes | 用于认证的 API 密钥 |
file | file | No | 待扫描的 Skill 包文件(zip、tar.gz)或 SKILL.md |
url | string | No | 支持的 Skill 商店 URL(如 ClawHub、GitHub)或 Skill 包直链 |
name | string | No | 在支持的 Skill 商店中搜索并扫描的 Skill 名称(不区分大小写) |
响应
JSON
{
'response_code': 0,
'verbose_msg': 'OK',
'data': {
'sha256': 'a1b2c3d4e5f67890abcdef...1234567890',
'permalink': 'https://SafeSkill.io/report/{sha256}'
}
}| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.sha256 | string | No | 扫描 Skill 的 SHA256 哈希,用于查询报告 |
data.permalink | string | No | 在线扫描报告链接 |
示例
cURL — file
curl -X POST "https://api.safeskill.cn/api/v1/scan" \
-F "apikey=YOUR_API_KEY" \
-F "file=@linkedin-skill.zip"cURL — url
curl -X POST "https://api.safeskill.cn/api/v1/scan" \
-H "Content-Type: application/json" \
-d '{"apikey":"YOUR_API_KEY","url":"https://clawhub.ai/ide-rea/linkedin"}'cURL — name
curl -X POST "https://api.safeskill.cn/api/v1/scan" \
-H "Content-Type: application/json" \
-d '{"apikey":"YOUR_API_KEY","name":"linkedin"}'Python — file
import requests
resp = requests.post(
"https://api.safeskill.cn/api/v1/scan",
data={"apikey": "YOUR_API_KEY"},
files={"file": open("linkedin-skill.zip", "rb")}
)
sha256 = resp.json()["data"]["sha256"]
print(f"Submitted. SHA256: {sha256}")Python — url / name
import requests
# Scan by URL
resp = requests.post(
"https://api.safeskill.cn/api/v1/scan",
json={"apikey": "YOUR_API_KEY", "url": "https://clawhub.ai/ide-rea/linkedin"}
)
# Scan by name
resp = requests.post(
"https://api.safeskill.cn/api/v1/scan",
json={"apikey": "YOUR_API_KEY", "name": "linkedin"}
)
sha256 = resp.json()["data"]["sha256"]
print(f"Submitted. SHA256: {sha256}")GET
/v1/search
按名称或 URL 搜索 SafeSkill 数据库中的 Skill。返回匹配记录,包含基本 Skill 信息、来源和检测时间。
GEThttps://api.safeskill.cn/v1/search?apikey=...&query=...
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
apikey | string | Yes | 用于认证的 API 密钥 |
query | string | Yes | 要搜索的 Skill 名称或 URL |
page | integer | No | 页码,默认 1 |
per_page | integer | No | 每页结果数,默认 20(最大 100) |
响应
JSON
{
"response_code": 0,
"verbose_msg": "OK",
"data": {
"total": 3,
"page": 1,
"per_page": 20,
"results": [
{
"sha256": "a1b2c3d4...",
"skill_name": "linkedin",
"skill_type": "OpenClaw Skill",
"developer": "",
"version": "",
"description": "Use when you need to interact with LinkedIn...",
"threat_level": "malicious",
"source": "clawhub.ai",
"source_url": "https://clawhub.ai/ide-rea/linkedin",
"file_name": "linkedin-skill.zip",
"first_seen": "2026-02-20 10:30:00",
"last_detection_time": "2026-03-11 14:23:00",
"permalink": "https://SafeSkill.io/report/a1b2c3d4..."
}
]
}
}响应字段 — results[]
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
sha256 | string | No | 文件 SHA256 哈希 |
skill_name | string | No | Skill 名称 |
skill_type | string | No | Skill 类型 |
developer | string | No | 开发者 |
version | string | No | 版本 |
description | string | No | Skill 描述 |
threat_level | string | No | 总体威胁等级 |
source | string | No | 来源平台 |
source_url | string | No | 原始来源 URL |
file_name | string | No | 原始文件名 |
first_seen | string | No | 首次发现时间 |
last_detection_time | string | No | 最近检测时间 |
permalink | string | No | 完整扫描报告链接 |
示例
cURL
curl "https://api.safeskill.cn/v1/search?apikey=YOUR_API_KEY&query=linkedin"Python
import requests
resp = requests.get(
"https://api.safeskill.cn/v1/search",
params={"apikey": "YOUR_API_KEY", "query": "linkedin"}
)
for item in resp.json()["data"]["results"]:
print(f"{item['skill_name']} — {item['threat_level']}")GET
/v1/report
根据文件的 SHA256 查询详细扫描报告。返回包含静态分析、外链分析、LLM 语义分析和动态检测的全面检测结果。
GEThttps://api.safeskill.cn/v1/report?apikey=...&sha256=...
文件仍在分析时(response_code: 3),响应可能包含不完整数据。建议每 10 秒轮询,最多等待 5 分钟。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
apikey | string | Yes | 用于认证的 API 密钥 |
sha256 | string | Yes | 扫描接口返回的 SHA256 |
响应
JSON
{
"response_code": 0,
"verbose_msg": "OK",
"data": {
"summary": {
"sha256": "a1b2c3d4e5f67890...",
"sha1": "b2c3d4e5f67890ab...",
"md5": "c3d4e5f67890abcd...",
"file_type": "application/zip",
"file_name": "linkedin-skill.zip",
"threat_level": "malicious",
"trust_score": 12,
"is_whitelist": false,
"multi_engines": "7/25",
"first_seen": "2026-03-11 14:20:00",
"last_seen": "2026-03-11 14:23:00",
"tags": ["zip", "openclaw_skill"],
"threat_classify": "Trojan",
"threat_name": "ClawHavoc"
},
"skill_details": {
"type": "OpenClaw Skill",
"basic_info": {
"skill_name": "linkedin",
"developer": "",
"version": "",
"skill_type": "OpenClaw Skill",
"description": "Use when you need to interact..."
}
},
"multi_verdict": {
"llm": "malicious",
"static": "malicious",
"dynamic": "unknown",
"subfiles": "unknown",
"external_urls": "malicious"
},
"external_urls_details": [
{
"url": "https://github.com/...",
"source": "SKILL.md",
"trigger_type": "manual",
"platform": "windows",
"threat_level": "malicious",
"last_detection_time": "2026-02-27 17:03:25",
"ext_info": { ... }
}
],
"subfile_details": [
{
"name": "data_fetcher.py",
"sha256": "af6a70...",
"sha1": "9b1442...",
"md5": "eac269...",
"size": 9626,
"threat_level": "unknown",
"file_type": "PYTHON"
}
],
"llm_details": {
"summary": "High-risk behaviors detected...",
"risk_level": "malicious",
"risk_indicators": [
{
"indicator": "Downloads from unofficial repo",
"severity": "high",
"evidence": "https://github.com/..."
}
]
},
"permalink": "https://SafeSkill.io/report/..."
}
}响应字段
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
data.summary | object | No | 文件摘要(哈希、威胁等级、可信度、检测详情) |
data.summary.sha1 | string | No | 文件 SHA1 哈希 |
data.summary.md5 | string | No | 文件 MD5 哈希 |
data.summary.threat_level | string | No | Skill 的总体威胁等级 |
data.summary.trust_score | integer | No | 信任分数(0–100);区间含义见 Trust Score |
data.summary.first_seen | string | No | 文件提交时间 |
data.summary.last_seen | string | No | 最后检测时间 |
data.summary.tags | array | No | 标签列表 |
data.skill_details.type | string | No | 检测到的 Skill 类型 |
data.skill_details.basic_info | object | No | Skill 元数据(名称、开发者、版本、描述) |
data.multi_verdict | object | No | 各维度判定(llm、static、dynamic、subfiles、external_urls) |
data.external_urls_details | array | No | 各外链的详细分析 |
data.subfile_details | array | No | 子文件检测详情 |
data.llm_details | object | No | LLM 语义分析结果 |
data.permalink | string | No | 在线报告链接 |
示例
cURL
curl "https://api.safeskill.cn/v1/report?apikey=YOUR_API_KEY&sha256=a1b2c3d4..."Python — Scan + Poll
import requests, time
API_KEY = "YOUR_API_KEY"
# Step 1: Submit scan (file example)
resp = requests.post(
"https://api.safeskill.cn/api/v1/scan",
data={"apikey": API_KEY},
files={"file": open("linkedin-skill.zip", "rb")}
)
sha256 = resp.json()["data"]["sha256"]
# Step 2: Poll for report
for i in range(30):
r = requests.get(
"https://api.safeskill.cn/v1/report",
params={"apikey": API_KEY, "sha256": sha256}
)
data = r.json().get("data", {})
if data.get("multi_verdict"):
mv = data["multi_verdict"]
print(f"LLM: {mv['llm']}, Static: {mv['static']}, Dynamic: {mv['dynamic']}")
print(f"Trust Score: {data['summary']['trust_score']}")
break
time.sleep(10)枚举值
威胁等级枚举
所有 threat_level 和 risk_level 字段使用以下值:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
malicious | string | No | 恶意 — 确认威胁 |
suspicious | string | No | 可疑 — 潜在风险 |
unknown | string | No | 未知 — 数据不足 |
clean | string | No | 安全 — 未发现威胁 |
信任分数(trust_score)
trust_score 为 0–100 的整数。分数区间:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
80 – 100 | range | No | 未发现明显安全风险 |
71 – 79 | range | No | 灰度区间,证据不足无法定性 |
41 – 70 | range | No | 可疑,存在潜在风险行为 |
0 – 40 | range | No | 恶意,确认存在威胁 |
risk_indicators[].category
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
data_theft | string | No | 数据窃取 |
network_risk | string | No | 网络风险 |
autonomy_abuse | string | No | 能力滥用 |
rce | string | No | 远程代码执行 |
supply_chain | string | No | 供应链风险 |
prompt_injection | string | No | 提示词注入 |
persistence | string | No | 持久化 |
obfuscation | string | No | 代码混淆 |
social_engineering | string | No | 社会工程学 |
cross_platform | string | No | 跨平台攻击 |
agent_hijack | string | No | Agent 劫持 |
discovery_abuse | string | No | 发现/探测滥用 |
risk_indicators[].severity
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
high | string | No | 高 |
medium | string | No | 中 |
low | string | No | 低 |
external_urls_details[].trigger_type
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
auto | string | No | 自动 |
manual | string | No | 手动 |
conditional | string | No | 条件 |
external_urls_details[].platform
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
windows | string | No | Windows |
macos | string | No | macOS |
linux | string | No | Linux |
all | string | No | 全部平台 |
字段速查表
报告响应(data)字段路径、类型与说明:
| 字段路径 | 类型 | 说明 |
|---|---|---|
| data (top-level) | | |
summary | object | 文件摘要 |
skill_details | object | AI Agent 检测详情 |
multi_verdict | object | 各维度判定(llm、static、dynamic、subfiles、external_urls) |
external_urls_details | array | 各外链的详细分析 |
subfile_details | array | 子文件检测详情(名称、哈希、大小、威胁等级、文件类型) |
llm_details | object | LLM 语义分析结果 |
permalink | string | 在线报告链接 |
| summary | | |
summary.sha256 | string | 文件 SHA256 |
summary.sha1 | string | 文件 SHA1 |
summary.md5 | string | 文件 MD5 |
summary.file_type | string | 文件类型 |
summary.file_name | string | 文件名称 |
summary.threat_level | string | 总体威胁等级(静态+引擎+动态) |
summary.trust_score | integer | 信任分数(0–100) |
summary.first_seen | string | 提交时间 |
summary.last_seen | string | 最后检测时间 |
summary.tags | array | 标签列表 |
| skill_details | | |
skill_details.type | string | 检测到的 Skill 类型 |
skill_details.basic_info | object | 基础信息 |
| multi_verdict | | |
multi_verdict.llm | string | LLM 维度判定 |
multi_verdict.static | string | 静态分析判定 |
multi_verdict.dynamic | string | 动态沙箱判定 |
multi_verdict.subfiles | string | 子文件维度判定 |
multi_verdict.external_urls | string | 外链判定 |
| external_urls_details | | |
external_urls_details[].url | string | 外链 URL |
external_urls_details[].threat_level | string | 外链检测结论 |
external_urls_details[].last_detection_time | string | 检测时间 |
| subfile_details | | |
subfile_details[].name | string | 子文件名称 |
subfile_details[].sha256 | string | 子文件 SHA256 |
subfile_details[].sha1 | string | 子文件 SHA1 |
subfile_details[].md5 | string | 子文件 MD5 |
subfile_details[].size | integer | 子文件大小(字节) |
subfile_details[].threat_level | string | 子文件威胁等级 |
subfile_details[].file_type | string | 子文件类型 |
| llm_details | | |
llm_details.analyzed_at | string | 分析时间 |
llm_details.llm_model | string | LLM 模型 |
llm_details.summary | string | 综合描述 |
llm_details.risk_level | string | 风险等级 |
llm_details.intent_reconstruction | object | 意图分析 |
llm_details.intent_reconstruction.intent_confidence | integer | 意图一致性(0–100),数字越高越一致 |
llm_details.extracted_iocs | object | 从文件中提取的部分指标,不代表恶意,请谨慎使用。 |
llm_details.risk_indicators[] | array | 风险指标 |
llm_details.risk_indicators[].indicator | string | 风险描述 |
llm_details.risk_indicators[].category | string | 风险分类 |
llm_details.risk_indicators[].severity | string | 危害度:high / medium / low |
llm_details.risk_indicators[].evidence | string | 关键证据 |
llm_details.platform_analysis | object | 平台影响分析(windows/macos/linux) |
状态码
API 使用标准化响应码。请检查每次响应中的 response_code 与 verbose_msg。
| 状态码 | Verbose Msg | 说明 |
|---|---|---|
| 0 | OK | 成功 |
| 2 | No Data | 没有数据 |
| 3 | In Progress | 任务进行中 |
| -1 | Invalid Account Status | 账户状态无效 |
| -1 | Invalid Access IP | 无效的访问 IP:{实际访问IP} |
| -1 | Invalid API Key | 无效的 API key,请输入正确的 API Key。 |
| -1 | Invalid Key Status | API key 状态无效 |
| -1 | Invalid Parameter: {parameter} | 无效的 API 接口参数:{参数名} |
| -1 | No Access to API Method | 没有访问接口权限 |
| -1 | Expired API Key | API Key 过期 |
| -1 | Empty File | 上传空文件 |
| -1 | File Size Too Large | 上传文件过大 |
| -1 | File Name Too Long | 上传文件名过长 |
| -2 | Invalid API Method | 无效的 API 接口 |
| -3 | Required:{} | 接口请求参数必须项缺失:缺失的具体项 |
| -4 | Frequent Limitation | 触发访问频次限制 |
| -4 | BeyondLimitation | 超出访问限制 |
| -5 | System Error | 系统错误 |
完整示例
恶意 Skill
JSON
{
"response_code": 0,
"verbose_msg": "OK",
"data": {
"summary": {
"sha256": "a1b2c3d4e5f67890abcdef...",
"sha1": "b2c3d4e5f67890ab...",
"md5": "c3d4e5f67890abcd...",
"file_type": "application/zip",
"file_name": "linkedin-skill.zip",
"threat_level": "malicious",
"trust_score": 12,
"first_seen": "2026-03-11 14:20:00",
"last_seen": "2026-03-11 14:23:00",
"tags": ["zip", "openclaw_skill"],
},
"skill_details": {
"type": "OpenClaw Skill",
"basic_info": { "skill_name": "linkedin", ... }
},
"multi_verdict": {
"llm": "malicious",
"static": "malicious",
"dynamic": "unknown",
"subfiles": "unknown",
"external_urls": "malicious"
},
"external_urls_details": [ ... ],
"subfile_details": [
{ "name": "data_fetcher.py", "sha256": "af6a70...", "size": 9626, "threat_level": "unknown", "file_type": "PYTHON" }
],
"llm_details": {
"risk_level": "malicious",
"risk_indicators": [ ... ]
}
}
}安全 Skill
JSON
{
"response_code": 0,
"verbose_msg": "OK",
"data": {
"summary": {
"sha256": "f0e1d2c3b4a59678...",
"sha1": "e1d2c3b4a5967801...",
"md5": "d2c3b4a596780123...",
"file_type": "application/zip",
"file_name": "weather-skill.zip",
"threat_level": "clean",
"trust_score": 92,
"first_seen": "2026-03-10 09:15:00",
"last_seen": "2026-03-10 09:18:00",
"tags": ["zip", "openclaw_skill"],
},
"skill_details": {
"type": "OpenClaw Skill",
"basic_info": { ... }
},
"multi_verdict": {
"llm": "clean",
"static": "clean",
"dynamic": "clean",
"subfiles": "clean",
"external_urls": "clean"
},
"external_urls_details": [],
"subfile_details": [],
"llm_details": {
"risk_level": "clean",
"risk_indicators": []
}
}
}