Navvo
مرجع الواجهة البرمجية

الأماكن

قوائم الأماكن وتفاصيل غنية عن المكان — الفئات وساعات العمل والصور والتقييمات وإرشادات الوصول.

الأماكن

اعرض قوائم الأماكن واجلب تفاصيل غنية لمكان واحد، بما في ذلك المراجعات والصور والأسئلة والأجوبة وذكاء الوصول (المدخل المُوصى به وإرشادات آخر 50 متراً).

النطاق المطلوب: places

صيغة الهندسة. حقل center لمكان وlocation لكل مدخل هي سلاسل WKT بصيغة POINT(<lng> <lat>)خط الطول أولاً. داخل arrivalIntelligence، تُعاد الإحداثيات المُحلَّلة على شكل كائنات { "lng": …, "lat": … }. حقل rating على كائن المكان هو سلسلة نصّية (مثل "4.60")؛ أما في /places/thumb فهو رقم.

GET /places

اعرض قائمة الأماكن، مُرقَّمة بالصفحات، المُموَّل أولاً.

curl -s "https://navvo.io/api/v1/places?q=cafe&page=1&limit=20" \
  -H "x-api-key: nvvo_YOUR_KEY"

معاملات الاستعلام

q
string
مطابقة جزئية غير حساسة لحالة الأحرف مقابل nameEn أو nameAr.
page
number
رقم الصفحة بدءاً من 1. القيمة الافتراضية 1 (الحدّ الأدنى 1).
limit
number
حجم الصفحة. القيمة الافتراضية 50، والحدّ الأقصى 100.
sponsored
boolean
تصفية إلى الأماكن المُموَّلة (أو غير المُموَّلة).
category
string
تصفية إلى تصنيف واحد — يطابق canonicalCategorySlug للمكان أو أي عنصر في مصفوفة categories لديه. اكتشف المعرّفات عبر GET /places/categories. عند ضبطها يعكس total المجموعة المُصفّاة وتُرجِع الاستجابة category.
amenities
string
معرّفات سمات (facet slugs) مفصولة بفواصل (مثل wheelchair-accessible-entrance,free-parking-lot). يُطابَق المكان فقط إذا كانت كل السمات المطلوبة موجودة ومُفعّلة. قد يكون المعرّف خياراً (wi-fi) أو مجموعة كاملة (parking = يملك أي موقف). عند ضبطها يعكس total المجموعة المُصفّاة وتُرجِع الاستجابة مصفوفة amenities المُطبّعة. اكتشف المعرّفات المتاحة عبر GET /places/facets.
openNow
boolean
عند true، تُعاد فقط الأماكن المفتوحة حالياً (أو على وشك الإغلاق)، مُقيَّمةً عبر محرّك ساعات العمل بتوقيت الأردن. وتُستبعَد الأماكن بلا بيانات ساعات. يعكس total المجموعة المُصفّاة وتُرجِع الاستجابة openNow: true. ادمجها مع amenities (مثل "مقاهٍ مفتوحة بها مواقف الآن").
sort
string
ترتيب النتائج: relevance (افتراضي — المُموَّل ثم التقييم ثم الأحدث)، rating (الأعلى تقييماً أولاً)، name (أ→ي)، newest، أو oldest. تُعيد الاستجابة sort المحلول.
minRating
number
فقط الأماكن التي تقييمها هذه القيمة (05). يعكس total المجموعة المُصفّاة وتُرجِع الاستجابة minRating. ادمجها مع بقية المرشّحات — مثل ?minRating=4.5&openNow=true&sort=rating.
near
string
"بالقرب مني" — نقطة بداية lat,lng (مثل 31.9539,35.9106). يُضاف لكل نتيجة distanceKm وتُرتَّب القائمة الأقرب أولاً (وهذا يتجاوز sort). ادمجها مع radiusKm وأي مرشّح.
radiusKm
number
مع near، تُعاد فقط الأماكن ضمن هذا العدد من الكيلومترات. تُعيد الاستجابة near وradiusKm.

الاستجابة

