دليل تنفيذ مكتوب وفق سلوك الـ API الموثَّق؛ ولا يذكر اسم أي عميل. نُشر في .
المشكلة: السجل يذكر سيارة لا يراها أحد
يُعرّف نموذج عرض السعر وسجل الوثيقة والإخطار الأول بالخسارة المركبةَ بالطريقة نفسها: برقم VIN الخاص بها، الذي يكتبه العميل أو يُقرأ من وثيقة التسجيل. وكل ما يراه الشخص بعد ذلك عن السيارة هو نص: سنة الصنع والشركة المصنّعة والطراز وربما الفئة. وطرح سؤال "هل هذه مركبتك؟" بجانب سطر من النص يدفع إلى الإجابة بنعم على أي شيء.
صورة الطراز الذي يُفك إليه رمز VIN تتيح للعميل ومقيّم الأضرار التحقق بنظرة سريعة من أن السجل يذكر النوع الصحيح من السيارات. لكنها لا تستطيع أن تُظهر السيارة بعينها: فالصورة رسم استوديو لشركة مصنّعة وطراز وسنة من الكتالوج، ولا تصوّر أي مركبة مادية بعينها. هذه الحقيقة وحدها تحدد شكل التكامل كله أدناه.
كيف يبدو التكامل
- فك الترميز عند الاستلام. يفك مسار عروض الأسعار أو نظام الوثائق ترميز رقم VIN مرة واحدة مجانًا، ويخزّن معرّف المركبة من الكتالوج مع الوثيقة. وترث المطالبات المفتوحة على الوثيقة هذا المعرّف.
- زاوية واحدة في كل مكان.
front-3-4، زاوية العرض الرئيسية، في إطار واحد على شاشة عرض السعر، ومنصة معالجة المطالبات، وملف PDF لعرض السعر، وبوابة الوثائق، بحيث تعرض كل شاشة الطراز بالطريقة نفسها. - عناوين URL موقّعة، لا المفتاح أبدًا. تحمّل المتصفحات ومولّدات PDF عناوين URL خالية من المفاتيح يُنشئها خادمك.
- كلمات لما لا تستطيع الصورة قوله. تبقى الفئة والتجهيزات الإضافية واللون المسجَّل والأضرار والمسافة المقطوعة نصًا وصورًا فوتوغرافية، وتوضّح الصورة أنها تمثيلية.
الخطوة 1: فك ترميز رقم VIN مجانًا
GET /api/v1/vin/{vin} مجاني ويتطلب مفتاحًا بصلاحية images:read. يُرجع الحقول المفكوكة من بيانات vPIC التابعة لـ NHTSA (السنة، والعلامة التجارية، والطراز، وفئة التجهيز، والسلسلة، وفئة الهيكل، والمحرك، وكل سمة أخرى يعرفها vPIC)، وعندما يتضمن الكتالوج المركبة، كائن vehicle بمعرّفه الثابت وimage_path جاهزًا.
curl --fail-with-body \
-H "Authorization: Bearer $CAR_IMAGE_API_KEY" \
"https://carimage.dev/api/v1/vin/WP0AA2A96RS201834"{
"data": {
"vin": "WP0AA2A96RS201834",
"valid": true,
"errors": [],
"suggested_vin": null,
"year": 2024,
"make": "Porsche",
"model": "911",
"trim": "Carrera, Carrera T, Carrera 4",
"series": "Type 992",
"body_class": "Coupe",
"vehicle": {
"id": "veh_78qtwrgh37bkr",
"make": "Porsche",
"model": "911",
"year": 2024,
"image_path": "/api/v1/images/car?vehicle=veh_78qtwrgh37bkr"
},
"source": "vpic-db"
}
}اقرأوا قيمة trim: "Carrera, Carrera T, Carrera 4". يغطي نمط رقم VIN هذا ثلاث فئات، لذا لا يستطيع حتى فك الترميز تحديد الفئة التي تؤمّنها الوثيقة، ومن المؤكد أن صورة 911 موديل 2024 لا تستطيع ذلك. اطلبوا من العميل تأكيد الفئة، واحتفظوا بها نصًا مع series وbody_class، ودعوا الصورة تعرض الطراز.
- رقم VIN الذي يحتوي على رقم تحقق خاطئ يظل قابلًا لفك الرمز، مع
valid: falseووصف المشكلة فيerrors؛ ويحددsuggested_vinبعلامة!الحرف الذي يعتقد vPIC أنه خاطئ، وهذا ما ينبغي عرضه للشخص الذي يكتب الرقم. - يمكن للنموذج الذي لا يتوفر فيه إلا الأحرف الأولى إرسال رقم VIN جزئي: خمسة أحرف على الأقل، مع
*لكل موضع غير معروف، وyearاختياريًا. - يعني
404أن vPIC لا يملك سجلًا لهذا النمط. يغطي vPIC المركبات المصنوعة للسوق الأمريكية، لذا ابدؤوا في الأسواق الأخرى من العلامة التجارية والطراز باستخدامPOST /api/v1/images/resolve، وهو مجاني أيضًا.
الخطوة 2: احتفظ بمعرّف المركبة في وثيقة التأمين وفي المطالبة
خزّنوا data.vehicle.id في وثيقة التأمين كسلسلة نصية عادية وانسخوه إلى كل مطالبة تُفتح بموجبها. المعرّف حتمي ودائم: للمركبة نفسها المعرّف نفسه في كل عملية نشر وبعد كل إصدار للكتالوج، لذا يمكن استخدامه بأمان كمفتاح خارجي، وكل طلب لاحق يحدد vehicle=veh_78qtwrgh37bkr بدلاً من كتابة العلامة التجارية والطراز.
عندما تكون قيمة data.vehicle هي null فهذا يعني أن الشركة المصنّعة والطراز اللذين فُكّ ترميزهما غير موجودين في الكتالوج، كما في المقطورات وبعض هياكل المركبات التجارية. ويظل بإمكانكم عرض الحقول التي فُكّ ترميزها. اعرضوها دون صورة، ولا تضعوا أبدًا سيارة مشابهة مكانها.
الخطوة 3: زاوية عرض واحدة في ملف المطالبة وملف PDF لعرض السعر
شاشة عرض الأسعار ومنصة عمل المطالبات وبوابة الوثائق هي تطبيقات متصفح، لذا يُنشئ خادمكم عناوين URL موقّعة باستخدام POST /api/v1/image-urls: 1 رصيد لكل عنوان عند إنشائه، وحتى 50 في كل استدعاء، وتحميله مجاني حتى انتهاء صلاحيته. أطّروا الصورة مرة واحدة وأعيدوا استخدام الشكل نفسه: front-3-4 في إطار 640×400 مع fit: "contain"، وtrim مع قليل من padding حتى تملأ سيارة كوبيه وشاحنة بيك أب الإطار بالطريقة نفسها. وتعتمد مدة صلاحية كل عنوان على مكان عرضه:
- منصة عمل المطالبات. أنشئوا العنوان عند عرض الشاشة. تغطي مدة الصلاحية الافتراضية البالغة 1 ساعة جلسة عمل كاملة، والمطالبة التي يُعاد فتحها غدًا تحصل على عنوان URL جديد.
- ملف PDF لعرض السعر. عند إنشاء ملف PDF من HTML، يحمّل محرّك العرض الصورة مرة واحدة ويضمّنها، لذا تكفي مدة الصلاحية الافتراضية، ولا تحتفظ خدمة PDF بمفتاحكم أبدًا.
format: "jpg"يدمج الصورة على خلفية بيضاء، وهو ما يناسب المستندات. - بوابة الوثائق وبريد التجديد. يتجاوز عمر هذين أي مدة صلاحية، لذا أصدِر العنوان باستخدام
renew: trueوttl_seconds: 604800(7 أيام). يظل عنوان URL صالحًا، وكل أسبوع إضافي يُفتح فيه يكلّف 1 وحدة رصيد، أماrenew_days: 365، وهي أطول مدة مسموح بها، فتغطي وثيقة تأمين مدتها سنة كاملة.
حدّد للمفتاح الذي يُنشئ عناوين URL قائمة بالمصادر المسموح بها من لوحة التحكم: عنوان URL المحمّل من موقع آخر يُرجع 403 مع origin_not_allowed، بينما تظل برامج البريد الإلكتروني وعارضات PDF، التي لا ترسل Referer، قادرة على تحميله. إلغاء المفتاح يُنهي كل عناوين URL التي أنشأها.
import { CarImageClient, type ImageParams } from "@meterapp/car-image-sdk";
const client = new CarImageClient({ apiKey: process.env.CAR_IMAGE_API_KEY });
// Quote or policy intake: the VIN in, the vehicle id and the decoded words on the record. Free.
const { data: decoded } = await client.decodeVin(policy.vin);
policy.vehicleId = decoded.vehicle?.id ?? null; // null: show the decoded text and no picture
policy.trimText = decoded.trim; // "Carrera, Carrera T, Carrera 4": words, never the picture
if (policy.vehicleId) {
// One view, framed once, for every screen and document that shows this policy's car.
const view: ImageParams = {
vehicle: policy.vehicleId, view: "front-3-4", color: policy.paintHex ?? "silver",
width: 640, height: 400, fit: "contain", trim: true, padding: 6,
};
// The claims workbench: a URL for this session, minted when the screen draws.
const { data: [workbench] } = await client.createImageUrls({ ...view, format: "auto" });
// The quote PDF: the HTML-to-PDF renderer loads the URL once and embeds the picture.
const { data: [pdf] } = await client.createImageUrls({ ...view, format: "jpg" });
// The policy portal and the renewal email: one URL that keeps working for the term.
const { data: [portal] } = await client.createImageUrls(
{ ...view, format: "auto" },
{ ttlSeconds: 604800, renew: true, renewDays: 365, idempotencyKey: `policy:${policy.id}:image` }
);
}الخطوة 4: وسمها على أنها الطراز، لا السيارة المؤمَّن عليها أبدًا
ضع التسمية حيث توجد الصورة، لا في حاشية فقط: في النص البديل وفي تعليق أسفل الصورة. تُظهر الصورة المولَّدة الشركة المصنّعة والطراز والسنة بلون طلاء تختاره، ويمكن أن يتبع color اللون المذكور في الوثيقة (اسم لون مُعدّ مسبقًا أو أي قيمة hex). ومع ذلك تظل الصورة للطراز بذلك الطلاء، لا لسيارة العميل.
<figure>
<img src="https://carimage.dev/api/v1/delivery/eyJhbGciOi…" width="640" height="400"
alt="Representative image of a 2024 Porsche 911, not a photo of the insured vehicle">
<figcaption>
2024 Porsche 911 · Coupe · Type 992 · trim on the VIN: Carrera, Carrera T or Carrera 4
<small>Representative image of the model. Not a photo of the insured vehicle.</small>
</figcaption>
</figure>التكلفة، والخطة المناسبة
- مجانًا: فك رمز VIN، وresolve، وعمليات البحث في الكتالوج، وكل تحميل لعنوان URL موقّع خلال مدة صلاحيته.
- 1 رصيد: عن كل صورة تُسلَّم إلى خادمكم أو كل URL يُنشأ، وعن كل أسبوع إضافي يُفتح فيه URL متجدد.
- المركبات المختلفة: يمرّ مسار عروض الأسعار بمركبات كثيرة مختلفة، وتضع كل خطة حدًا أقصى لعدد المركبات المختلفة شهريًا: Free 100، Pro 2,500 وBusiness 15,000؛ لا حدّ أقصى في Enterprise. المركبة التي خُدمت هذا الشهر مسموح بها دائمًا، والطلب الذي يتجاوز الحد يُرفض قبل خصم أي شيء، لذا اختر الخطة بحسب عدد المركبات التي تقدّم لها عروض أسعار، لا بحسب الأرصدة.
في الخطة المدفوعة، يغطي الترخيص الصورة المولَّدة ضمن ما ينتجه منتجك لمستخدميه، بما في ذلك عرض السعر أو التقرير، طوال فترة نشاط الخطة؛ والتفاصيل متوفرة في الترخيص.
CLI وSDK وMCP
# decode for free and keep the id
npx @meterapp/car-image vin WP0AA2A96RS201834 --json | jq -r .data.vehicle.id
# one renewing URL for the policy's documents, minted once however often intake retries
npx @meterapp/car-image url --vehicle veh_78qtwrgh37bkr --view front-3-4 --width 640 --height 400 \
--fit contain --trim --padding 6 --format auto --ttl 604800 --renew --renew-days 365 \
--idempotency-key policy-88213-image- SDK:
client.decodeVin(vin, { year? })وclient.createImageUrls(…)، كما في الأعلى؛ وclient.resolve(query)لمركبة بلا رقم VIN. - MCP: الأداتان
decode_vinوcreate_car_image_urlsضمن مجموعة الأدوات الأساسية، لذا يستطيع المساعد الذي تتوفر لديه المطالبة في سياقه الإجابة عن "أرني الطراز المؤمَّن عليه" من رقم VIN المسجّل. تجدون خطوات الإعداد في صفحة MCP.
الأسئلة الشائعة
- هل يمكن أن تحلّ الصورة محل صور المركبة المؤمَّن عليها؟
- لا. إنها صورة استوديو مُولَّدة للعلامة التجارية والطراز وسنة الصنع كما في الكتالوج، وليست صورة فوتوغرافية، ولا تمثّل أي مركبة بعينها. تساعد العميل أو مقيّم الأضرار على التأكد من أن السجل يذكر نوع السيارة الصحيح. أما الحالة والأضرار والفئة والخيارات والتعديلات فتُستمد من الصور والفحوصات والنص المفكوك ترميزه، ويجب أن تُوضَّح الصورة على أنها تمثيلية.
- كم تكلّف إضافة صورة إلى كل عرض سعر؟
- فك ترميز VIN مجاني. تكلّف الصورة 1 رصيد عند إنشاء عنوان URL الموقّع الخاص بها، أو عند تسليم بياناتها إلى خادمكم؛ وتحميل عنوان URL موقّع مجاني حتى انتهاء صلاحيته. ويُضاف إلى تكلفة عنوان URL المتجدد 1 رصيد عن كل أسبوع يُفتح فيه، ولا شيء عن الأسابيع التي لا يطّلع فيها أحد عليه.
- يُفك ترميز VIN لكن قيمة vehicle هي null. ماذا بعد؟
- تعرّفت أداة فك الترميز على المركبة، لكن الكتالوج لا يحتوي على إدخال لتلك الشركة المصنّعة والطراز والسنة، وهو ما يحدث مع المقطورات وبعض هياكل المركبات التجارية. اعرض الحقول المفكوكة دون صورة، ولا تستبدلها أبدًا بسيارة مشابهة. ابحث في الكتالوج تحسّبًا لاختلاف التهجئة، وإذا كانت مفقودة فعلًا، فاطلبها عبر لوحة الطلبات العامة.
- هل يعمل فك ترميز VIN مع المركبات من خارج السوق الأمريكية؟
- يعتمد فك الرمز على بيانات vPIC من NHTSA، التي تغطي المركبات المصنوعة للسوق الأمريكية، لذا قد يُرجع رقم VIN مكتوب بشكل صحيح من سوق أخرى الخطأ 404 أو يُفك رمزه دون طراز. ابحثوا عن تلك السيارة بالعلامة التجارية والطراز والسنة عبر نقطة النهاية المجانية resolve بدلًا من ذلك؛ فالكتالوج نفسه يغطي طرازات الأسواق الأخرى.
- إلى متى يمكن لملف المطالبة الاحتفاظ بالصورة؟
- ما دام الملف موجودًا. في الخطة المدفوعة يشمل الترخيص الصورة المولَّدة ضمن ما ينتجه منتجك، بما في ذلك عروض الأسعار والتقارير، وتحتفظ الصورة المسلَّمة خلال الخطة بهذا الترخيص بعد انتهاء الخطة، بما في ذلك المستندات المخزّنة. كما يمكن تحسين الصور بمرور الوقت، لذا ينبغي للسجل الذي يجب أن يحتفظ بما رآه العميل تمامًا أن يخزّن الملف لا عنوان URL.