Suscripción
Una tienda
- Envías
X-API-Key: sk_live_…, la clave que se muestra al registrarte, o regenerada en el área de cliente.- Pagas
- La cuota mensual de tu plan. No se cobra nada por llamada.
DOCSIntegrar la API de Address Validator
De la clave de API a producción: autenticación, contrato, códigos de respuesta, caché y cuotas. Después, cuatro casos prácticos: llamada directa, importación CSV, Shopify y WooCommerce.
Primeros pasos
sk_live_…) se muestra una sola vez. Después, se regenera desde el área de cliente.POST /validate con la clave en el encabezado X-API-Key.cache_key.curl -sS https://kder-ai.com/validate \
-H "X-API-Key: sk_live_TU_CLAVE" \
-H "content-type: application/json" \
-d '{"address": {"street": "1 Rue de Paris", "city": "Saint-Denis", "state": "RE", "zip": "97400", "country": "RE"}}'
En todos los ejemplos, sustituye sk_live_TU_CLAVE por tu clave.
¿Aún no tienes cuenta? Prueba una dirección gratis: la página no guarda nada y te muestra exactamente lo que devuelve la API.
Acceso
Dos accesos, una sola respuesta. Solo cambian el encabezado enviado y el pago.
Suscripción
X-API-Key: sk_live_…, la clave que se muestra al registrarte, o regenerada en el área de cliente.Pago por llamada · x402
X-PAYMENT: una autorización EIP-3009 firmada, construida a partir del cuerpo de la respuesta 402 (campo accepts).X-Payment-Mode.Nunca pongas la clave en un repositorio git, un archivo compartido ni una URL. Vive en una variable de entorno o en un gestor de secretos, y solo circula por https. Una clave filtrada se regenera con un clic: la anterior deja de funcionar al instante.
Referencia
POST https://kder-ai.com/validate, cuerpo JSON, encabezado content-type: application/json.
{"address": {
"street": "1 Rue de Paris", // obligatorio
"city": "Saint-Denis", // obligatorio
"state": "RE", // obligatorio (region o estado)
"zip": "97400", // obligatorio
"country": "RE" // opcional, "US" por defecto (ISO de 2 letras)
}}
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 no siempre es un veredicto: lee degraded antes de sacar una conclusión.deliverabilityresidential, commercial, unknown o invalid: el código del proveedor, traducido a lenguaje claro.confidencedegradedtrue: el proveedor no respondió (caída, tiempo de espera agotado, cortacircuitos abierto). La respuesta no dice nada de la dirección. No la registres nunca como «dirección inválida».price_paid0.0 para una llamada cubierta por una suscripción; el precio en USDC para una llamada pagada.cache_keySon los encabezados que la ruta añade de verdad. No se promete ningún otro.
X-Payment-Modeapi_key o x402: cómo se pagó la llamada.X-Plantrial, starter, pro o enterprise. Solo en modo clave.X-Quota-RemainingReferencia
Ocho códigos posibles en /validate. Los tres rechazos del modo clave (401, 402, 403) son distintos a propósito: trata cada uno a su manera.
Éxito
Lee result. Guarda cache_key: es tu seudónimo de esta dirección y sirve para pedir una eliminación.
Nada que reintentar
Por corregir de tu lado
La clave está incompleta, revocada (regenerada) o es de otro servicio. Corrige la variable de entorno. No reintentes en bucle.
No: corrige la clave
Límite o pago
Lee el cuerpo de la respuesta: indica cuál de los dos casos se aplica. Un 402 de cuota no es una caída.
Según el cuerpo
{"reason": "quota_atteint"}Tope de uso alcanzado. No es una caída. El contador se reinicia el día 1 del mes (UTC).{"x402Version": 1}Falta el pago de esta llamada. El precio está en el campo accepts.Por corregir de tu lado
La prueba gratuita ha terminado y la cuenta sigue en el plan de prueba. Pasa a un plan de pago: no se cobra nada automáticamente.
No: cambia de plan
Por corregir de tu lado
Falta un campo o está vacío. street, city, state y zip son obligatorios; country vale US por defecto.
Tras corregir
Límite
Afecta a /validate-form, la prueba sin cuenta, no a la API de pago. Espera el plazo indicado en Retry-After o crea una cuenta.
Tras Retry-After
Incidente del servicio
El servicio se niega a atender una validación que no puede registrar. Reintenta. Si la llamada era de pago, cita transaction_id: la conciliación se hace a mano.
Sí, guarda transaction_id
Incidente del servicio
No se pudo verificar la clave (no es un rechazo) o la base de datos no responde. Reintenta en unos minutos: no se ha consumido nada.
Un 503 nunca es una petición de pago.
Sí, en unos minutos
Facturación
cache_key.degraded se guarda 5 minutos, no 30 días: «el proveedor no respondió» no es un veredicto.degraded: true como «inténtalo más tarde». Pasada esa ventana corta, la misma llamada obtiene una respuesta real.X-Quota-Remaining. Escríbenos antes del límite y no después.price_paid: 0.0.402 (accepts): el precio figura ahí y nunca hay que adivinarlo./validate-form.Ejemplos
Cuatro formas de conectar la API. Cada ejemplo lee la clave de una variable de entorno.
$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
"""Verifica un CSV de direcciones y escribe el veredicto al lado.
El proveedor solo se consulta una vez por direccion: la respuesta se guarda en
cache (30 dias para un veredicto), asi que una segunda ejecucion sobre el mismo
archivo no cuesta nada mas.
"""
import csv
import os
import time
import requests
CLE = os.environ["ADDRESS_VALIDATOR_KEY"] # nunca en el codigo, nunca en 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) # caida del servicio: no se ha consumido nada
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"rechazo {reponse.status_code}"})
continue
resultat = reponse.json()["result"]
sortie.writerow(
{
**ligne,
"validated": resultat["validated"],
"deliverability": resultat["deliverability"],
"degraded": resultat["degraded"],
"note": "a reverificar (proveedor no disponible)"
if resultat["degraded"]
else "",
}
)
Lo que ilustra el ejemplo, y nada más: la clave viene de una variable de entorno, se respeta el 429 (el plazo se lee, no se adivina) y un resultado degraded se marca como «por reverificar» en lugar de escribirse como dirección inválida.
orders/create (o tu paso de preparación de paquetes) llama a tu servicio, que consulta /validate con la dirección de entrega del pedido.shipping_address.address1 → street (añade address2 a line2 en el resultado)city → cityprovince_code → statezip → zipcountry_code → countryvalidated: false: señala el pedido en tu back-office antes del envío. degraded: true: no bloquees nada, reprograma una comprobación.woocommerce_checkout_order_processed (pedido pagado) o un cron que recorre los pedidos en preparación (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 con el pedido: es el único identificador de la dirección válido para una solicitud de eliminación.En todos los casos: una sola llamada por dirección y por pedido, nunca en un bucle que ignore los códigos de respuesta. Un 402 de cuota no es una caída: es un límite y se lee en la respuesta.
Desarrolladores y agentes de IA
Un agente autónomo no necesita ni cuenta ni clave. Cada validación cobrada cuesta 0,02 USDC, pagada con x402 en la red Base.
POST /validate con el cuerpo habitual. Sin pago, la respuesta es un 402 cuyo cuerpo lleva {"x402Version": 1} y el campo accepts: el precio figura ahí.accepts y reenvía la solicitud con el encabezado X-PAYMENT.X-Payment-Mode vale x402, price_paid da el precio en USDC y transaction_id es la referencia que hay que citar en caso de 500.Para tus agentes, todo se descubre sin pagar:
Conviene saber antes de integrar
degraded: true Reverificarcache_key) y el resultado, nunca la dirección en sí. En la prueba gratuita sin cuenta: nada, solo un contador anónimo que hace respetar el tope. Una solicitud de eliminación se hace con el cache_key.Crea una cuenta para obtener tu clave o prueba primero una dirección sin cuenta.