{
  "items": [
    {
      "id": "31c5a4e2-9b1f-4c0a-bb10-2f0c2b8e7a11",
      "slug": "jordan-beans-cafe",
      "nameEn": "Jordan Beans Cafe",
      "nameAr": "مقهى جوردن بينز",
      "logoUrl": "https://navvo.io/uploads/abc123.webp",
      "categories": ["cafe", "food"],
      "canonicalCategorySlug": "cafe",
      "center": "POINT(35.913 31.953)",
      "contact": { "phone": "+962790000000", "website": "https://example.com" },
      "openingHours": { "weekly": { "sunday": "08:00-23:00" } },
      "sponsored": true,
      "claimStatus": "verified",
      "rating": "4.60",
      "entrances": [
        { "id": "a1b2c3d4-…", "type": "main", "label": "Main Entrance", "location": "POINT(35.9131 31.9529)" }
      ]
    }
  ],
  "total": 137,
  "page": 1,
  "limit": 50
}

تتضمّن عناصر القائمة علاقة entrances لكن ليس المراجعات/الصور/الأسئلة. الترتيب دائماً sponsored DESC, rating DESC, createdAt DESC.


GET /places/thumb

صورة مصغّرة خفيفة + حالة مفتوح/مغلق لمكان — مثالية لبطاقات الخريطة.

curl -s "https://navvo.io/api/v1/places/thumb?slug=jordan-beans-cafe" \
  -H "x-api-key: nvvo_YOUR_KEY"

معاملات الاستعلام

slug
string required
معرّف رابط المكان.

الاستجابة

{
  "url": "https://navvo.io/uploads/abc123.webp",
  "source": "logo",
  "rating": 4.6,
  "openState": "open",
  "openText": "Open · until 23:00"
}
الحقلالنوعالوصف
urlstring | nullأفضل صورة — الشعار، وإلا صورة مميّزة، وإلا null.
sourcestring | null"logo" أو "photo" أو null.
ratingnumber | nullالتقييم إذا كان > 0، وإلا null.
openStatestring | null"open" أو "closing" أو "closed" أو null (محسوبة بتوقيت Asia/Amman).
openTextstring | nullحالة قابلة للقراءة البشرية.

يُعيد معرّف الرابط غير المعروف 200 مع كل الحقول null (وليس 404).


GET /places/facets

سمات وسائل الراحة المتاحة عبر الأماكن — مُجمَّعة (إمكانية الوصول، المواقف، المدفوعات، وسائل الراحة، خيارات الخدمة، …) مع عدّاد لكل خيار. استخدمها لبناء واجهة "تصفية حسب السمة"، ثم مرّر المعرّفات المختارة إلى GET /places?amenities=. تُحتسب الخيارات المُفعّلة فقط.

الاستعلامالنوعملاحظات
qstringاختياري — يضيّق العدّادات على الأماكن التي يطابق اسمها
curl -s "https://navvo.io/api/v1/places/facets" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "scanned": 735,
  "capped": false,
  "groups": [
    { "id": "accessibility", "name": "Accessibility", "total": 201, "options": [
      { "slug": "wheelchair-accessible-entrance", "label": "Wheelchair-accessible entrance", "count": 72 },
      { "slug": "wheelchair-accessible-car-park", "label": "Wheelchair-accessible car park", "count": 63 }
    ]},
    { "id": "parking", "name": "Parking", "total": 90, "options": [
      { "slug": "free-parking-lot", "label": "Free parking lot", "count": 27 }
    ]}
  ]
}
الحقلالنوعملاحظات
scannednumberعدد الأماكن المفحوصة
cappedbooleantrue إذا بلغ الفحص الحدّ الأقصى (توجد أماكن أكثر مما جُمِّع)
groups[].id / namestringمجموعة السمة (مثل accessibility)
groups[].totalnumberإجمالي الخيارات المُفعّلة المحتسبة في المجموعة
groups[].options[]array{ slug, label, count } مرتّبة حسب العدد — الـ slug هو ما تمرّره إلى ?amenities=

GET /places/categories

