Dokumentasi/API/API pencarian & discovery/GET /api/v1/discovery/programmatic

Pahami daftar discovery programatik.

Endpoint ini dipakai untuk membaca daftar provider pada satu kombinasi kategori dan kota yang sudah dianggap layak tayang di discovery programatik.

Auth dan validasi

  • Autentikasi: tidak perlu.
  • Query wajib: categorySlug dan citySlug.
  • Query opsional: city, page, limit.
  • Jika query wajib tidak ada, endpoint mengembalikan PARAM_REQUIRED dengan status 400.
  • Jika kategori tidak ditemukan atau tidak aktif, endpoint mengembalikan CATEGORY_NOT_FOUND dengan status 404.
GET /api/v1/discovery/programmatic?categorySlug=digital-infrastructure&citySlug=jakarta

Cakupan data

  • Endpoint ini hanya membaca provider yang sudah tayang.
  • Ambang discovery saat ini adalah trustLevel >= 1.
  • Filter kategori memakai hasil resolveActiveCategoryFilterSlugs, jadi child category aktif tetap ikut terbaca.
  • Jika query city dikirim, endpoint akan mencocokkan kota secara langsung. Jika tidak, backend memakai citySlug.

Field respons yang penting

  • data[] berisi ringkasan provider publik hasil proyeksi toBusinessSummary.
  • meta.category memuat kategori aktif yang dipakai untuk query ini.
  • meta.citySlug menunjukkan slug kota yang dipakai untuk pencocokan.
  • meta.page, limit, total, dan totalPages menjaga kontrak pagination.
  • meta.trustThreshold menunjukkan ambang minimum trust untuk discovery programatik saat ini.

Respons sukses

{
  "data": [
    {
      "slug": "acme-studio",
      "companyName": "Acme Studio",
      "city": "Jakarta",
      "trustLevel": 3
    }
  ],
  "meta": {
    "category": {
      "slug": "digital-infrastructure",
      "name": "Digital Infrastructure"
    },
    "citySlug": "jakarta",
    "page": 1,
    "limit": 20,
    "total": 1,
    "totalPages": 1,
    "trustThreshold": 1
  }
}

Respons error

Dua error yang paling penting untuk endpoint ini adalah query wajib yang hilang dan kategori yang tidak ditemukan.

{
  "error": {
    "code": "PARAM_REQUIRED",
    "message": "Query `categorySlug` dan `citySlug` wajib diisi.",
    "details": null
  }
}
{
  "error": {
    "code": "CATEGORY_NOT_FOUND",
    "message": "Kategori tidak ditemukan.",
    "details": null
  }
}