官方接口文档
OpenReach v0.1.4 对外提供四个核心 HTTP POST 能力;官网、文档和 Skill ZIP 作为只读静态资源提供。以下参数以当前 Java DTO、Service 与安全过滤器为准。
http://localhost:8080。所有接口路径统一位于 /api/web。POST/api/web/search
搜索网页并返回候选信息源。provider=auto 时先按 region 选择 CN / GLOBAL Route,再执行对应免费 Provider Chain。
请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
query | string | 是 | 非空搜索关键词,最长 500 字符 |
limit | integer | 否 | 1–20,默认 10,并受服务端 max-results 限制 |
region | string | 否 | 最长 32 字符;默认 auto(默认 CN);CN aliases 走 CN,其他显式地区走 GLOBAL;之后作为 Provider locale Hint |
provider | string | 否 | 最长 32 字符;默认 auto;可选 bing / baidu / sogou / so360 / duckduckgo / brave |
timeRange | string | 否 | 最长 32 字符;any / day / week / month / year,默认 any;另兼容 all/none/off/0、d/w/m/y、1d/1w/1m/1y、past_*、pd/pw/pm/py、qdr:*。指定时间范围后,auto 只执行真正支持该能力的 Provider;CN 默认 baidu → bing → duckduckgo → brave,GLOBAL 默认 bing → brave → duckduckgo → baidu。百度免费 Web 支持 day/week/month/year;Bing 免费 Web 已验证 day/week/month,year 会自动跳过 Bing;运行期按具体范围补入真正可用的 Provider。 |
示例
curl -X POST 'http://localhost:8080/api/web/search' \
-H 'Content-Type: application/json' \
-d '{"query":"OpenReach AI Agent","limit":5,"region":"US","provider":"auto","timeRange":"month"}'响应字段:provider、query、region、timeRange、count、latencyMs、items[]。provider=auto 时响应仍为 auto,每个 item 的 source 表示具体结果渠道。
POST/api/web/image-search
根据文本搜索图片与来源页面。v0.1.4 会继续对原始 imageUrl 做公网 URL/重定向校验和真实图片字节探测,只把当前可直接下载的被动图片格式返回给调用方。
请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
query | string | 是 | 非空图片搜索关键词,最长 500 字符 |
limit | integer | 否 | 1–30,默认 10,并受服务端 max-results 限制 |
region | string | 否 | 最长 32 字符;默认 auto(默认 CN);与 Web Search 共用 CN / GLOBAL Route |
provider | string | 否 | 最长 32 字符;默认 auto;可选 bing / baidu / sogou / openverse / wikimedia |
示例
curl -X POST 'http://localhost:8080/api/web/image-search' \
-H 'Content-Type: application/json' \
-d '{"query":"杭州西湖夜景","limit":8,"region":"auto","provider":"auto"}'下载保证:返回的 imageUrl 已通过服务端即时下载探测;失效链接、403/404、HTML 防盗链页、伪图片以及 SVG 主动内容会被过滤。网络状态仍可能在响应之后变化,因此它表示“响应生成时可直接下载”。
验证边界:默认候选放大为 limit × 3,最多验证 60 个;单图验证超时 4 秒、最多 3 次跳转、读取最多 64 KiB,并发 6。支持 JPEG / PNG / GIF / WebP / BMP / TIFF / ICO / AVIF / HEIC 等被动图片签名。
响应 items 可包含:rank、title、imageUrl、thumbnailUrl、sourcePageUrl、provider、source、domain、width、height、imageFormat、license、licenseUrl。顶层 provider=auto 时仍返回 auto,具体图片渠道看 item 的 provider/source。
POST/api/web/read
获取公网文本网页并提取标题、正文、元数据和页面链接。读取链路包含 SSRF 防护、跳转限制、浏览器导航兼容请求头与瞬时 5xx 有界重试;不用于读取调用方内网附件、图片二进制或非 80/443 服务端口。
请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
url | string | 是 | 公网 HTTP(S) 文本网页 URL,最长 2048 字符;仅允许 80/443,禁止私网/本机/内部附件地址与图片等二进制资源 |
maxChars | integer | 否 | 1000–200000;服务端默认最大正文字符数为 50000 |
示例
curl -X POST 'http://localhost:8080/api/web/read' \
-H 'Content-Type: application/json' \
-d '{"url":"https://spring.io/projects/spring-boot/","maxChars":20000}'响应字段:url、finalUrl、title、content、contentType、reader、truncated、latencyMs、metadata、links。若公网目标明确返回 403/412/521 等状态,仍保持 HTTP 502 + UPSTREAM_ERROR 兼容,同时附加 failureType、upstreamStatus、retryable,便于 Agent 判断换源还是结束重试。
POST/api/web/curl
Safe Curl 用于读取公网 HTTP(S) 的 JSON、文本和源码内容,典型场景是 GitHub REST API、raw.githubusercontent.com、公开 OpenAPI/JSON/YAML 数据源。它不是 shell curl 透传,也不允许写请求。
请求参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
url | string | 是 | 公网 HTTP(S) URL,最长 2048 字符;仅允许 80/443 |
method | string | 否 | 仅允许 GET / HEAD,默认 GET |
headers | object | 否 | 最多 16 个普通请求头;Authorization、Cookie、Host、X-Forwarded-*、常见 Token/API-Key 头等敏感头禁止透传 |
maxChars | integer | 否 | 1000–200000;默认 100000,并同时受服务端最大响应字节数限制 |
GitHub 源码读取示例
curl -X POST 'http://localhost:8080/api/web/curl' \
-H 'Content-Type: application/json' \
-d '{"url":"https://raw.githubusercontent.com/changluya/openreach/main/README.md","method":"GET","maxChars":100000}'强制安全边界:目标 URL 每一跳都先执行 SSRF 校验;禁止 localhost、RFC1918/链路本地/保留地址、云 Metadata、非 80/443 端口,并额外禁止请求 OpenReach 自身。自请求识别会综合当前请求的 Host/serverName/localAddr、本机所有网卡地址以及 OPENREACH_CURL_BLOCKED_HOSTS 配置的额外域名/通配域名,防止该接口被用于回打自身管理面或爆破自身服务。
内容边界:只接收文本类响应(text/*、JSON、XML、JavaScript、YAML/TOML 等);图片、压缩包、可执行文件等二进制内容直接拒绝。GitHub 私有仓库或需要登录/Token 的内容不应通过该接口获取。
响应字段:url、finalUrl、method、statusCode、contentType、body、truncated、redirects、latencyMs、headers。
安全边界
- 公网 API 仅允许上述四个精确 POST 路径;只接受
application/json/application/*+json,不提供上传、写文件、Actuator 或调试接口。 - 四个 JSON API 请求体默认统一限制为 64 KiB;即使是 chunked / 未声明 Content-Length 的请求,也会在真实读取时执行同一上限。
multipart/*、危险 HTTP Method、未知 API 路径、路径穿越会在统一安全 Filter 中提前拒绝。- Read、Safe Curl 与图片下载探测只允许公网 HTTP/HTTPS 80/443,并对重定向目标重新执行 SSRF 校验;图片还必须通过真实图片 Magic Bytes 验证。
- 官网静态资源固定来自 classpath,并使用 CSP、nosniff、DENY frame 等响应头限制浏览器攻击面。
错误响应
Controller / Service 层错误包含时间戳、HTTP 状态码、错误码、traceId 和信息;安全 Filter 提前拒绝的响应也包含 traceId。所有请求响应头同时返回 X-OpenReach-Trace-Id,可用于检索持久化日志。
{
"timestamp": "2026-08-15T03:00:00Z",
"status": 400,
"code": "VALIDATION_ERROR",
"message": "query: must not be blank"
}| HTTP | code | 场景 |
|---|---|---|
| 400 | BAD_REQUEST | 业务参数、URL、SSRF、Provider 或内容类型等非法 |
| 400 | VALIDATION_ERROR | Bean Validation 失败,例如 query 超 500、limit 越界 |
| 400 | INVALID_JSON | JSON 语法错误或字段类型无法反序列化 |
| 404 | NOT_FOUND | 不在公网 Allowlist 中的路径 |
| 405 | METHOD_NOT_ALLOWED | API 非 POST 或静态资源非 GET/HEAD |
| 413 | PAYLOAD_TOO_LARGE | JSON 请求体超过默认 64 KiB 上限 |
| 415 | UPLOAD_DISABLED / UNSUPPORTED_MEDIA_TYPE | Multipart 上传或非 JSON Content-Type |
| 502 | UPSTREAM_ERROR | Provider 全部失败、无可下载图片或 Read 上游失败;Read 的明确 HTTP 失败会附带 failureType/upstreamStatus/retryable |
| 500 | INTERNAL_ERROR | 未预期服务端异常,内部异常不会直接回显 |
关键配置默认值
| 配置 | 默认值 | 说明 |
|---|---|---|
search.max-response-bytes | 2 MiB | 单个 Web Search Provider 上游 Body 硬上限 |
image-search.max-response-bytes | 4 MiB | 单个 Image Provider 上游 Body 硬上限 |
image-search.download-max-candidates | 60 | 单请求最多验证的图片候选数 |
image-search.download-validation-concurrency | 6 | 图片可下载验证并发 |
read.allowed-ports | 80, 443 | Read 公网访问允许端口 |
curl.max-bytes | 2 MiB | Safe Curl 单次公网文本响应字节上限 |
curl.max-chars | 100000 | Safe Curl 默认返回字符上限 |
curl.max-redirects | 5 | Safe Curl 最大跳转次数,每跳重新安全校验 |
curl.blocked-hosts | 空 | 额外声明 OpenReach 自身公网域名/别名,支持逗号分隔与通配域名 |
security.max-api-body-bytes | 65536 | 四个 JSON API 请求体统一硬上限 |
Provider 默认顺序
- Web CN:Bing → 百度 → 搜狗 → 360 → DuckDuckGo
- Web GLOBAL:Brave → DuckDuckGo → Bing Global
- Image CN:Bing → 百度图片 → 搜狗图片 → Openverse
- Image GLOBAL:Bing Global → Openverse → Wikimedia
源码与交流群
项目交流群
扫码交流接口接入、部署和 Provider 扩展。点击二维码可放大查看。