شجرة التصنيفات الكاملة — تسلسل هرمي (أب → أبناء) مع اسم العرض والأيقونة واللون وأعداد الأماكن لكل تصنيف (placeCount = مباشرةً في هذا التصنيف، وtotalPlaces = مُجمَّعاً عبر شجرته الفرعية). استخدمها لبناء واجهة تصفّح/تصفية للتصنيفات؛ وslug أي تصنيف هو ما يحمله المكان في canonicalCategorySlug.

curl -s "https://navvo.io/api/v1/places/categories" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "provider": "navvo-places", "count": 500, "rootCount": 38,
  "categories": [
    { "slug": "restaurants", "nameEn": "Restaurants", "nameAr": "مطاعم",
      "iconName": "restaurant", "color": "#386BFF",
      "placeCount": 9, "totalPlaces": 9, "children": [] },
    { "slug": "automotive", "nameEn": "Automotive", "placeCount": 0, "totalPlaces": 0,
      "children": [ { "slug": "car-rental", "nameEn": "Car Rental", "placeCount": 0, "totalPlaces": 0, "children": [] } ] }
  ]
}
الحقلالنوعملاحظات
countnumberإجمالي التصنيفات في الشجرة
rootCountnumberعدد التصنيفات العليا
categories[]arrayالعُقد العليا، كلٌّ منها تكراري بـ children
…placeCountnumberالأماكن المُسنَدة مباشرةً لهذا التصنيف
…totalPlacesnumberالعدد المُجمَّع شاملاً كل التصنيفات الفرعية

POST /places/reachable

"ما الذي يمكن الوصول إليه" — كل مكان يمكنك بلوغه من نقطة بدء ضمن ميزانية زمن سير. يحسب Navvo الأيزوكرون (مضلّع إمكانية الوصول) للزمن/الوسيلة، ثم يعيد الأماكن التي تقع داخله — لا ضمن دائرة فحسب، فيحترم شبكة الطرق والممرات الفعلية. وتُطبَّق مرشّحات الاسم/التصنيف/السمات فوق ذلك.

الحقلالنوعملاحظات
origin{lat,lng}مطلوب — من أين تبدأ
minutesnumberميزانية زمن السير (افتراضي 15؛ أقصى 60)
costingstringوسيلة التنقّل: pedestrian (افتراضي)، auto، bicycle
qstringمرشّح اسم اختياري
categoriesstringكلمات تصنيف مفصولة بفواصل (اختياري)
amenitiesstringمعرّفات سمات مفصولة بفواصل (مطلوبة كلّها، مُفعّلة)
limitnumberأقصى نتائج (افتراضي 100؛ أقصى 500)
curl -s -X POST "https://navvo.io/api/v1/places/reachable" \
  -H "x-api-key: $NAVVO_API_KEY" -H "content-type: application/json" \
  -d '{ "origin": {"lat":31.9539,"lng":35.9106}, "minutes": 15, "costing": "pedestrian", "categories": ["cafe"] }'
{
  "provider": "navvo-places", "available": true,
  "origin": { "lat": 31.9539, "lng": 35.9106 }, "minutes": 15, "costing": "pedestrian",
  "candidatesInBbox": 12, "count": 9,
  "reachable": [
    { "id": "", "slug": "", "name": "", "category": "cafe", "rating": 4.6, "lat": 31.95, "lng": 35.91 }
  ],
  "isochrone": { "type": "Polygon", "coordinates": [ /* … */ ] }
}

count هو عدد الأماكن الموجودة فعلاً داخل مضلّع إمكانية الوصول (candidatesInBbox هو المرشّح الأوسع بالصندوق المحيط — وcount ≤ منه). ويُعاد isochrone بصيغة GeoJSON لترسم منطقة الوصول على الخريطة.


GET /places/{slug}

تفاصيل المكان الكاملة: المراجعات والصور المعتمدة، والأسئلة والأجوبة، وarrivalIntelligence.

curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe" \
  -H "x-api-key: nvvo_YOUR_KEY"

معاملات المسار

slug
string required
معرّف رابط المكان الفريد.

الاستجابة

بالإضافة إلى كل الحقول من عنصر القائمة، تتضمّن استجابة التفاصيل:

