اشتراك
متجر
- ما ترسله
X-API-Key: sk_live_…، وهو المفتاح الذي ظهر عند التسجيل، أو الذي أُعيد إنشاؤه في حساب العميل.- ما تدفعه
- الحصة الشهرية لباقتك. لا شيء يُحصَّل عند الاستدعاء.
التوثيقدمج واجهة API لخدمة Address Validator
من مفتاح 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_مفتاحك" \
-H "content-type: application/json" \
-d '{"address": {"street": "1 Rue de Paris", "city": "Saint-Denis", "state": "RE", "zip": "97400", "country": "RE"}}'
في كل الأمثلة، استبدل sk_live_مفتاحك بمفتاحك.
ليس لديك حساب بعد؟ اختبر عنوانًا مجانًا: الصفحة لا تحفظ شيئًا، وتعرض لك بالضبط ما تعيده واجهة API.
الوصول
مدخلان، ورد واحد. لا يتغير إلا الترويسة المرسلة وطريقة الدفع.
اشتراك
X-API-Key: sk_live_…، وهو المفتاح الذي ظهر عند التسجيل، أو الذي أُعيد إنشاؤه في حساب العميل.الدفع لكل استدعاء · x402
X-PAYMENT: تفويض EIP-3009 موقَّع، يُبنى من متن الرد 402 (الحقل accepts).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 من حرفين)
}}
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"}بلغت سقف الاستخدام. هذا ليس عطلًا. يبدأ العدّاد من جديد في اليوم الأول من الشهر (UTC).{"x402Version": 1}الدفع مفقود لهذا الاستدعاء. السعر موجود في الحقل accepts.يُصحَّح من جهتك
انتهت التجربة المجانية وبقي الحساب على باقة التجربة. انتقل إلى باقة مدفوعة: لا يُخصم أي مبلغ تلقائيًا.
لا: غيّر الباقة
يُصحَّح من جهتك
حقل مفقود أو فارغ. الحقول street وcity وstate وzip إلزامية؛ والقيمة الافتراضية للحقل country هي US.
بعد التصحيح
حدّ
يخص /validate-form، أي التجربة دون حساب، لا الواجهة المدفوعة. انتظر المهلة المعلنة في 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.أمثلة
أربع طرق لربط الواجهة. كل مثال يقرأ المفتاح من متغير بيئة.
$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 (أو خطوة تجهيز الطرد لديك) يستدعي خدمتك، التي تستعلم /validate بعنوان التسليم الخاص بالطلب.shipping_address.address1 ← street (أضف address2 إلى line2 من جهة النتيجة)city ← cityprovince_code ← statezip ← zipcountry_code ← countryvalidated: false: علّم الطلب في لوحة الإدارة قبل الشحن. degraded: true: لا توقف شيئًا، وأعد جدولة فحص.woocommerce_checkout_order_processed (طلب مدفوع)، أو مهمة cron تمر على الطلبات قيد التجهيز (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 الخاص بالحصة ليس عطلًا: إنه حدّ، ويُقرأ في الرد.
المطورون ووكلاء الذكاء الاصطناعي
لا يحتاج الوكيل المستقل إلى حساب ولا إلى مفتاح. كل عملية تحقق محصَّلة تكلّف 0.02 USDC، تُدفع عبر x402 على شبكة Base.
POST /validate بالمتن المعتاد. دون دفع، يكون الرد 402 ويحمل متنه {"x402Version": 1} والحقل accepts: السعر مذكور فيه.accepts، وأعد إرسال الطلب مع الترويسة X-PAYMENT.X-Payment-Mode هي x402، ويعطي price_paid السعر بعملة USDC، وtransaction_id هو المرجع الذي تذكره في حال 500.لوكلائك، كل شيء قابل للاستكشاف دون دفع:
ما يجب معرفته قبل التكامل
degraded: true أعد التحققcache_key) والنتيجة، ولا نحتفظ أبدًا بالعنوان نفسه. للتجربة المجانية دون حساب: لا شيء، سوى عدّاد مجهول الهوية يفرض الحد الأقصى. يُقدَّم طلب الحذف باستخدام cache_key.أنشئ حسابًا للحصول على مفتاحك، أو اختبر عنوانًا أولًا دون حساب.