订阅
网店
- 您发送
X-API-Key: sk_live_…,即注册时显示的密钥,或在客户中心重新生成的密钥。- 您支付
- 您套餐的月度额度。调用时不会收取任何费用。
文档集成 Address Validator API
从 API 密钥到上线:身份验证、接口约定、状态码、缓存和额度。随后是四个实际案例:直接调用、CSV 导入、Shopify 和 WooCommerce。
快速开始
sk_live_…)只显示一次。之后可在客户中心重新生成。POST /validate,并把密钥放在请求头 X-API-Key 中。cache_key。curl -sS https://kder-ai.com/validate \
-H "X-API-Key: sk_live_YOUR_KEY" \
-H "content-type: application/json" \
-d '{"address": {"street": "1 Rue de Paris", "city": "Saint-Denis", "state": "RE", "zip": "97400", "country": "RE"}}'
在所有示例中,请把 sk_live_YOUR_KEY 替换为您的密钥。
还没有账户?可以免费测试一个地址:该页面不写入任何数据,并会如实显示 API 的返回内容。
访问方式
两种接入方式,同样的响应。只有发送的请求头和付费方式不同。
订阅
X-API-Key: sk_live_…,即注册时显示的密钥,或在客户中心重新生成的密钥。按次付费 · x402
X-PAYMENT:根据 402 响应正文(accepts 字段)构造并签名的 EIP-3009 授权。X-Payment-Mode 中说明本次调用是如何付费的。切勿把密钥放进 git 仓库、共享文件或 URL。密钥应保存在环境变量或密钥管理工具中,并且只通过 https 传输。密钥一旦泄露,一键即可重新生成:旧密钥会立即失效。
参考
POST https://kder-ai.com/validate,JSON 正文,请求头 content-type: application/json。
{"address": {
"street": "1 Rue de Paris", // 必填
"city": "Saint-Denis", // 必填
"state": "RE", // 必填(地区或州)
"zip": "97400", // 必填
"country": "RE" // 可选,默认为 "US"(ISO 2 位字母)
}}
200 响应{
"result": {
"validated": true,
"standardized": {"line1": "1 RUE DE PARIS", "line2": "", "city": "SAINT-DENIS",
"state": "RE", "zip": "97400", "country": "RE"},
"latitude": -20.8823, "longitude": 55.4504,
"deliverability": "residential",
"confidence": 0.99,
"degraded": false,
"cache_key": "9b7a..."
},
"price_paid": 0.0,
"transaction_id": null
}
validatedfalse 并不总是最终结论:下结论之前,请先看 degraded。deliverabilityresidential、commercial、unknown 或 invalid:服务商的代码,已转换为直白的取值。confidencedegradedtrue:服务商没有响应(故障、超时或熔断器已打开)。该响应不说明地址本身的任何情况。切勿把它记录为“地址无效”。price_paid0.0;按次付费的调用则为以 USDC 计的价格。cache_key以下是该接口实际返回的响应头,不承诺提供其他响应头。
X-Payment-Modeapi_key 或 x402:本次调用的付费方式。X-Plantrial、starter、pro 或 enterprise。仅密钥模式下返回。X-Quota-Remaining参考
/validate 可能返回八种状态码。密钥模式下的三种拒绝(401、402、403)是有意区分的:请分别处理。
成功
读取 result。请保存 cache_key:它是该地址的假名标识,可用于申请删除。
无需重试
需在您这边修正
密钥不完整、已被撤销(已重新生成),或属于其他服务。请修正环境变量。不要循环重试。
否:请修正密钥
限额或付款
请读取响应正文:它会说明属于哪种情况。因额度产生的 402 不是故障。
视响应正文而定
{"reason": "quota_atteint"}已达到用量上限。这不是故障。计数器每月 1 日(UTC)重置。{"x402Version": 1}本次调用缺少付款。价格在 accepts 字段中。需在您这边修正
免费试用已结束,账户仍停留在试用套餐。请升级到付费套餐:不会自动扣款。
否:请更换套餐
需在您这边修正
某个字段缺失或为空。street、city、state 和 zip 为必填;country 默认为 US。
修正后再试
限额
适用于 /validate-form,即无需账户的测试,而不是付费 API。请等待 Retry-After 中给出的时间,或创建账户。
Retry-After 之后
服务端故障
服务拒绝返回无法记录的验证结果。请重试。如果该调用已付款,请提供 transaction_id:我们会手动对账。
是,请保存 transaction_id
服务端故障
无法校验密钥(这不是拒绝),或数据库没有响应。请几分钟后重试:没有消耗任何额度。
503 绝不是付款请求。
是,几分钟后
计费
cache_key 保证。degraded 结果只缓存 5 分钟,而不是 30 天:“服务商没有响应”不是验证结论。degraded: true 当作“请稍后重试”。过了这个很短的时间窗口,同样的调用就能得到真实的响应。X-Quota-Remaining。请在达到上限之前联系我们,而不是之后。price_paid: 0.0。402 正文(accepts):价格就在其中,无需猜测。/validate-form 上,每位访客每天 10 次验证。示例
接入 API 的四种方式。每个示例都从环境变量中读取密钥。
$cle = $env:ADDRESS_VALIDATOR_KEY
$corps = '{"address":{"street":"1 Rue de Paris","city":"Saint-Denis","state":"RE","zip":"97400","country":"RE"}}'
$r = Invoke-WebRequest -Uri https://kder-ai.com/validate -Method POST `
-Headers @{ "X-API-Key" = $cle } -ContentType "application/json" -Body $corps
$r.StatusCode
$r.Headers["X-Payment-Mode"], $r.Headers["X-Plan"], $r.Headers["X-Quota-Remaining"]
($r.Content | ConvertFrom-Json).result
"""核对地址 CSV 文件,并在旁边写入结论。
每个地址只向服务商查询一次:响应会被缓存
(结论缓存 30 天),因此对同一文件再次运行
不会产生额外费用。
"""
import csv
import os
import time
import requests
CLE = os.environ["ADDRESS_VALIDATOR_KEY"] # 切勿写进代码,切勿提交到 git
API = "https://kder-ai.com/validate"
with open("colis.csv", newline="", encoding="utf-8") as source, open(
"colis-verifies.csv", "w", newline="", encoding="utf-8"
) as cible:
lecteur = csv.DictReader(source)
champs = list(lecteur.fieldnames) + [
"validated", "deliverability", "degraded", "note",
]
sortie = csv.DictWriter(cible, fieldnames=champs)
sortie.writeheader()
for ligne in lecteur:
reponse = requests.post(
API,
headers={"X-API-Key": CLE},
timeout=30,
json={
"address": {
"street": ligne["adresse"],
"city": ligne["ville"],
"state": ligne["region"],
"zip": ligne["code_postal"],
"country": ligne.get("pays") or "US",
}
},
)
if reponse.status_code in (500, 503):
time.sleep(5) # 服务端故障:没有消耗任何额度
continue
if reponse.status_code == 429:
time.sleep(int(reponse.headers.get("Retry-After", "60")))
continue
if reponse.status_code != 200:
sortie.writerow({**ligne, "note": f"refus {reponse.status_code}"})
continue
resultat = reponse.json()["result"]
sortie.writerow(
{
**ligne,
"validated": resultat["validated"],
"deliverability": resultat["deliverability"],
"degraded": resultat["degraded"],
"note": "a reverifier (fournisseur injoignable)"
if resultat["degraded"]
else "",
}
)
这个示例只说明三点:密钥来自环境变量;遵守 429(等待时间是读取的,不是猜的);degraded 结果会标记为“需重新验证”,而不是写成无效地址。
orders/create webhook(或您的包裹备货环节)调用您的服务,由您的服务带着订单的收货地址请求 /validate。shipping_address.address1 → street (把 address2 加到结果中的 line2)city → cityprovince_code → statezip → zipcountry_code → countryvalidated: false:发货之前,在您的后台标记该订单。degraded: true:不要拦截任何订单,改期重新核验。woocommerce_checkout_order_processed 动作(订单已付款),或遍历备货中订单的定时任务(wc_get_orders( ['status' => 'processing'] ))。$order->get_shipping_address_1() → street$order->get_shipping_city() → city$order->get_shipping_state() → state$order->get_shipping_postcode() → zip$order->get_shipping_country() → countrycache_key 与订单一起保存:它是申请删除时唯一有效的地址标识。无论哪种情况:每个地址、每个订单只调用一次,绝不要放进忽略状态码的循环里。因额度产生的 402 不是故障,而是一项限制,响应里会写明。
开发者与 AI 智能体
自主智能体既不需要账户,也不需要密钥。每次收费的验证为 0.02 USDC,通过 x402 在 Base 网络上支付。
POST /validate,正文与平常相同。未付款时,响应为 402,其正文包含 {"x402Version": 1} 和 accepts 字段:价格就在其中。accepts 构造 EIP-3009 授权,并带上请求头 X-PAYMENT 重新发送请求。X-Payment-Mode 为 x402,price_paid 给出以 USDC 计的价格,transaction_id 是遇到 500 时需要提供的凭据。您的智能体可以免费发现以下全部内容:
集成之前请了解
degraded: true 需重新验证cache_key)和处理结果,绝不保存地址本身。对于无需账户的免费测试:什么都不保存,只有一个匿名计数器用来执行上限。删除请求通过 cache_key 提出。