الحقلالنوعالوصف
reviews[]arrayالمراجعات المعتمدة (rating، body، userId، …).
photos[]arrayالصور النشطة المعتمدة (url، caption، featured، …).
questions[]arrayالأسئلة مع answers[] المتداخلة.
reportsarrayدائماً [] (لا تُكشف أبداً).
arrivalIntelligenceobjectالمدخل المُوصى به وإرشادات آخر 50 متراً (انظر أدناه).
{
  "slug": "jordan-beans-cafe",
  "nameEn": "Jordan Beans Cafe",
  "center": "POINT(35.913 31.953)",
  "rating": "4.60",
  "entrances": [ { "id": "a1b2c3d4-…", "type": "main", "location": "POINT(35.9131 31.9529)" } ],
  "reviews": [ { "id": "r1…", "rating": 5, "body": "Great coffee.", "status": "approved" } ],
  "photos": [ { "id": "p1…", "url": "https://navvo.io/uploads/photo1.webp", "featured": true } ],
  "questions": [
    { "id": "q1…", "question": "Is there parking?", "status": "answered",
      "answers": [ { "id": "ans1…", "answer": "Yes, in the rear lot.", "ownerVerified": true } ] }
  ],
  "reports": [],
  "arrivalIntelligence": {
    "version": "navvo-arrival-v1",
    "placeCenter": { "lng": 35.913, "lat": 31.953 },
    "recommendedEntranceId": "a1b2c3d4-…",
    "candidates": [
      {
        "entranceId": "a1b2c3d4-…",
        "type": "main",
        "coordinates": { "lng": 35.9131, "lat": 31.9529 },
        "distanceFromPlaceMeters": 12,
        "score": 99,
        "recommended": true,
        "lastMetersGuidance": "12 meters from the place pin. Use this as the default arrival point for visitors.",
        "routeTarget": { "lat": 31.9529, "lng": 35.9131 }
      }
    ],
    "microMap": { "radiusMeters": 50, "title": "Last 50 meters", "guidance": "" }
  }
}
ذكاء الوصول هو ما يجعل Navvo مفيداً للتوصيل وطلب المركبات. استخدم arrivalIntelligence.candidates[0].routeTarget كإحداثية الوجهة لـ التوجيه بدلاً من مركز المكان — فهو يشير إلى المدخل المُوصى به.

يُعيد معرّف الرابط (أو المعرّف) غير المعروف 404 Not Found.

الأخطاء

الحالةمتى
400تحقّق من الصحة (مثل limit > 100).
401 / 403مفتاح مفقود/غير صالح، أو مفتاح يفتقر إلى النطاق places.

GET /places/{slug}/hours

محرّك ساعات العمل: الجدول الأسبوعي المُطبَّع للمكان، وحالته الحيّة مفتوح/مغلق، والتغيّر التالي للفتح/الإغلاق — كلّها مُقيَّمة بتوقيت الأردن (Asia/Amman) ومراعية للعطل الرسمية.

يقبل Navvo الساعات بصيغتين ويُطبّع كليهما: خريطتنا المنظّمة { "weekly": { "monday": "09:00-17:00", … } }، و نص opening_hours الخام بأسلوب OSM الذي تحمله النقاط المستوردة (مثل "Mo-Fr 09:00-17:00; Sa 10:00-14:00; Su off"، و"24/7"، وفترات الاستراحة مثل "Mo-Fr 08:00-12:00,13:00-18:00"). يعيد المحرّك خريطة weekly قانونية واحدة في كلتا الحالتين.

