403「Country, region, or territory not supported」
检查 经过同一个代理打开 ipinfo.io,显示的是不是支持的国家?客户端真的用了代理吗?
处理 按第 3、4 步把代理交给调用 API 的客户端,并使用支持国家的 IP。
让 OpenAI API 请求走代理有四种办法,从最快的测试到长期保留的代码:环境变量、curl、Python SDK 和 Node SDK。每一步都带出口 IP 的检查,最后还有 SOCKS5 的说明。
OpenAI 的 API 只在它支持列表里的国家和地区提供服务。从不支持的地区发请求会收到 403「Country, region, or territory not supported」,OpenAI 也写明:从列表以外的地区访问其服务,账号可能被封禁或停用。代理改变的是请求发出的网络出口,它不能让 API 在不提供服务的地方变得可用,也不会改变 OpenAI 的条款。
「OpenAI API 代理」页讲的是该买哪种 IP、怎么把它加进 OpenAI 的 IP 白名单。这篇是设置手册:每一种代理设置在哪里有效、怎么测试,不通的时候怎么办。
从「我的资产」拿到的代理地址 HOST、PORT、USERNAME、PASSWORD,以及你购买时选的协议:HTTP 或 SOCKS5。每个 IP 只保留这一种协议,所以先决定你要用下面哪组示例。机房 IP 30 天 US$3.99,所有国家价格相同。如果密码里有特殊字符,要在地址里做百分号编码(@ 写成 %40,: 写成 %3A,/ 写成 %2F),否则会返回 407。
| 项目 | 在哪里有效 | 要注意什么 |
|---|---|---|
| curl -x | 一条命令,任何机器 | -x 会覆盖代理环境变量,最适合做第一次测试。 |
| 环境变量 | 会读取它们的程序:curl,以及设置了 NODE_USE_ENV_PROXY=1 的 Node | 对从这个终端启动的所有程序生效。我们读到的 SDK 页面没有列出它们,每个工具都要测试。 |
| Python SDK 客户端 | 只对你创建的客户端生效 | 文档写明:DefaultHttpx2Client(proxy=...)。机器上其他程序不受影响。 |
| Node SDK 的 fetchOptions | 只对你创建的客户端生效 | 文档写明:undici 的 fetch 加 ProxyAgent 作为 dispatcher。undici 的选项必须配 undici 自己的 fetch。 |
要长期保留的代码,优先用客户端设置;环境变量适合快速测试,以及不是你自己写的工具。
在将要发请求的那台机器上运行下面三条命令。第一条必须显示你买的那个国家。第二条打印一个状态码:403 说明这个国家不被支持;其他数字(比如因为没带密钥返回的 401)说明问题不在国家(OpenAI 的错误码页面没有写不带密钥的请求会怎样,这是我们的判断)。第三条带上你的密钥列出模型,证明密钥通过代理可以用。
# 1) Which IP and country does the world see through the proxy?
curl -x "http://USERNAME:PASSWORD@HOST:PORT" https://ipinfo.io/json
# 2) Does OpenAI accept this exit? Without a key: 403 = unsupported country; 401 = not a country problem
curl -s -o /dev/null -w "%{http_code}\n" -x "http://USERNAME:PASSWORD@HOST:PORT" \
https://api.openai.com/v1/models
# 3) With your key: 200 and the list of models
curl -x "http://USERNAME:PASSWORD@HOST:PORT" https://api.openai.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY"把 HOST、PORT、USERNAME、PASSWORD 换成「我的资产」里的值。第三条只是列出模型,用来第一次测试密钥很安全。
很多程序会读 HTTPS_PROXY 和 HTTP_PROXY。不同工具对大小写的处理不一样(curl 手册里 http_proxy 是小写、HTTPS_PROXY 是大写),所以两种都设。NO_PROXY 是用逗号分隔的、不走代理的主机列表。Node 的文档说:设置 NODE_USE_ENV_PROXY=1(或者用 --use-env-proxy 启动)后,全局 agent 会读这些变量,代理地址可以是 HTTP 或 HTTPS,那一节没有提到 SOCKS5。Python 方面,我们读到的页面讲了 proxy 参数,但没有列出 OpenAI SDK 会读 HTTPS_PROXY,所以别依赖它:按第 3、4 步把代理交给客户端,或者用检查来确认。
# macOS / Linux (bash, zsh). Put the details in a variable once.
export PROXY_URL="http://USERNAME:PASSWORD@HOST:PORT"
export HTTP_PROXY="$PROXY_URL"
export HTTPS_PROXY="$PROXY_URL"
export http_proxy="$PROXY_URL"
export https_proxy="$PROXY_URL"
export NO_PROXY="localhost,127.0.0.1"
# Windows PowerShell
# $env:HTTPS_PROXY = "http://USERNAME:PASSWORD@HOST:PORT"
# $env:HTTP_PROXY = $env:HTTPS_PROXY把 HOST、PORT、USERNAME、PASSWORD 换成「我的资产」里的值。这些变量只在你设置它们的那个终端里有效。
新版 OpenAI Python SDK 建立在 HTTPX2 上。DefaultHttpx2Client 保留 SDK 推荐的超时、连接池和重定向默认值,只加上代理;旧的 DefaultHttpxClient 名字仍然可用。同一个客户端还能去请求 ipinfo.io,所以第一行输出显示的就是 SDK 实际使用的出口。
# pip install -U "openai[httpx2]" (needs Python 3.10 or later; reads OPENAI_API_KEY from the environment)
from openai import OpenAI, DefaultHttpx2Client
PROXY = "http://USERNAME:PASSWORD@HOST:PORT" # HTTP line; for SOCKS5 see below
http = DefaultHttpx2Client(proxy=PROXY)
# 1) Which IP does the proxy show?
print(http.get("https://ipinfo.io/json").text)
# 2) Use the same client for the API
client = OpenAI(http_client=http)
for model in client.models.list():
print(model.id)
# SOCKS5: pip install "httpx2[socks]", then use this line instead
# PROXY = "socks5://USERNAME:PASSWORD@HOST:PORT"代理的用户名和密码写在地址的 userinfo 部分,这是 HTTPX2 文档的写法。SOCKS5 的话,先装 httpx2[socks],再改用注释里的 socks5:// 那一行。
OpenAI Node SDK 的文档写了这种设置:从 undici 导入 fetch 和 ProxyAgent,把 undici 的 fetch 和 agent 作为 fetchOptions.dispatcher 交给客户端。SDK 特别说明,dispatcher 这类 undici 选项必须配对应的 fetch,所以不要把 undici 的 ProxyAgent 和别的 fetch 混用。undici 会把地址里的用户名和密码解码后作为代理认证发送。Bun 和 Deno 的写法在 SDK 的 README 里。
// npm install openai undici (reads OPENAI_API_KEY from the environment)
// Save as check.mjs and run: node check.mjs
import OpenAI from 'openai';
import { fetch, ProxyAgent } from 'undici';
// If the password has special characters, wrap it: encodeURIComponent(password)
const dispatcher = new ProxyAgent('http://USERNAME:PASSWORD@HOST:PORT');
// 1) Which IP does the proxy show?
const ip = await fetch('https://ipinfo.io/json', { dispatcher });
console.log(await ip.text());
// 2) The same dispatcher for the API
const client = new OpenAI({ fetch, fetchOptions: { dispatcher } });
for await (const model of client.models.list()) {
console.log(model.id);
}
// SOCKS5: use this line instead
// const dispatcher = new ProxyAgent('socks5://USERNAME:PASSWORD@HOST:PORT');
// Built-in route for HTTP proxies, Node 22.21+ / 24.5+, no SDK code:
// NODE_USE_ENV_PROXY=1 HTTPS_PROXY="http://USERNAME:PASSWORD@HOST:PORT" node check.mjs保存为 check.mjs。第一个请求打印出口 IP,第二个列出模型。SOCKS5 的话,换成注释里的那一行。最后一行注释是 Node 内置的环境变量写法,只适用于 HTTP 代理(Node 22.21 或 24.5 及更新);SDK 页面没有列出它,请用一次请求来确认。
HTTP 最简单:这里所有示例都用 HTTP 代理地址,Node 的环境变量写法文档里也只有 HTTP 代理。SOCKS5 在下面三个地方可用,而且你买的必须是 SOCKS5 的 IP,因为协议是买 IP 时选定的,一个 IP 只有一种。
curl 的 -x 接受 socks5:// 和 socks5h://(手册里两种都列了),我们的 Python requests 指南用的是 socks5h。Python SDK:安装 httpx2[socks],用 socks5:// 地址,这是 HTTPX2 文档的写法。Node SDK:undici 的 ProxyAgent 会处理 socks5: 地址。Node 内置的环境变量支持只列了 HTTP 和 HTTPS 代理地址。
# SOCKS5 line of the same IP (use the SOCKS5 port from My assets)
curl -x "socks5h://USERNAME:PASSWORD@HOST:PORT" https://ipinfo.io/json把 HOST、PORT、USERNAME、PASSWORD 换成「我的资产」里的值。用 SOCKS5 端口,并且这个 IP 必须是按 SOCKS5 买的。
检查 经过同一个代理打开 ipinfo.io,显示的是不是支持的国家?客户端真的用了代理吗?
处理 按第 3、4 步把代理交给调用 API 的客户端,并使用支持国家的 IP。
检查 密码里有没有没编码的特殊字符?IP 的租期是否已到?
处理 对地址里的密码做百分号编码,或从「我的资产」重新复制,并查看到期日。
检查 出口 IP 在适用于该密钥的白名单里吗?
处理 从白名单里的 IP 发请求,或者到 OpenAI 的设置里更新白名单。
检查 设置了 NODE_USE_ENV_PROXY=1 吗?SDK 用的是全局 fetch 吗?
处理 按第 4 步在客户端上设置 dispatcher,这是文档写明的做法。
检查 机器上有操作系统的 CA 证书吗?HTTPX2 改了默认的信任库。
处理 安装 CA 证书,或者把 SSL_CERT_FILE 指向一个 CA 证书包。替换证书的代理,也要用同样方式信任它的证书。
机房 IP 一天 US$0.25,30 天 US$3.99,所有国家价格相同;静态 ISP IP 30 天 US$7.99。一次最多买 100 个 IP,没有免费试用。该选哪种类型,见「OpenAI API 代理」页。
对 curl 有效。对 Node,在带内置代理支持的版本上设置 NODE_USE_ENV_PROXY=1,全局 agent 会读取它,但我们读到的 SDK 页面没有列出,请用第一个请求确认。Python 方面,我们读到的页面讲的是 proxy 参数而不是这个变量,所以请给客户端传 proxy=。
没有特殊理由就选 HTTP。SOCKS5 在 curl、装了 httpx2[socks] 的 Python SDK 和 undici 里可用,但 Node 的环境变量写法不支持。
只有你配置的那个客户端;如果你 export 了环境变量,则从那个终端启动的所有程序都会走。
不能。代理只改变网络出口,OpenAI 的支持国家列表和条款依然适用。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:从列表以外的国家和地区访问或提供 OpenAI 的服务,账号可能被封禁或停用;中国大陆、香港和俄罗斯不在列表中。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:403「Country, region, or territory not supported」表示你从不支持的国家或地区访问 API;401「IP not authorized」表示请求 IP 与配置的 IP 白名单不符。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:示例是在客户端上设置 DefaultHttpx2Client(proxy=...);这些辅助类保留 SDK 推荐的超时、连接池和重定向默认值;DefaultHttpxClient 仍然可用,现在会构造 HTTPX2 客户端;HTTPX2 把默认 TLS 信任库从 certifi 改了,verify 可以传 ssl.SSLContext;trust_env=True(默认)时会读取 SSL_CERT_FILE 和 SSL_CERT_DIR。
该页面没有描述 HTTP_PROXY 或 HTTPS_PROXY。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:客户端初始化时的 proxy 参数;用户名和密码写在代理地址的 userinfo 部分;SOCKS 需要 pip install httpx2[socks] 和 socks5:// 地址。
该页面没有描述代理环境变量。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:在 Node 中,从 undici 导入 fetch 和 ProxyAgent,并传 fetchOptions: { dispatcher };dispatcher 这类 undici 专有选项必须配对应的 fetch;Bun 在 fetchOptions 里用 proxy,Deno 用 Deno.createHttpClient 创建的客户端。
README 没有提到代理环境变量。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:设置 NODE_USE_ENV_PROXY=1 或使用 --use-env-proxy 时,全局 agent 按环境变量 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY 构建(小写版本优先);代理地址可以是 http:// 或 https://,可带用户名和密码;http.setGlobalProxyFromEnv() 为 fetch() 和 http.request()/https.request() 启用该功能;该功能加入于 v24.5.0 和 v22.21.0,稳定性标为 1.1(积极开发中)。
那一节没有提到 SOCKS5。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:ProxyAgent 通过 HTTP、HTTPS 或 SOCKS5 代理转发请求;socks5: 和 socks: 地址由 Socks5ProxyAgent 处理;proxy-authorization 头来自地址中的用户名和密码(先做 URL 解码)。
该页面没有提到环境变量。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:代理字符串接受 socks4://、socks4a://、socks5:// 和 socks5h://;不写协议或写 http:// 表示 HTTP 代理;代理字符串里的用户名和密码会被 URL 解码;该选项会覆盖代理环境变量。
我们读到的页面没有解释 socks5 和 socks5h 的区别。
官方文档 · 确认日期:
2026 年 11 月 2 日读取:curl 读取 http_proxy、HTTPS_PROXY 和 ALL_PROXY;NO_PROXY 列出不走代理的主机;-x 会覆盖环境变量。
页面里 http_proxy 是小写,其余是大写。
产品观察 · 确认日期:
本站产品事实文件(数值已于 2026 年 10 月 18-19 日对照控制台、后端和价格表核对),2026 年 11 月 2 日读取:机房按 IP 租用,1 天 US$0.25、30 天 US$3.99,所有国家相同;静态 ISP 30 天 US$7.99;HTTP 或 SOCKS5 按购买选择,一个 IP 一种协议;每单最多 100 个;没有免费试用。
注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。