← 返回 API 目录
中文域名转码
域名中文域名与 Punycode 互相转换。
GET https://api.wanmi.net/open/v1/idn-convert每天 100 次免费,超出 ¥0.01/次 · 同一账号多个 key 共用
用多少付多少。云工具 API 无免费次数,创建时预留余额,成功交付才结算(异步 PDF 在领取时结算);失败释放或补偿。主动开通按量付费后,免费次数用完按接口单价从钱包扣费;余额不足或每日扣费上限已到时拒绝,不欠费。仅成功交付收费,符合接口契约的降级成功照常收费;失败和未交付不收费。每次扣费及补偿可在控制台账单查看,单价以各接口当前配置及调用准入快照为准。
沿用站内域名规范化,返回 ASCII、Unicode、展示形式与混合文字风险提示。纯本地计算,不访问上游。
返回示例
{
"state": "ready",
"data": {
"ascii": "xn--fsqu00a.com",
"unicode": "例子.com",
"display": "例子.com",
"risks": []
}
}在线试调
粘贴你自己的 key,浏览器会直接向 api.wanmi.net 发送请求。key 仅在当前页面内存中使用,不保存、不上传主站。成功调用会计入免费次数;已开通按量付费时,超出免费次数会按接口单价扣余额。
响应点击“发送请求”查看真实返回
等待请求
代码示例
curl --max-time 6 'https://api.wanmi.net/open/v1/idn-convert?domain=%E4%BE%8B%E5%AD%90.com' \ -H "Authorization: Bearer $WANMI_API_KEY"
将 WANMI_API_KEY 设为环境变量。请在自己的服务器中运行,勿将 key 放进公开代码。
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
domain | string | 必填 | 最长 1024 字符 例如: 例子.com |
返回字段与完整结构
| 字段 | 类型 | 必返 | 说明 |
|---|---|---|---|
state | ready | empty | degraded | 是 | — |
data | object | 是 | — |
data.ascii | string | 是 | 最短 1 字符;最长 253 字符 |
data.display | string | 是 | 最短 1 字符;最长 253 字符 |
data.risks | object[] | 是 | — |
data.risks.[]code | DOMAIN_MIXED_SCRIPT_RISK | 是 | — |
data.risks.[]labelAscii | string | 是 | 最短 1 字符;最长 63 字符 |
data.risks.[]message | string | 是 | 最短 1 字符 |
data.risks.[]scripts | string[] | 是 | — |
data.unicode | string | 是 | 最短 1 字符 |
meta | object | 否 | — |
meta.cacheStatus | hit | miss | mixed | not_used | 否 | — |
meta.dataSource | string | 否 | 最短 1 字符 |
meta.lastSuccessfulAt | string | 否 | date-time;格式 ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$ |
meta.observedAt | string | 否 | date-time;格式 ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$ |
meta.stale | boolean | 否 | — |
meta.traceId | string | 否 | 格式 ^[a-zA-Z0-9._:-]{8,128}$ |
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"state": {
"type": "string",
"enum": [
"ready",
"empty",
"degraded"
]
},
"data": {
"type": "object",
"properties": {
"ascii": {
"type": "string",
"minLength": 1,
"maxLength": 253
},
"display": {
"type": "string",
"minLength": 1,
"maxLength": 253
},
"risks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"code": {
"type": "string",
"const": "DOMAIN_MIXED_SCRIPT_RISK"
},
"labelAscii": {
"type": "string",
"minLength": 1,
"maxLength": 63
},
"message": {
"type": "string",
"minLength": 1
},
"scripts": {
"minItems": 2,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"code",
"labelAscii",
"message",
"scripts"
],
"additionalProperties": false
}
},
"unicode": {
"type": "string",
"minLength": 1
}
},
"required": [
"ascii",
"display",
"risks",
"unicode"
],
"additionalProperties": false
},
"meta": {
"type": "object",
"properties": {
"cacheStatus": {
"type": "string",
"enum": [
"hit",
"miss",
"mixed",
"not_used"
]
},
"dataSource": {
"type": "string",
"minLength": 1
},
"lastSuccessfulAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"observedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"stale": {
"type": "boolean"
},
"traceId": {
"type": "string",
"pattern": "^[a-zA-Z0-9._:-]{8,128}$"
}
},
"additionalProperties": false
}
},
"required": [
"state",
"data"
],
"additionalProperties": false
}错误码
| HTTP | 错误码 | 含义与处理 |
|---|---|---|
| 400 | INVALID_REQUEST | 请检查请求;保留响应中的 traceId 以便排查。 |
| 400 | API_INPUT_INVALID | 请按参数表检查输入;参数错误不计入免费次数。 |
| 401 | API_KEY_REQUIRED | 在 Authorization 请求头中添加 Bearer key。 |
| 401 | API_KEY_INVALID | 检查 key 是否正确;轮换后请更新程序中的 key。 |
| 401 | API_KEY_REVOKED | key 已吊销,请在控制台创建新的 key。 |
| 402 | API_BALANCE_INSUFFICIENT | 请检查请求;保留响应中的 traceId 以便排查。 |
| 403 | API_SPEND_REACTIVATION_REQUIRED | 请检查账户状态和权限后再试。 |
| 403 | ACCOUNT_BALANCE_SPEND_DISABLED | 请检查账户状态和权限后再试。 |
| 403 | STEP_UP_IDENTITY_RISK_COOLDOWN_ACTIVE | 请检查账户状态和权限后再试。 |
| 403 | API_KEY_BANNED | key 已封禁,请联系支持。 |
| 403 | API_SCOPE_FORBIDDEN | 此 key 无权调用该接口,请在控制台检查权限。 |
| 403 | API_KEY_CHANGED | key 已发生变化,请使用最新的 key。 |
| 403 | REALNAME_VERIFICATION_REQUIRED | 请检查账户状态和权限后再试。 |
| 403 | ACCOUNT_API_ACCESS_DISABLED | 请检查账户状态和权限后再试。 |
| 403 | ACCOUNT_LOGIN_DISABLED | 请检查账户状态和权限后再试。 |
| 403 | ACCOUNT_CLOSED | 请检查账户状态和权限后再试。 |
| 403 | ACCOUNT_CLOSING | 请检查账户状态和权限后再试。 |
| 403 | ACCOUNT_PENDING_REGISTRATION | 请检查账户状态和权限后再试。 |
| 403 | ACCOUNT_SUSPENDED | 请检查账户状态和权限后再试。 |
| 403 | ACCOUNT_STATE_INVALID | 请检查账户状态和权限后再试。 |
| 404 | API_NOT_FOUND | 请检查请求;保留响应中的 traceId 以便排查。 |
| 405 | API_METHOD_NOT_ALLOWED | 请检查请求;保留响应中的 traceId 以便排查。 |
| 408 | API_REQUEST_ABORTED | 请检查请求;保留响应中的 traceId 以便排查。 |
| 409 | API_RESERVATION_EXPIRED | 请检查请求;保留响应中的 traceId 以便排查。 |
| 409 | API_SPEND_VERSION_CHANGED | 请检查请求;保留响应中的 traceId 以便排查。 |
| 409 | WALLET_SPEND_LIMIT_EXCEEDED | 请检查请求;保留响应中的 traceId 以便排查。 |
| 410 | API_UNAVAILABLE | 接口已下架,请查看目录中的已开放接口。 |
| 421 | API_HOST_INVALID | 请检查请求;保留响应中的 traceId 以便排查。 |
| 429 | API_RATE_LIMITED | 请求过于频繁,请按 Retry-After 等待后重试。 |
| 429 | API_FREE_QUOTA_EXHAUSTED | 今日免费次数已用完;可在控制台主动开通按量付费,或等待次日免费次数恢复。 |
| 429 | API_SITE_QUOTA_EXHAUSTED | 接口的全站日容量已满,请稍后再试。 |
| 429 | API_DAILY_SPEND_LIMIT_EXCEEDED | 请检查请求;保留响应中的 traceId 以便排查。 |
| 500 | INTERNAL_ERROR | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 500 | API_TELEMETRY_INVALID | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 500 | ACCOUNT_RESTRICTIONS_INVALID | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 502 | API_EXECUTION_FAILED | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 502 | API_INVALID_RESPONSE | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 502 | API_RESPONSE_TOO_LARGE | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 502 | API_UPSTREAM_UNAVAILABLE | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 503 | API_BILLING_NOT_CONFIGURED | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 503 | API_BILLING_UNAVAILABLE | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 503 | WALLET_POLICY_UNAVAILABLE | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 503 | WALLET_LEDGER_UNAVAILABLE | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 503 | OPEN_API_DISABLED | 服务尚未开放或暂时停用,请稍后再试。 |
| 503 | API_LIMIT_UNAVAILABLE | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 503 | API_QUOTA_UNAVAILABLE | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 503 | API_QUOTA_NOT_CONFIGURED | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |
| 504 | API_EXECUTION_TIMEOUT | 服务暂时未能完成调用;失败不计次,请保留 X-Request-Id 联系支持。 |