文档
网站基于一个公开 API 构建,含十八个即时端点。下方逐一文档化:功能、限制与请求/响应示例。无需账号;即时结果不存储。 本页末尾的管理 API(在线监控、状态页、短链接)是有状态例外:它们以各自的管理密钥持久保存。
状态码
- 301 — 永久重定向
永久重定向。搜索引擎会将排名信号转移到目标地址。
- 302 — 临时重定向
临时重定向。原 URL 仍是规范地址。
- 307 — 临时重定向
保留请求方法和请求体的临时重定向。
- 308 — 永久重定向
保留请求方法和请求体的永久重定向。
- 200 — 成功
到达最终目的地。链条在此结束。
- 404 — 客户端错误
目标不存在 —— 一个失效的重定向目标。
- 500 — 服务器错误
目标已解析,但服务器未能正确响应。
分类结果,而非错误
在四个即时端点上,被阻止的目标、无法解析的域名和无效 URL 都不是错误:每个格式正确的请求都返回 HTTP 200 和分类结果的 status。只有格式错误的请求、过大的请求体和限流才产生错误响应。
通用限制
- 协议
- http, https
- 方法
- GET
- 频率限制
- 每 IP 每分钟 30 次请求、每天 500 次 —— 所有端点共享
- 请求体
- 最大 10 KiB,严格 JSON
服务目录与社区报告(Phase 14)
精选的公开热门在线服务目录,附匿名社区报告。读取公开且带缓存;报告 POST 是有状态的例外——它会持久化并带频率限制、去重与审核。社区信号与自动检测始终是独立指标;本 API 中的任何取值都不表示「确认宕机」。
GET /api/v1/catalog/services?sort=reports_24h&page=1&page_size=20
→ 200
{ "items": [ { "slug": "chatgpt", "name": "ChatGPT",
"category": { "slug": "ai-assistants", "name": "AI Assistants" },
"community": { "signal": "reports_increasing", "reports_15m": 3,
"reports_1h": 11, "reports_24h": 42,
"last_report_at": "2026-10-20T09:58:12Z" },
"automated_check": { "state": "operational",
"checked_at": "2026-10-20T09:55:00Z" } } ],
"page": 1, "page_size": 20, "total": 1 }
POST /api/v1/catalog/services/chatgpt/reports
{ "problem_type": "site_unreachable", "comment": "Login loop on mobile" }
→ 201
{ "service_slug": "chatgpt", "problem_type": "site_unreachable",
"comment": "Login loop on mobile", "created_at": "2026-10-20T10:01:33Z" }
Reads are public and cached (ETag + max-age=30); unknown/draft/hidden
slugs all answer 404 (no existence oracle); merged slugs 301 to the
target. Reports are anonymous: no account, no network fetch on
submission, rate limited per IP, comments plain text (≤500 chars).
Community signal and the automated check are always separate blocks —
no value on this API means "confirmed down".- 分页
- page ≥1,page_size 默认 20,最大 100;确定性排序(以 slug 决胜)
- 报告限制
- 每 IP 每服务 10 分钟去重 1 条,然后每 IP 每小时 10 条、每天 30 条;429 + Retry-After;fail-closed
- 审核与隐私
- auto-publish 或 hold-all 策略;终止开关;仅存储每日轮换的伪匿名哈希——绝不存储原始 IP 或 user-agent
Redirect Checker — POST /api/v1/check
跟随完整重定向链并存储结果。
POST /api/v1/check
Content-Type: application/json
{ "url": "https://bit.ly/example" }
{
"id": "9pr2kxq4",
"status": "completed",
"input_url": "https://bit.ly/example",
"final_url": "https://example.com/product",
"final_domain": "example.com",
"final_status": 200,
"redirect_count": 3,
"duration_ms": 482,
"redirects": [
{ "sequence": 0, "requested_url": "https://bit.ly/example",
"status_code": 301, "next_url": "https://tracker.example/click",
"duration_ms": 83 },
{ "sequence": 3, "requested_url": "https://example.com/product",
"status_code": 200, "duration_ms": 184 }
],
"errors": null
}
GET /api/v1/check/{id} —— 通过公开 ID 获取已保存的结果。- 最大重定向次数
- 20 跳
- 请求超时
- 15 秒
GET /api/v1/check/{id} —— 通过公开 ID 获取已保存的结果。
Uptime Checker — POST /api/v1/uptime-check
检查网站是否有响应。结果会分类:正常响应为 UP,返回 4xx/5xx 为 HTTP_ERROR,另有 TIMEOUT、DNS_ERROR、TLS_ERROR、CONNECTION_ERROR 和 BLOCKED_TARGET。
POST /api/v1/uptime-check
Content-Type: application/json
{ "url": "https://example.com" }
{
"url": "https://example.com",
"status": "UP",
"reachable": true,
"httpStatus": 200,
"httpStatusText": "OK",
"responseTimeMs": 184,
"finalUrl": "https://example.com/",
"redirectCount": 1,
"tls": { "enabled": true, "valid": true }
}- 最大重定向次数
- 10 跳
- 请求超时
- 10 秒
HTTP Status Checker — POST /api/v1/http-status-check
返回 URL 的最终状态码、最终响应头、重定向链摘要和 TLS 状态。
POST /api/v1/http-status-check
Content-Type: application/json
{ "url": "https://example.com" }
{
"url": "https://example.com",
"status": "UP",
"reachable": true,
"httpStatus": 200,
"httpStatusText": "OK",
"finalUrl": "https://example.com/",
"redirectCount": 1,
"headers": {
"Content-Type": ["text/html; charset=utf-8"],
"Server": ["nginx"]
},
"headers_analysis": {
"security_missing": ["Strict-Transport-Security", "Content-Security-Policy"],
"caching": { "Cache-Control": "max-age=604800" }
},
"tls": { "enabled": true, "valid": true }
}- 最大重定向次数
- 10 跳
- 请求超时
- 10 秒
Response Time Checker — POST /api/v1/response-time-check
对同一 URL 进行 1–5 次测量,并按最终 URL 的首字节时间中位数判定速度等级。返回每次测量的耗时、最小/中位/最大/平均值以及最后一跳的耗时分解。
POST /api/v1/response-time-check
Content-Type: application/json
{ "url": "https://example.com", "samples": 3 }
{
"url": "https://example.com",
"samples": 3,
"status": "UP",
"verdict": "FAST",
"completed": 3,
"timesMs": [184, 201, 176],
"stats": { "minMs": 176, "medianMs": 184, "maxMs": 201, "meanMs": 187 },
"breakdown": { "dnsMs": 12, "connectMs": 23, "tlsMs": 45, "ttfbMs": 184, "totalMs": 190 },
"httpStatus": 200,
"httpStatusText": "OK",
"finalUrl": "https://example.com/",
"redirectCount": 1,
"tls": { "enabled": true, "valid": true }
}- 采样次数
- 1–5(默认 3)
- 单次采样超时
- 10 秒
- 总时限
- 30 秒
SSL Checker — POST /api/v1/ssl-check
检查主机出示的 TLS 证书:有效期、签发者、SAN、协商的协议与密码套件以及证书链。仅进行 TLS 探测——绝不抓取页面;证书异常时会给出具体原因。
POST /api/v1/ssl-check
Content-Type: application/json
{ "url": "https://example.com" }
{
"url": "https://example.com",
"host": "example.com",
"status": "UP",
"reachable": true,
"handshakeMs": 45,
"tls": {
"version": "TLS 1.3",
"cipher": "TLS_AES_256_GCM_SHA384",
"verified": true,
"status": "valid",
"daysRemaining": 89,
"notBefore": "2026-08-01T00:00:00Z",
"notAfter": "2026-10-30T00:00:00Z",
"subject": "CN=example.com",
"issuer": "CN=R3,O=Let's Encrypt,C=US",
"sans": ["example.com", "www.example.com"],
"chain": ["CN=example.com", "CN=R3,O=Let's Encrypt,C=US"]
}
}- 端口
- 取自 URL(默认 443)
- 探测超时
- 10 秒
DNS Checker — POST /api/v1/dns-check
查询主机的 A、AAAA、CNAME、MX、TXT 和 NS 记录。仅查询和报告:不建立任何连接,每个解析出的地址都会标注为公开或非公开。
POST /api/v1/dns-check
Content-Type: application/json
{ "url": "example.com" }
{
"url": "example.com",
"host": "example.com",
"status": "UP",
"durationMs": 38,
"records": {
"a": ["93.184.216.34"],
"aaaa": ["2606:2800:220:1:248:1893:25c8:1946"],
"cname": [],
"mx": [{ "host": "mail.example.com", "pref": 10 }],
"txt": ["v=spf1 include:_spf.example.com ~all"],
"ns": ["ns1.example.com", "ns2.example.com"]
},
"addressLabels": [
{ "address": "93.184.216.34", "classification": "public", "reason": "public" }
]
}- 记录类型
- A、AAAA、CNAME、MX、TXT、NS
- 查询超时
- 总计 10 秒,每类 3 秒
域名到期检查 — POST /api/v1/domain-expiry-check
通过固定的 rdap.org RDAP 流程回答域名何时到期:结论、剩余天数、注册/到期日期和注册局状态。本仓库第一个访问固定第三方服务的工具:每一跳仅限 HTTPS、无代理、重定向与大小受限;被查询的域名绝不被联系。404 转为 not_found 结论(未注册 / 注册局无 RDAP / 未发布记录),429 和 5xx 转为诚实的 UNKNOWN_ERROR。
POST /api/v1/domain-expiry-check
Content-Type: application/json
{ "url": "example.com" }
{
"url": "example.com",
"host": "example.com",
"status": "UP",
"verdict": "ok",
"daysRemaining": 214,
"registration": "2019-01-15T05:00:00Z",
"expiration": "2027-04-15T04:00:00Z",
"lastChanged": "2026-08-01T11:20:00Z",
"registryStatuses": ["ok"],
"source": "rdap",
"durationMs": 420
}- 结论
- ok、expiring(≤30 天)、expired、not_found、unknown
- 查询超时
- 总共 10 秒(DOMAIN_EXPIRY_TIMEOUT)
- 出站策略
- 仅 rdap.org;每一跳 HTTPS;禁用代理;重定向上限 10;大小上限 1 MiB;绝不联系被查询的域名
WHOIS 查询 — POST /api/v1/whois-check
回答注册局对域名知道什么:注册商、域名服务器、日期和状态标志。优先通过 rdap.org 的 RDAP,区域未发布时回退经典 WHOIS(原始 TCP 43)——仓库第一个原始 TCP 出站工具:每个转介必须是 host[:43] 目标,经共享 SSRF 管道解析并拨号到固定的公网地址;转介上限 2,响应上限 64 KiB;绝不联系被查询的域名。RDAP 的 404 触发回退;明确的“域名不存在”回答以 notFound 呈现。
POST /api/v1/whois-check
Content-Type: application/json
{ "url": "mail.ru" }
{
"url": "mail.ru",
"host": "mail.ru",
"status": "UP",
"source": "whois",
"registrar": "VK-TECH",
"nameservers": ["ns1.mail.ru", "ns2.mail.ru"],
"registration": "1997-10-01T00:00:00Z",
"expiration": "2026-10-01T00:00:00Z",
"statuses": ["REGISTERED, DELEGATED, VERIFIED"],
"durationMs": 640
}- 来源
- RDAP 经 rdap.org;经典 WHOIS(TCP 43)经 whois.iana.org 转介链
- 查询超时
- 总共 15 秒(WHOIS_TIMEOUT)
- 出站策略
- 转介仅限 host[:43];拨号前经 SSRF 校验并固定地址;转介上限 2;响应上限 64 KiB;绝不联系被查询的域名
域名可用性 — POST /api/v1/domain-availability
按 TLD 回答“这个名字能否注册”,采用诚实状态机:仅当 RDAP 查询返回 404 且内置 TLD 元数据确认注册局运营 RDAP 时才为 AVAILABLE;仅 WHOIS 未找到保持 UNKNOWN(可能可用);RESTRICTED 由元数据决定。完整支持 IDN(输入 Unicode,规范 punycode,输出 displayDomain),可选多 TLD 批量查询(每次 1–10 个)。MVP 中 premium 恒为 unknown——定价属于未来的独立子系统。
POST /api/v1/domain-availability
Content-Type: application/json
{ "domain": "пример.рф", "tlds": ["com", "io"] }
{
"url": "пример.рф",
"displayDomain": "пример.рф",
"host": "xn--e1afmkfd.xn--p1ai",
"status": "UP",
"results": [
{
"tld": "com",
"availability": "AVAILABLE",
"reason": "rdap_not_found",
"confidence": "high",
"source": "rdap",
"premium": "unknown",
"checkedAt": "2026-09-03T12:00:02Z"
},
{
"tld": "io",
"availability": "UNKNOWN",
"reason": "tld_rdap_unknown",
"confidence": "low",
"source": "tld-metadata",
"premium": "unknown",
"checkedAt": "2026-09-03T12:00:02Z"
}
],
"tldMetaVersion": "2026-09-02",
"durationMs": 1240
}- 每次请求的 TLD
- 1–10 个唯一值(Unicode 或 punycode);同一 15 秒预算内最多 4 个并发查询(DOMAIN_AVAILABILITY_TIMEOUT)
- 判定
- AVAILABLE | REGISTERED | RESTRICTED | INVALID | UNKNOWN | ERROR — UNKNOWN 绝不冒充 AVAILABLE;PREMIUM 在 MVP 中不可达
- 缓存
- di:avail 60秒、di:reg 6小时,fail-open;否定结果绝不缓存
域名年龄 — POST /api/v1/domain-age
报告域名的年龄:来自注册局的准确创建日期和确定性的年/月/日细分。WHOIS 数据之上的轻量投影——缓存窗口内一次提供方查询同时服务可用性、年龄和注册商查询。
POST /api/v1/domain-age
Content-Type: application/json
{ "domain": "example.com" }
{
"url": "example.com",
"host": "example.com",
"status": "UP",
"age": {
"known": true,
"createdAt": "2019-01-15T05:00:00Z",
"ageInDays": 2809,
"years": 7,
"months": 7,
"days": 20
},
"source": "rdap",
"durationMs": 390
}- 年龄计算
- 仅使用 UTC 日历日期;通过钳位月份锚点计算完整年月;总天数向下取整
- 未知年龄
- age.known=false + 有界原因(no_data、inconsistent_data)——绝不猜测
- 缓存
- di:reg 6小时,与可用性/注册商共享(fail-open)
注册商查询 — POST /api/v1/domain-registrar
报告域名在哪家注册商注册,按人工维护的别名表归一化(GoDaddy、Namecheap、Cloudflare 等)——未知名称按公布内容原样显示。包含注册局组织和 RDAP/WHOIS 来源;与年龄/可用性共享注册缓存。
POST /api/v1/domain-registrar
Content-Type: application/json
{ "domain": "example.com" }
{
"url": "example.com",
"host": "example.com",
"status": "UP",
"registrar": "GoDaddy.com, LLC",
"registrarCanonical": "GoDaddy",
"registrarIanaId": 625,
"registry": "Verisign, Inc.",
"source": "rdap",
"checkedAt": "2026-09-04T12:00:00Z",
"durationMs": 410
}- 注册商
- 显示名称 + 命中时的规范别名徽标;IANA ID 显示“—”(注册局数据尚未包含)
- 未公布
- 隐私代理或脱敏的注册以 UP + 原因 no_data 回答——绝非空壳
域名生成器 — POST /api/v1/domain-generate
从 1–3 个关键词生成候选域名:直接形式、前缀、后缀、组合词和短形式——去重、有序、有上限。纯粹即时:生成期间零注册局调用;逐个候选的可用性检查是独立明确的操作。
POST /api/v1/domain-generate
Content-Type: application/json
{ "keywords": ["coffee", "map"], "tlds": ["com", "io"], "limit": 24 }
{
"status": "UP",
"candidates": [
{ "domain": "coffee.com", "strategy": "direct" },
{ "domain": "coffee.io", "strategy": "direct" },
{ "domain": "getcoffee.com", "strategy": "prefix" },
{ "domain": "coffeemap.com", "strategy": "compound" }
],
"total": 24
}- 候选
- 硬上限 50,默认展示 24;≤10 个 TLD,经 TLD 元数据快照过滤
- 零注册局流量
- 生成过程零注册局调用——逐个候选检查走带自身限额的可用性端点
域名概览 — POST /api/v1/domain-overview
组合式档案:域名自身 TLD 的可用性、带确定性年龄细分的创建日期、注册商(已归一化,含 IANA 号码)、到期投影以及注册局的配置发现。各节相互独立——一次查询失败绝不会清空其他节。
POST /api/v1/domain-overview
Content-Type: application/json
{ "domain": "example.com" }
{
"url": "example.com",
"host": "example.com",
"status": "UP",
"availability": {
"tld": "com", "availability": "REGISTERED", "reason": "registered",
"confidence": "high", "source": "rdap", "premium": "unknown",
"checkedAt": "2026-09-05T12:00:00Z"
},
"registration": {
"known": true, "createdAt": "2019-01-15T05:00:00Z",
"ageYears": 7, "ageMonths": 7, "ageDays": 21,
"registrar": "GoDaddy.com, LLC", "registrarCanonical": "GoDaddy",
"registrarIanaId": 625, "registry": "Verisign, Inc.", "source": "rdap",
"checkedAt": "2026-09-05T12:00:01Z"
},
"expiry": {
"host": "example.com", "source": "rdap", "verdict": "ok",
"daysRemaining": 222, "expiration": "2027-04-15T04:00:00Z",
"checkedAt": "2026-09-05T12:00:02Z"
},
"holds": [],
"dnssec": [{ "id": "dnssec-absent", "state": "info", "severity": "info", "detail": "unsigned" }],
"tldMetaVersion": "2026-09-02",
"durationMs": 1620
}- 分节
- 可用性(元数据门控)+ 注册(di:reg,6小时共享)+ 到期(rdap.org)+ holds/dnssec 发现
- 发现即事实
- holds/DNSSEC 是注册局的配置信号——绝非安全判定;DNS/SSL 保留在其独立工具中
安全检查 — POST /api/v1/security-check
对一次获取的响应进行被动、咨询式的配置审查:安全响应头(HSTS 深度、CSP 亮点、COOP/COEP/CORP、X-XSS-Protection)、Cookie 标志、TLS 事实、链路降级与信息披露。不探测、不作漏洞断言、不打分;Cookie 值绝不离开后端。HTTP 应用状态不影响审查(可达的 404/500 也会被审查)。
POST /api/v1/security-check
Content-Type: application/json
{ "url": "https://example.com" }
{
"url": "https://example.com",
"finalUrl": "https://example.com/",
"status": "UP",
"durationMs": 610,
"summary": { "total": 14, "passed": 9, "warn": 3, "failed": 2 },
"findings": [
{ "id": "hsts-present", "state": "fail", "severity": "high" },
{ "id": "tls-cert", "state": "pass", "severity": "info", "detail": "valid" }
],
"cookies": [
{ "name": "session", "secure": false, "httpOnly": true, "sameSite": "Lax" }
],
"tls": { "enabled": true, "version": "TLS 1.3", "certStatus": "valid", "daysRemaining": 89 }
}- 范围
- 约 23 项检查 ID,覆盖响应头/Cookie/TLS/链路/信息披露;仅被动获取
- Cookie
- 仅名称与标志(Secure/HttpOnly/SameSite)——值绝不离开后端
- 审查超时
- 总共 10 秒(SECURITY_CHECK_TIMEOUT)
URL Analyzer — POST /api/v1/url-analyze
对单个 URL 进行纯语法解析:经脱敏的规范身份(协议、主机、IDN 形式、朴素可注册域名、端口、路径、查询、片段),保留顺序与重复项的参数列表及带版本的跟踪分类,跟踪计数,信息性安全信号与规范化说明。无请求、无 DNS、无存储——分析在本地毫秒级完成。
POST /api/v1/url-analyze
Content-Type: application/json
{ "url": "https://xn--e1afmkfd.xn--p1ai/search?q=thing&utm_source=news&id=7&id=8" }
{
"status": "UP",
"identity": {
"hasCredentials": false,
"scheme": "https",
"host": "xn--e1afmkfd.xn--p1ai",
"displayHost": "пример.рф",
"registrableDomain": "пример.рф",
"isIdn": true,
"path": "/search",
"query": "q=thing&utm_source=news&id=7&id=8",
"normalized": "https://xn--e1afmkfd.xn--p1ai/search?q=thing&utm_source=news&id=7&id=8"
},
"parameters": [
{ "name": "q", "value": "thing", "classification": { "category": "unknown", "confidence": "none" } },
{ "name": "utm_source", "value": "news", "classification": { "category": "utm", "label": "utm_source", "confidence": "exact" } },
{ "name": "id", "value": "7", "occurrence": 1 },
{ "name": "id", "value": "8", "occurrence": 2 }
],
"tracking": { "utm": 1, "analytics": 0, "adsClickId": 0, "sessionSensitive": 0, "unknown": 3 },
"signals": ["idn_host"],
"normalization": { "schemeAssumed": false, "punycodeApplied": true, "defaultPortOmitted": false, "hostLowercased": false },
"registryVersion": "2026-09-1"
}- 范围
- 组件 + 有序参数 + 注册表分类 + 信息性信号;零网络访问
- 脱敏
- 永不回显密码;敏感参数值在所有位置掩码为 ***,名称保持可见
URL Expander — POST /api/v1/url-expand
基于共享引擎的即时、免存储重定向链展开:每一跳都经过相同的中心化 SSRF 校验,循环与 10 跳上限以 reason 区分,最终 URL 获得完整跟踪分析。返回的 URL 均经脱敏——密码绝不离开后端。不缓存:重定向链对时间敏感,新鲜度才是正确答案。
POST /api/v1/url-expand
Content-Type: application/json
{ "url": "https://bit.ly/3xyz" }
{
"url": "https://bit.ly/3xyz",
"status": "UP",
"finalUrl": "https://example.com/landing?utm_source=n",
"hopCount": 2,
"chain": [
{ "url": "https://bit.ly/3xyz", "status": 301, "location": "https://bit.ly/abc" },
{ "url": "https://bit.ly/abc", "status": 302, "location": "https://example.com/landing?utm_source=n" }
],
"analysis": { "status": "UP", "tracking": { "utm": 1, "analytics": 0, "adsClickId": 0, "sessionSensitive": 0, "unknown": 0 } },
"source": "engine",
"durationMs": 820
}- 范围
- 脱敏的跳转链 + 分类状态(循环 vs 上限)+ 最终 URL 分析;不含逐跳 DNS/TLS/计时(Redirect Checker 的领域)
- 展开预算
- 总计 10 秒(URL_EXPAND_TIMEOUT);跳数上限 10
UTM Builder — POST /api/v1/utm-build
确定性的无状态营销 URL 构造:无关参数按原顺序保留,规范 UTM 按字段覆盖或保留,重复项折叠至最后一次出现,片段保留,携带凭据的目的地会被 in-band 拒绝。相同输入始终产生逐字节相同的输出。
POST /api/v1/utm-build
Content-Type: application/json
{ "url": "https://example.com/landing?foo=1&utm_source=old#pricing", "utmSource": "newsletter", "utmMedium": "email", "utmCampaign": "spring_sale", "utmContent": "header_cta" }
{
"status": "UP",
"generatedUrl": "https://example.com/landing?foo=1&utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale&utm_content=header_cta#pricing",
"warnings": ["existing_utm_overwritten:utm_source", "empty_field_skipped:utm_term"],
"parameters": { "utm_source": "newsletter", "utm_medium": "email", "utm_campaign": "spring_sale", "utm_content": "header_cta" }
}- 范围
- 按固定顺序追加 UTM + 保留/覆盖/折叠策略 + 警告;纯本地,无网络
- 确定性
- 相同输入产生逐字节相同的输出;字段 ≤256 字符;拒绝未知请求字段
Website Health — POST /api/v1/website-health
复合诊断:一个请求先规范化目标,再在现有引擎之上运行有界并发的 lane——一次 HTTP 检查同时供给五个板块(可用性、状态码、响应时间、响应头、安全配置),DNS、TLS 证书探测与域名概览则作为独立 lane 运行。最终给出聚合的整体健康状态、逐项检查明细以及指向独立工具的深链。结论仅描述已执行的检查——绝不构成安全保证。
POST /api/v1/website-health
Content-Type: application/json
{ "url": "https://example.com" }
{
"target": {
"canonical": "https://example.com/",
"displayHost": "example.com",
"scheme": "https",
"hasCredentials": false,
"isDomain": true,
"isHttp": true,
"valid": true
},
"overall": "WARNING",
"summaryKey": "health.summary.warning",
"checks": [
{ "type": "http_availability", "state": "pass",
"summaryKey": "health.check.httpAvailability.pass",
"value": "200", "durationMs": 612, "applicable": true,
"detailUrl": "/uptime-checker" },
{ "type": "http_status", "state": "pass",
"summaryKey": "health.check.httpStatus.pass",
"value": "200 OK", "applicable": true,
"detailUrl": "/http-status-checker" },
{ "type": "response_time", "state": "pass",
"summaryKey": "health.check.responseTime.pass",
"value": "612 ms", "applicable": true,
"detailUrl": "/response-time-checker" },
{ "type": "headers", "state": "warn",
"summaryKey": "health.check.headers.warn",
"value": "2 missing", "reason": "findings", "applicable": true,
"detailUrl": "/security-checker" },
{ "type": "security", "state": "warn",
"summaryKey": "health.check.security.warn",
"value": "14 of 21 passed", "reason": "findings", "applicable": true,
"detailUrl": "/security-checker" },
{ "type": "tls", "state": "pass",
"summaryKey": "health.check.tls.pass",
"value": "TLS 1.3 · valid, 89 days", "durationMs": 140,
"applicable": true, "detailUrl": "/ssl-checker" },
{ "type": "dns", "state": "pass",
"summaryKey": "health.check.dns.pass",
"value": "A, AAAA, MX, NS", "durationMs": 95,
"applicable": true, "detailUrl": "/dns-checker" },
{ "type": "domain", "state": "pass",
"summaryKey": "health.check.domain.pass",
"value": "expires in 214 days", "durationMs": 730,
"applicable": true, "detailUrl": "/domain-overview" }
],
"meta": { "checksTotal": 8, "checksPassed": 6, "checksWarn": 2,
"checksFailed": 0, "checksUnknown": 0,
"tldMetaVersion": "2026-09-03", "durationMs": 1480 }
}- 范围
- 一次 HTTP 执行供给五个板块;DNS/TLS/域名 lane;聚合状态 HEALTHY/WARNING/ERROR/PARTIAL/UNKNOWN
- 边界
- 25 秒总预算 + 各 lane 预算,同时最多 3 个 lane;无效目标 in-band 返回;不缓存——新鲜度优先
Uptime Monitoring — /api/v1/monitors 管理 API
与即时工具不同唯一的有状态例外:为一个 URL 创建监控项,worker 按固定计划检查它——附带执行历史、可用性统计、事故记录与 webhook 通知。所有权是创建时仅显示一次的管理密钥;每次读取和写入都用它验证,错误密钥与不存在的监控项完全无法区分(统一返回 404)。
POST /api/v1/monitors
Content-Type: application/json
{ "url": "https://example.com", "name": "Prod site", "interval": 300 }
201 Created
{
"monitor": { "id": "b1…", "name": "Prod site",
"normalizedTarget": "https://example.com/",
"state": "unknown", "interval": 300 },
"manageUrl": "/monitors/b1…?key=…",
"key": "…shown exactly once…"
}
GET /api/v1/monitors/{id}?key=… detail + stats window + incidents
GET /api/v1/monitors/{id}/history cursor-paginated executions
GET /api/v1/monitors/{id}/history/daily per-day buckets (30-day cap)
GET /api/v1/monitors/{id}/incidents incident episodes
POST /api/v1/monitors/{id}/check enqueue a priority manual check
PATCH /api/v1/monitors/{id} name / interval / webhook / pause
DELETE /api/v1/monitors/{id} cascade delete
Credentials in the target are rejected (credentials_not_allowed); the
target is SSRF-pre-validated at creation and re-validated on every run.- 范围
- 创建 / 列表 / 详情 / 暂停 / 删除 / 手动检查 / 历史 / 事故;固定间隔 60–3600 秒;创建时带内返回 INVALID_URL 与 BLOCKED_TARGET
- 密钥管理
- 256 位密钥仅显示一次(存储 sha256);拒绝目标中的凭据;创建时预校验并在每次运行前重新校验 SSRF
公开状态页 — /api/v1/status-pages 管理 API
将您的监控器组合成可分享的状态页:挑选组件、排序、覆盖显示名称,并以固定 slug 发布。状态页与监控器共用同一管理密钥;草稿私密,发布幂等且可撤销,每次变更都会删除公共缓存条目——访问控制在请求内即时生效。
POST /api/v1/status-pages
Content-Type: application/json
X-Monitor-Key: <your key>
{ "name": "Prod API" }
201 Created
{
"page": { "publicId": "p1…", "name": "Prod API",
"slug": "prod-api", "published": false },
"manageUrl": "/status-pages/p1…?key=…"
}
GET /api/v1/status-pages/{id}?key=… editor payload (members + monitors)
PATCH /api/v1/status-pages/{id} name/description/slug + membership
POST /api/v1/status-pages/{id}/publish → live at /status/{slug}
POST /api/v1/status-pages/{id}/unpublish → removed within the request
DELETE /api/v1/status-pages/{id} cascade delete
GET /api/v1/public/status-pages/{slug} the public DTO (no key; cached 60s)
Membership is same-key only (≤25 monitors, replace-list semantics);
publish requires ≥1 visible member; the public DTO is an explicit
projection — target URLs, keys and internal ids never cross.- 范围
- 创建 / 列表 / 编辑 / 成员替换列表(≤25,仅限同密钥)/ 发布 / 取消发布 / 删除;slug 为 3-63 字符并带保留字列表;每密钥最多 5 页
- 公开面
- GET /api/v1/public/status-pages/{slug} + /status/{slug};仅显式公开 DTO——目标 URL、密钥、通知主机与内部 id 绝不外泄;Redis 缓存 60 秒,fail-open
URL 缩短器 — /api/v1/short-links 管理 API
把长 URL 变成可管理的 /go/{code} 短链接:目标地址经过验证,代码由密码学随机生成,点击统计包含今日/7 天/30 天窗口。短链接与您的监控器和状态页共用同一个管理密钥——创建会附加到现有密钥,绝不会铸造新密钥。创建和编辑时会对目标进行验证(语法、拒绝凭据、SSRF 分类);公开重定向本身从不抓取任何内容,并以 302 无缓存响应。
POST /api/v1/short-links
Content-Type: application/json
X-Monitor-Key: <your key>
{ "destinationUrl": "https://example.com/launch?utm_source=newsletter" }
201 Created
{
"link": { "id": "sl1…", "code": "a3f9k2mz",
"shortUrl": "/go/a3f9k2mz",
"destination": "https://example.com/launch?utm_source=newsletter" }
}
GET /api/v1/short-links?key=… your links (newest first)
GET /api/v1/short-links/{id}?key=… full link + stats
PATCH /api/v1/short-links/{id}?key=… destination/title/expiry (re-validated)
POST /api/v1/short-links/{id}/disable public 404, stats kept (enable restores)
DELETE /api/v1/short-links/{id}?key=… soft delete (idempotent)
GET /api/v1/short-links/{id}/stats?key=… total + today/7d/30d clicks
GET /go/a3f9k2mz → 302 Found + Location (Cache-Control: no-store);
unknown/disabled/expired/deleted all answer 404.
Destinations are validated at create/update (http/https, credentials
rejected, SSRF classification); the redirect itself never fetches.- 范围
- 创建 / 列表 / 编辑 / 停用 / 启用 / 软删除 / 统计;每个密钥最多 100 条活跃链接,每个密钥每小时 30 次创建;每次修改都会重新验证目标地址
- 公开重定向
- GET /go/{code} → 302 + no-store;未知/停用/过期/已删除一律返回相同的中性 404;重定向是纯查找——不接受目标参数,也从不解析或抓取目标;不存储 IP 和 user-agent
举报短链接 — 匿名滥用举报 API
如果某个 /go/{code} 链接疑似钓鱼、恶意软件、垃圾信息或诈骗,请举报——无需账号,也不会收到回复。举报进入运营者的审核队列;只有运营者能下线链接。对所有格式正确的举报,端点的响应完全一致:举报者无法得知代码是否存在。
POST /api/v1/short-link-reports
Content-Type: application/json
{ "code": "a3f9k2mz", "reason": "phishing",
"detail": "Imitates a login page" }
202 Accepted
{ "status": "received" }
Reasons: phishing | malware | spam | scam | other (detail ≤500 chars,
optional plain text). The SAME 202 comes back for unknown, disabled
and deleted codes — no existence oracle. Limits per IP: one report
per code per 10 min, 10/hour, 30/day (429 + Retry-After; Redis
failure = 503, fail-closed). Reports go to the operator queue; only
the operator can take a link down (the owner key cannot override).- 限制与隐私
- 每个 IP 每个代码每 10 分钟 1 次举报,之后 10 次/小时、30 次/天(429 + Retry-After;Redis 故障时 503,fail-closed);理由 phishing | malware | spam | scam | other;无账号、无邮箱、不存原始 IP——仅存每日轮换的指纹
- 统一响应
- 所有格式正确的举报都得到相同的 202 received——对活跃、停用、已删除和不存在的代码一视同仁(无存在性预言);格式错误的代码或未知理由在任何查询之前返回 400
账户与 API 密钥 — /api/v1/auth/register 和 /api/v1/api-keys
浏览器账户(邮箱 + 密码,开放注册;此版本不验证邮箱),会话保存在服务端并通过强化的 Cookie 传递。API 密钥通过资源族的显式白名单为服务器间调用提供身份验证。登录失败是通用的——未知邮箱与错误密码完全无法区分,连响应时序也一样。
POST /api/v1/auth/register
Content-Type: application/json
{ "email": "you@example.com", "password": "…", "displayName": "…" }
201 Created + Set-Cookie: wg_session (HttpOnly; Secure; SameSite=Lax)
{ "account": { "id": "acc…", "email": "you@example.com", … } }
POST /api/v1/auth/login 200 + Set-Cookie (401 generic on failure)
POST /api/v1/auth/logout deletes the server-side session
GET /api/v1/account the session's own profile
PATCH /api/v1/account update display name (displayName)
GET /api/v1/account/summary account-owned resource counts
POST /api/v1/account/claim management key → re-own key-held resources
POST /api/v1/api-keys (SESSION) create; secret shown ONCE
{ "name": "CI", "scopes": ["monitors:read"] }
GET /api/v1/api-keys (SESSION) list — no secrets
POST /api/v1/api-keys/{id}/revoke (SESSION) immediate 401 on next use
Bearer access (Authorization: Bearer wg_live_…) is an EXPLICIT
allowlist only: account GET/PATCH, monitors CRUD + reads, status-pages
GET, short-links CRUD + stats; everything else refuses API keys.
Missing/unknown/revoked → generic 401; wrong scope → 403; per-key and
per-account rate limits → 429 + Retry-After.- Bearer 白名单
- account GET/PATCH(account:read)、监控(读/写)、状态页 GET(读)、短链接(读/写);其余端点一律拒绝 API 密钥。未通过 claim-by-key 关联的密钥资源不可见。
- 密钥处理
- 完整的 wg_live_ 密钥只在创建时显示一次;服务端仅存储单向哈希。缺失/未知/已吊销的密钥统一返回 401;范围不足 → 403;限流 → 429 + Retry-After。
账号邮箱身份(确认与恢复)
Phase J 邮箱基础:确认地址、找回密码,并为敏感操作证明近期知晓密码。
POST /api/v1/auth/verification/request (SESSION) 202 {accepted:true}
POST /api/v1/auth/verification/confirm { "token": "…" } → 200 {verified:true}
POST /api/v1/auth/password-reset/request { "email": "you@example.com" } → 202 (always the same answer)
POST /api/v1/auth/password-reset/confirm { "token": "…", "password": "…" } → 200 {reset:true}
POST /api/v1/auth/reauthenticate (SESSION) { "password": "…" } → 200 {confirmed:true}
Reset revokes ALL sessions in the same transaction; API keys stay
active. Tokens ride mail links as URL fragments — never query strings —
and every mismatch (wrong account, replay, expiry, unknown) answers the
same generic 404.- 令牌
- 一次性,24 小时(确认)/ 30 分钟(重置),仅存于片段,任何不匹配均返回相同的 404
- 重置
- 原子式注销所有会话;API 密钥保持有效
- 重新认证
- 5 分钟,服务端绑定会话
- 工作空间
- GET /api/v1/workspaces — 个人 + 组织成员身份,no-store,仅限会话
- 组织
- 创建/列表/读取/重命名/删除 + 所有权转移;需验证会话、乐观版本控制,破坏性操作需重新认证
- 邀请
- 电子邮件邀请,含 7 天一次性链接、四个固定角色、预留席位的上限及必需的频率窗口
- 组织资源
- /organizations/{orgId} 下的共享监控/页面/链接;会话 RBAC、带版本的变更、SQL 层排除旧密钥
- 资源转移
- 将个人监控/页面/链接原子式移入组织(闭包 ≤100、版本校验、幂等)
- 组织密钥
- 组织服务密钥(wg_live_…),仅显示一次、带范围、创建者离开后仍然有效、吊销即时生效
- 组织审计
- 已提交组织变更的只追加历史(365 天),Owner/Admin 可读,参与者最少披露