الاستعلامالنوعملاحظات
atتاريخ-وقت ISOاختياري — قيّم عند لحظة مستقبلية (تخطيط الرحلة)؛ الافتراضي الآن
curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe/hours" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "slug": "jordan-beans-cafe",
  "hasHours": true,
  "at": "2026-06-23T07:30:00.000Z",
  "weekly": {
    "monday": "09:00-17:00", "tuesday": "09:00-17:00", "wednesday": "09:00-17:00",
    "thursday": "09:00-17:00", "friday": "09:00-17:00", "saturday": "10:00-14:00", "sunday": "Closed"
  },
  "openState": "open",
  "openText": "Open · until 17:00",
  "nextChange": { "type": "closes", "dayOffset": 0, "weekday": "tuesday", "atMinutes": 1020, "time": "17:00", "label": "Open · closes 17:00" },
  "holiday": null
}
الحقلالنوعملاحظات
hasHoursbooleanfalse (مع حقول null) عندما لا تتوفّر بيانات ساعات للمكان
weeklyobject | nullالجدول القانوني — لكل يوم قائمة HH:MM-HH:MM مفصولة بفواصل، أو "Closed". و"00:00-24:00" = طوال اليوم
openStatestring | null"open" أو "closing" (≤45 دقيقة على الإغلاق) أو "closed" أو null
openTextstring | nullنص بشري، مثل "Open · until 17:00"، "Closing soon · 17:00"
nextChangeobject | nullالتغيّر التالي خلال 7 أيام: type (opens/closesweekday، time، dayOffset (0 = اليوم، 1 = الغد)، وlabel جاهز
holidayobject | nullعطلة رسمية نشطة (تُحاشى الساعات بـ "… hours may vary"، ولا تُغلَق إغلاقاً قسرياً)
قيمة ?at= في المستقبل تُقيّم الجدول لتلك اللحظة — مفيدة لتخطيط "هل سيكون مفتوحاً عند وصولي؟". تُعالَج النطاقات العابرة لمنتصف الليل (18:00-02:00) وتراكبات رمضان/العطل تلقائياً.

GET /places/{slug}/popular-times

ازدحام المكان بأسلوب Google: الشبكة الأسبوعية ساعةً بساعة، المستوى الحيّ "الآن"، منحنى اليوم مع ذروته، وأهدأ ساعة عمل ("أفضل وقت للزيارة"). كلّها مُقيَّمة بتوقيت الأردن. الازدحام 0–100.

curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe/popular-times" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "slug": "jordan-beans-cafe", "hasData": true, "name": "Jordan Beans Cafe",
  "now": { "day": "Saturday", "hour": 19, "busyness": 50, "label": "A bit busy", "relative": "typical" },
  "today": {
    "day": "Saturday", "peakHour": 10,
    "curve": [18,31,31,43,50,50,43,31,37,43,43,37,31,37,50,75,81,93,75,62,62,43,31,25],
    "bestTimeToVisit": { "hour": 5, "busyness": 25, "label": "Not too busy" }
  },
  "weekly": { "Sunday": [/* 24 قيمة */], "Monday": [/* … */] }
}
الحقلالنوعملاحظات
hasDatabooleanfalse (مع حقول null) عندما لا يوجد ازدحام للمكان
nowobjectbusyness حيّ (0–100) + label بشري + relative (near peak/typical/quieter than usual)
today.curvenumber24الازدحام لكل ساعة 0–23 لليوم؛ وpeakHour أكثر ساعاته ازدحاماً
today.bestTimeToVisitobjectأهدأ ساعة عمل اليوم — { hour, busyness, label }
weeklyobjectمصفوفات ازدحام بـ 24 قيمة لكل يوم (SundaySaturday)

التسميات: Not busy (<25)، Not too busy (<50)، A bit busy (<70)، Busy (<85)، As busy as it gets (≥85).


GET /places/{slug}/attributes

سمات "حول المكان" المنظّمة الكاملة لمكان واحد — كل مجموعة (إمكانية الوصول، المواقف، المدفوعات، خيارات الخدمة، وسائل الراحة، …) مع كل خيار وما إذا كان مُفعّلاً. هذا تفصيل لكل مكان؛ وللسمات على مستوى الكتالوج استخدم GET /places/facets، ولـتصفية الأماكن حسب السمة استخدم ?amenities=.

curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe/attributes" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "slug": "jordan-beans-cafe", "hasData": true, "name": "Jordan Beans Cafe",
  "groupCount": 2, "enabledCount": 4,
  "groups": [
    { "id": "payments", "name": "Payments", "options": [
      { "slug": "credit-cards", "label": "Credit cards", "enabled": true },
      { "slug": "nfc-mobile-payments", "label": "NFC mobile payments", "enabled": true }
    ]},
    { "id": "parking", "name": "Parking", "options": [
      { "slug": "on-site-parking", "label": "On-site parking", "enabled": true }
    ]}
  ]
}
الحقلالنوعملاحظات
hasDatabooleanfalse (مع groups فارغة) عندما لا يملك المكان سمات منظّمة
groups[].id / namestringمجموعة السمة (مثل accessibility)
groups[].options[]array{ slug, label, enabled } — وenabled:false تعني أن المكان يفتقر صراحةً لتلك الميزة (مثل "مدخل لذوي الكراسي المتحركة: لا")
enabledCountnumberإجمالي الخيارات المُفعّلة عبر كل المجموعات

