المصادقة
المصادقة
تتم مصادقة كل طلب إلى واجهة تكامل Navvo البرمجية باستخدام مفتاح API. المفاتيح ذات نطاقات، ومحدودة المعدّل، ومرتبطة بمشروع داخل مؤسستك.
إرسال مفتاحك
مرّر المفتاح في كل طلب باستخدام ترويسة x-api-key:
curl "https://navvo.io/api/v1/search?q=pharmacy" \
-H "x-api-key: nvvo_YOUR_KEY"
بالنسبة لعناوين URL التي يجلبها المتصفّح مباشرةً ولا يستطيع إضافة ترويسات إليها — وأهمّها بلاطات الخرائط والأنماط في Navvo Maps — مرّر المفتاح كمعامل استعلام بدلًا من ذلك. يُقبَل كلٌّ من api_key وapiKey:
https://navvo.io/api/v1/tiles/style?style=standard&api_key=nvvo_YOUR_KEY
x-api-key حتى لا ينتهي مفتاحك في السجلّات أو سجلّ المتصفّح.صيغة المفتاح
مفاتيح Navvo مسبوقة ببادئة وسهلة التمييز:
nvvo_<48 hex characters>
تُخزَّن تجزئة المفتاح فقط على الخادم، إلى جانب الأحرف الأربعة الأخيرة (للعرض). يُعاد النص الصريح مرّة واحدة فقط، عند إنشاء المفتاح.
النطاقات
يحمل كل مفتاح مجموعة من النطاقات. ينجح الطلب إلى نقطة نهاية ذات نطاق فقط إذا منح المفتاح ذلك النطاق. توجد أحد عشر نطاقاً:
| النطاق | يمنح الوصول إلى | مفعّل افتراضيًا؟ |
|---|---|---|
search | البحث | ✅ |
geocode | الترميز الجغرافي (شاملاً الجملة) | ✅ |
places | الأماكن — التفاصيل، الساعات، الصور، المراجعات، التصنيفات، المهام | ✅ |
routing | التوجيه، المصفوفة، الأيزوكرون، التنقّل والمسارات | ✅ |
traffic | حركة المرور والحوادث | ✅ |
telemetry | القياسات | ✅ |
tiles | بلاطات الخرائط وبيانات الخريطة | ✅ |
imagery | الصور | ✅ |
geo | الأسيجة الجغرافية والعنونة / Plus Codes | ❌ (اشتراك اختياري) |
insights | تجميعات رؤى Navvo الآمنة للخصوصية | ❌ (اشتراك اختياري) |
optimize | تحسين المسارات (OR-Tools) | ❌ (اشتراك اختياري) |
تُنشأ المفاتيح الجديدة مع تفعيل ثمانية من الأحد عشر نطاقاً. والنطاقات geo وinsights وoptimize معطّلة افتراضيًا — اطلبها صراحةً إذا كنت بحاجة إلى الأسيجة الجغرافية أو التحليلات أو التحسين.
القائمة الحيّة المرجعية متاحة أيضاً للمطوّرين المُسجَّلين عبر GET /developer/scopes (كل نطاق بتسمية ووصف).
الحصول على مفتاح
أسرع طريقة للحصول على مفتاح هي بوابة المطوّرين على navvo.io/developer — وحدة تحكّم بالنقر لإدارة المؤسسات والمشاريع والمفاتيح ومراقبة الاستخدام الحيّ وتجربة الطلبات في بيئة اختبار. كل ما يلي متاح أيضًا كواجهة REST إذا فضّلت أتمتته.
تُنشأ مفاتيح API عبر نقاط نهاية بوابة المطوّرين، وهي محميّة برمز جلسة المستخدم (رمز JWT، وليس مفتاح API). التدفّق هو: حساب ← مؤسسة ← مشروع ← مفتاح. كل مؤسسة ومشروع ومفتاح مرتبط بالمستخدم الذي أنشأه — فأنت لا ترى وتدير إلا ما يخصّك.
1. أنشئ حسابًا / سجّل الدخول
curl -X POST "https://navvo.io/api/v1/auth/register" \
-H "Content-Type: application/json" \
-d '{
"email": "you@example.com",
"name": "Your Name",
"password": "a-strong-password-min-10-chars"
}'
curl -X POST "https://navvo.io/api/v1/auth/login" \
-H "Content-Type: application/json" \
-d '{
"email": "you@example.com",
"password": "a-strong-password-min-10-chars"
}'
يعيد كلاهما accessToken (رمز JWT من نوع Bearer) إضافةً إلى المستخدم والجلسة الخاصّين بك:
{
"user": { "id": "uuid", "email": "you@example.com", "name": "Your Name", "roles": ["user"] },
"sessionId": "uuid",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
أرسل هذا الرمز بصيغة Authorization: Bearer <accessToken> في جميع طلبات /developer/* و/auth/me.
developer (أو admin/super_admin). الحساب المُسجَّل حديثًا يملك دور user فقط — تواصل مع Navvo لمنح دور المطوّر لحسابك.2. أنشئ مؤسسة
curl -X POST "https://navvo.io/api/v1/developer/organizations" \
-H "Authorization: Bearer <accessToken>" \
-H "Content-Type: application/json" \
-d '{ "name": "Acme Logistics", "slug": "acme-logistics" }'
3. أنشئ مشروعًا
curl -X POST "https://navvo.io/api/v1/developer/organizations/<orgId>/projects" \
-H "Authorization: Bearer <accessToken>" \
-H "Content-Type: application/json" \
-d '{ "name": "Driver App" }'
4. أنشئ مفتاح API
curl -X POST "https://navvo.io/api/v1/developer/api-keys" \
-H "Authorization: Bearer <accessToken>" \
-H "Content-Type: application/json" \
-d '{
"projectId": "<projectId>",
"label": "Driver App – production",
"plan": "startup",
"scopes": { "geo": true }
}'
تحتوي الاستجابة على مفتاحك في الحقل key — هذه هي المرة الوحيدة التي يُعرَض فيها:
{
"key": "nvvo_3f9c2a1e8b7d6c5f4a3e2d1c0b9a8f7e6d5c4b3a2f1e0d9c8b",
"id": "uuid",
"label": "Driver App – production",
"lastFour": "9c8b",
"scopes": {
"search": true, "geocode": true, "places": true, "routing": true,
"traffic": true, "telemetry": true, "tiles": true, "imagery": true, "geo": true
},
"plan": "startup",
"quotaPerMinute": 180,
"quotaPerDay": 2500,
"active": true
}
جسم الطلب — POST /developer/api-keys
free، startup، growth، enterprise. القيمة الافتراضية free.{ scope: boolean } تُدمَج فوق القيم الافتراضية. مرّر { "geo": true } لتفعيل النطاق الاختياري، أو { "telemetry": false } لتعطيل أحدها.180.2500.إدارة المفاتيح
تتطلّب كل هذه النقاط رمز الجلسة Authorization: Bearer <accessToken> وهي مرتبطة بحسابك.
| الطريقة | المسار | الغرض |
|---|---|---|
GET | /developer/overview | فهرس المنتجات والخطط وحدود المعدّل. |
GET | /developer/scopes | فهرس النطاقات المرجعي (التسمية والوصف والقيم الافتراضية). |
GET | /developer/summary | أعدادك (المؤسسات، المشاريع، المفاتيح، المفاتيح المفعّلة) وطلبات اليوم. |
GET | /developer/organizations | عرض مؤسساتك. |
POST | /developer/organizations | إنشاء مؤسسة (الجسم: name؛ وslug اختياري يُولَّد تلقائيًا). |
PATCH | /developer/organizations/:id | إعادة تسمية مؤسسة. |
DELETE | /developer/organizations/:id | حذف مؤسسة (يشمل مشاريعها ومفاتيحها). |
GET | /developer/projects?organizationId=… | عرض المشاريع. |
POST | /developer/organizations/:id/projects | إنشاء مشروع داخل مؤسسة (الجسم: name). |
POST | /developer/projects | إنشاء مشروع (الصيغة المسطّحة — الجسم: name, organizationId). |
PATCH | /developer/projects/:id | إعادة تسمية مشروع. |
DELETE | /developer/projects/:id | حذف مشروع (يشمل مفاتيحه). |
GET | /developer/api-keys?projectId=… | عرض المفاتيح. يُظهر lastFour وscopes وplan والحصص وactive والاستخدام الحيّ — ولا يُظهر النص الصريح أبدًا. |
POST | /developer/api-keys | إصدار مفتاح (راجع الحصول على مفتاح). يعيد النص الصريح مرّة واحدة. |
GET | /developer/api-keys/:id/usage | الاستخدام الحيّ للمفتاح: الطلبات في هذه الدقيقة / اليوم مقابل الحصّة. |
PATCH | /developer/api-keys/:id | تحديث label أو plan أو scopes أو quotaPerMinute أو quotaPerDay أو active. تُدمَج تغييرات النطاقات فوق نطاقات المفتاح الحالية. |
POST | /developer/api-keys/:id/rotate | توليد سرّ جديد وإبطال القديم. يعيد النص الصريح الجديد مرّة واحدة. |
DELETE | /developer/api-keys/:id | حذف مفتاح نهائيًا. |
POST | /developer/sandbox | تشغيل طلب اختبار للقراءة فقط بهويّة أحد مفاتيحك من جهة الخادم (الجسم: apiKeyId, path, method? GET|POST, body?). يشغّل بيئة الاختبار في البوابة. |
التعطيل مقابل الحذف
لإيقاف مفتاح مؤقتًا (وإعادة تشغيله)، اضبط active:
curl -X PATCH "https://navvo.io/api/v1/developer/api-keys/<keyId>" \
-H "Authorization: Bearer <accessToken>" \
-H "Content-Type: application/json" \
-d '{ "active": false }'
يُرفَض المفتاح غير المفعّل بالرمز 403 Forbidden حتى تعيد تفعيله. أما DELETE فيزيل المفتاح نهائيًا.
تدوير مفتاح
إذا تسرّب مفتاح أو فُقِد، فقم بتدويره — يولّد ذلك سرًّا جديدًا تمامًا ويُبطِل السابق فورًا، مع الإبقاء على نفس معرّف المفتاح ونطاقاته وحصصه:
curl -X POST "https://navvo.io/api/v1/developer/api-keys/<keyId>/rotate" \
-H "Authorization: Bearer <accessToken>"
تتضمّن الاستجابة key الجديد بنصّه الصريح — ومرّةً أخرى، يُعرَض مرّة واحدة فقط. انشر السرّ الجديد في تطبيقاتك؛ يتوقّف القديم عن العمل فورًا.
الأخطاء
| الحالة | المعنى |
|---|---|
401 Unauthorized | لم يُقدَّم أي مفتاح حيث يكون مطلوبًا، أو المفتاح المُرسَل غير معروف أو ملغى. |
403 Forbidden | المفتاح يفتقد النطاق المطلوب، أو تم تجاوز حصّة/حدّ معدّل. |
401 على كل نقطة نهاية. لذا يسري التدوير أو التعطيل من بوابة المطورين فورًا.راجع الأخطاء لأجسام الاستجابات وحدود المعدّل لتفاصيل الحصص.