← كل الوصفاتوصفة 02
اقرأ ترويسات الائتمان: دقِّق كل خصم من الاستجابة
ما ستبنيه: غلافًا رفيعًا للعميل يسجل تكلفة كل استدعاء وما تبقى لديك، فتصبح سجلاتك أنت مسار التدقيق المحاسبي.
| القسم | أساسيات الواجهة |
|---|---|
| الإجراءات المستخدمة | POST /v1/data/contacts/verify-email |
| الائتمانات | 1 (أسوأ الحالات) |
| آمن مع مفتاح الاختبار | نعم — يعمل على qk_test_ بصفر ائتمان |
| مدة الإنجاز | ~5 دقيقة |
| المتطلبات | مفتاح، وأي عميل HTTP يتيح لك قراءة ترويسات الاستجابة. |
ثلاث ترويسات على كل استدعاء بيانات
X-Credits-Charged هو ما كلفه هذا الاستدعاء. X-Credits-Balance هو المتبقي بعده. X-Price-Book يحدد دفتر الأسعار الذي احتُسب الخصم وفقه، فيمكن دائمًا تتبع عرض سعر وخصم إلى القواعد نفسها.
headers.sh
curl -i -X POST https://api.qannasapi.com/v1/data/contacts/verify-email \
-H "Authorization: Bearer $QANNAS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "jane@acme.example"}'
# < HTTP/1.1 200 OK
# < X-Credits-Charged: 1 # what this call cost
# < X-Credits-Balance: 94 # what is left afterwards
# < X-Price-Book: public # which rules were appliedسجِّل الخصم لا التقدير
لُفَّ عميل HTTP مرة واحدة وسجِّل الترويسات الثلاث بجانب request_id. يمنحك ذلك نسب التكلفة لكل استدعاء دون استقصاء نقطة استخدام، و request_id هو ما سيطلبه الدعم إن بدا خصم ما خاطئًا.
metered_client.ts
export async function call(action: string, body: unknown) {
const res = await fetch(`${API}/v1/data/${action}`, {
method: "POST",
headers: { Authorization: `Bearer ${key}`, "Content-Type": "application/json" },
body: JSON.stringify(body),
});
const json = await res.json();
// Your logs become the billing audit trail.
logger.info("qannas.call", {
action,
request_id: json.request_id,
charged: Number(res.headers.get("X-Credits-Charged")),
balance: Number(res.headers.get("X-Credits-Balance")),
});
return json;
}راقب الرصيد لا الساعة
لأن الرصيد يعود مع كل استدعاء، يمكنك التحكم في المعدل أو التنبيه من الاستجابة التي بين يديك. لا توجد نقطة حصة منفصلة تستقصيها ولا فجوة بين الإنفاق ومعرفته.
throttle.ts
// The balance arrives on the call you already made —
// there is no quota endpoint to poll and no lag.
const balance = Number(res.headers.get("X-Credits-Balance"));
if (balance < LOW_WATER_MARK) {
pauseNonUrgentJobs();
alertOps(`credits low: ${balance}`);
}الخلاصة
| النمط | الطريقة |
|---|---|
| تكلفة هذا الاستدعاء | X-Credits-Charged |
| المتبقي | X-Credits-Balance |
| القواعد المطبَّقة | X-Price-Book |
| تتبُّع خصم | request_id في جسم الاستجابة |
| التحكم في المعدل | نبِّه على X-Credits-Balance من الاستدعاء الذي نفَّذته للتو |
قائمة التحقق قبل الإنتاج
- سجِّل X-Credits-Charged و X-Credits-Balance و request_id في كل استدعاء.
- نبِّه على ترويسة الرصيد بدل استقصاء نقطة استخدام.
- احتفظ بـ request_id — به يُتتبَّع أي خصم بعينه.
- توقَّع X-Credits-Charged: 0 عند عدم العثور ولا تعدّه فشلًا.
الخطوات التالية
شغِّل التقدير أولًا. لا يكلف شيئًا، وهو الحساب نفسه الذي سيطبقه العدّاد.