GET /places/{slug}/reviews-summary

تفصيل التقييم لمكان — المتوسط، إجمالي عدد المراجعات، أكثر مستويات النجوم شيوعاً، والتوزيع الكامل من 5★ إلى 1★ مع الأعداد والنِّسب. مثالي لرسم بياني للتقييمات دون جلب كل مراجعة.

curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe/reviews-summary" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "slug": "jordan-beans-cafe", "hasData": true, "name": "Jordan Beans Cafe",
  "average": 4.6, "totalReviews": 128, "mostCommonStars": 5,
  "distribution": [
    { "stars": 5, "count": 96, "percent": 75 },
    { "stars": 4, "count": 20, "percent": 15.6 },
    { "stars": 3, "count": 6, "percent": 4.7 },
    { "stars": 2, "count": 3, "percent": 2.3 },
    { "stars": 1, "count": 3, "percent": 2.3 }
  ]
}
الحقلالنوعملاحظات
hasDatabooleanfalse عندما لا يملك المكان تقييماً/مراجعات
averagenumber | nullمتوسط تقييم المكان (0–5)
totalReviewsnumberإجمالي عدد المراجعات المحتسبة
mostCommonStarsnumberمستوى النجوم ذو أكثر المراجعات
distribution[]array{ stars, count, percent } من 5★ إلى 1★ (نسبة من الإجمالي)

GET /places/{slug}/photos

معرض الصور لمكان — الصور المعتمَدة والنشطة، المميَّزة أولاً، مع ترقيم صفحات. استخدمه لعرض شريط صور المكان.

الاستعلامالنوعملاحظات
pagenumberالصفحة (تبدأ من 1، افتراضي 1)
limitnumberحجم الصفحة (افتراضي 30، أقصى 100)
curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe/photos?limit=20" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "slug": "jordan-beans-cafe", "name": "Jordan Beans Cafe",
  "total": 6, "page": 1, "limit": 20, "count": 6,
  "photos": [
    { "id": "", "url": "/uploads/places/…/a59e624b.webp", "caption": "Latest", "featured": true, "mediaType": "image", "createdAt": "2026-05-…" }
  ]
}
الحقلالنوعملاحظات
totalnumberإجمالي الصور المعتمَدة للمكان
countnumberعدد صور هذه الصفحة
photos[].urlstringرابط الصورة (نسبةً إلى مضيف Navvo)
photos[].featuredbooleanالصور المميَّزة تُعاد أولاً
photos[].captionstring | nullتعليق اختياري

تُعاد فقط الصور المعتمَدة والنشطة (تنطبق المراجعة). والسلج غير المعروف يعيد total: 0 مع مصفوفة photos فارغة.


GET /places/{slug}/nearby

أماكن أخرى قريبة من هذا المكان — قائمة "أماكن مشابهة قريبة" / "المزيد مثله"، مرتّبة حسب المسافة ومُستبعِدةً المكان نفسه. يمكن قصرها على التصنيف نفسه.

الاستعلامالنوعملاحظات
radiusKmnumberنطاق البحث (افتراضي 3، أقصى 50)
sameCategoryboolean1/true → فقط الأماكن التي تشارك تصنيف المكان المرجعي
limitnumberأقصى نتائج (افتراضي 20، أقصى 100)
curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe/nearby?radiusKm=3&sameCategory=1" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "slug": "jordan-beans-cafe", "center": { "lat": 31.95, "lng": 35.91 },
  "radiusKm": 3, "sameCategory": true, "anchorCategory": "cafe", "count": 2,
  "places": [
    { "slug": "", "name": "", "category": "cafe", "rating": 4.5, "distanceKm": 0.4 }
  ]
}
الحقلالنوعملاحظات
anchorCategorystring | nullتصنيف المكان الذي سألت عنه
places[].distanceKmnumberالمسافة المستقيمة من المكان المرجعي

GET /places/{slug}/entrances

مداخل/بوابات المكان كقراءة مستقلة خفيفة — الرفيق لمصفوفة entrances[] المضمّنة في تفاصيل المكان، كي يستطيع عميل الملاحة تحديث البوابات دون إعادة جلب المكان كاملاً.

curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe/entrances" \
  -H "x-api-key: $NAVVO_API_KEY"
{
  "slug": "jordan-beans-cafe",
  "items": [
    { "id": "a1b2c3d4-…", "type": "main", "label": "Main Entrance", "location": "POINT(35.9131 31.9529)" }
  ],
  "total": 1
}

تكون items فارغة (total: 0) عندما لا توجد مداخل مخصّصة مُهيّأة — وجّه المسار إلى دبوس المكان في هذه الحالة. المعرّف المجهول يعيد 404.


GET /places/{slug}/questions

خيط الأسئلة والأجوبة العام لمكان — الأسئلة مع أجوبتها، الأحدث أولاً. قراءة فقط لمستهلكي الواجهة البرمجية؛ أما طرح الأسئلة والإجابة عنها فميزتان للمستخدمين المسجَّلين.

curl -s "https://navvo.io/api/v1/places/jordan-beans-cafe/questions" \
  -H "x-api-key: $NAVVO_API_KEY"
[
  {
    "id": "", "question": "هل توجد جلسة خارجية؟", "status": "answered", "createdAt": "",
    "answers": [
      { "id": "", "answer": "نعم — شرفة مظلّلة.", "ownerVerified": true, "createdAt": "" }
    ]
  }
]

الاستجابة مصفوفة بسيطة (فارغة عندما لا توجد أسئلة). وanswers[].ownerVerified يميّز ردود مالك النشاط التجاري المُوثَّق.


POST /places/suggest

«أضف مكاناً مفقوداً» — دع المستخدمين المسجَّلين يقترحون مكاناً غير موجود على الخريطة بعد. تدخل الاقتراحات قائمة انتظار الإشراف لدى Navvo ويراجعها محرّر؛ لا يظهر شيء على الخريطة قبل الموافقة.

يتطلّب مستخدم Navvo مسجَّل الدخول (Authorization: Bearer <accessToken> — انظر المستخدمون والمزامنة)، وليس مفتاح API.

الحقلالنوعملاحظات
namestringمطلوب — اسم المكان (بالإنجليزية)
nameArstringالاسم بالعربية (اختياري)
lat / lngnumberمطلوب — الموقع
categorystringمعرّف تصنيف اختياري (انظر GET /places/categories)
phonestringاختياري
websitestringاختياري
notestringاختياري — أي شيء ينبغي أن يعرفه المراجع
curl -s -X POST "https://navvo.io/api/v1/places/suggest" \
  -H "authorization: Bearer $NAVVO_USER_TOKEN" -H "content-type: application/json" \
  -d '{ "name": "Abu Ahmad Falafel", "nameAr": "فلافل أبو أحمد", "lat": 31.9539, "lng": 35.9106, "category": "restaurants" }'
{ "ok": true, "id": "", "status": "quarantined", "note": "Thanks! Your suggestion is queued for review." }

قيمة status عند الاستلام هي دائماً quarantined — يُحتجز الاقتراح للمراجعة. غياب name أو كون lat/lng غير رقمية يعيد 400.


المحتوى الذي يُنشئه المستخدمون

كتابة المراجعات والصور والأسئلة والبلاغات هي ميزة طرف-أول للمستخدم النهائي — تتطلّب تلك النقاط جلسة مستخدم مُسجَّل الدخول (Bearer JWT)، وليس مفتاح API، وهي ليست جزءاً من واجهة التكامل البرمجية. إذا كان منتجك بحاجة إلى محتوى من إنشاء المستخدمين، فتواصل مع Navvo لمناقشة وصول الشركاء.

Copyright © 2026