Skip to main content

For developers

Every dog-friendly restaurant in Hong Kong, in one API.

996 licensed premises

No backend to build. Just call it. A free, no-key JSON API.

Endpoints

The whole API in one plain-text file, for ChatGPT, Claude and other answer engines.

# Added & removed, by date

GET/api/changes

# Every restaurant · search & filter

GET/api/restaurants

# Values you can filter by

GET/api/meta

All free · sourced from FEHD-licensed premises

Overview

Every endpoint is a GET request returning JSON, no auth. The dataset is small, and /api/restaurants returns the whole filtered result in one call.

Base URL
https://pawsdine.com
Auth
None
CORS
Enabled (*)
Content-Type
application/json

Endpoints

Response format

Every response is an envelope: on success success: true with data (some also carry meta); on failure success: false with error, plus the matching HTTP status.

{
  "success": true,
  "data": …,
  "meta": …
}

Changelog

GET/api/changes

One entry per date the FEHD list changed, newest first, each listing the restaurants added and removed that day. Call it with no parameters for the last 7 days, or set from / to for any other window (both dates included). Tracking begins on 2026-07-10, so ?from=2026-07-10 gives you everything on record; the list as it stood before that date is the untracked starting point. Every response reports the span it covers in meta, alongside earliest and latest for the whole dataset. A premises can also change without joining or leaving the list — renamed, recategorised, moved district. Those days carry an edits array and have both lists empty, so treat an entry with no additions and no removals as an edit day rather than as a no-op. Each edit names the field that moved (name, district or category) and carries fromZh / toZh beside the premises' current details. edits is absent on entries recorded before these were tracked, and neither the added nor the removed switch removes it.

Query parameters

ParamTypeDefaultDescription
fromstring6 days before toEarliest date to include, YYYY-MM-DD. The window counts calendar days, so a day with no change is simply absent from data.
tostringtodayLatest date to include, YYYY-MM-DD.
addedbooleantrueSet to false to leave the added array out of every entry. The dates still appear. Does not affect edits.
removedbooleantrueSet to false to leave the removed array out of every entry. Does not affect edits.

Common calls

/api/changes

This week. The last 7 days, which is what you get with no parameters.

/api/changes?from=2026-07-15&to=2026-07-22

One specific week, both dates included.

/api/changes?from=2026-07-10

Everything on record, by starting from the first tracked date.

/api/changes?removed=false

New restaurants only, with the removals left out of the payload.

Request

curl "https://pawsdine.com/api/changes?from=2026-07-15&to=2026-07-22"

Response

json
{
  "success": true,
  "data": [
    {
      "date": "2026-07-15",
      "added": [
        {
          "licence": 2211084426, "nameZh": "一杯喜", "nameEn": "IPPAIKI SAKAYA",
          "district": "灣仔區", "districtEn": "Wan Chai",
          "address": "香港銅鑼灣 清風街1A及1B號地下",
          "addressEn": "G/F, 1A-1B TSING FUNG STREET, CAUSEWAY BAY, HONG KONG"
        }
      ],
      "removed": [
        {
          "licence": 3163802944, "nameZh": "吳麻辣", "nameEn": "MOTO MALA",
          "district": "深水埗區", "districtEn": "Sham Shui Po",
          "address": "九龍深水埗深旺道28號 V WALK 2樓L2-127 & 128鋪 …",
          "addressEn": "SHOP NOS. L2-127 & 128, LEVEL 2, V WALK, NO. 28 SHAM MONG ROAD, SHAM SHUI PO, KOWLOON"
        }
      ]
    },
    {
      "date": "2026-07-14",
      "added": [],
      "removed": [],
      "edits": [
        {
          "licence": 2262811512, "nameZh": "SOPHIE'S TREAT", "nameEn": "SOPHIE'S TREAT",
          "district": "油尖旺區", "districtEn": "Yau Tsim Mong",
          "address": "九龍旺角彌敦道726號彌敦道726 18樓",
          "addressEn": "18/F, 726 NATHAN ROAD, NO. 726 NATHAN ROAD, MONG KOK, KOWLOON",
          "field": "name",
          "fromZh": "烤焰官", "fromEn": "烤焰官",
          "toZh": "SOPHIE'S TREAT", "toEn": "SOPHIE'S TREAT"
        }
      ]
    }
  ],
  "meta": {
    "count": 6,
    "from": "2026-07-15",
    "to": "2026-07-22",
    "earliest": "2026-07-10",
    "latest": "2026-07-22"
  }
}

Restaurants

GET/api/restaurants

The full list of dog-friendly restaurants. Call it with no parameters for all of them, or narrow it with any combination of q, region, district and category. There is no pagination: every match comes back in one call, with the total in meta.count. A value that is not a real region, district or category returns 400 rather than an empty list, so typos are easy to spot. See /api/meta for the accepted values.

Query parameters

ParamTypeOptionalDescription
qstring✓ YesKeyword. Matches Chinese/English name, address, and district (case-insensitive).
regionstring✓ YesRegion. Chinese or English (case-insensitive): 香港島 / Hong Kong Island, 九龍 / Kowloon, 新界 / New Territories.
districtstring✓ YesDistrict. Chinese or English, e.g. 灣仔區 or Wan Chai, 葵青區 or Kwai Tsing.
categorystring✓ YesApproximate type. Chinese or English, e.g. 咖啡店 or Cafe.

Request

curl "https://pawsdine.com/api/restaurants?q=wan chai"

Response

{
  "success": true,
  "data": [
    {
      "licence": 3112808861,
      "nameZh": "BLUE BOTTLE CAFE",
      "nameEn": "BLUE BOTTLE CAFE",
      "district": "灣仔區",
      "districtEn": "Wan Chai",
      "region": "香港島",
      "regionEn": "Hong Kong Island",
      "category": "咖啡店",
      "categoryEn": "Cafe",
      "address": "香港灣仔聖佛蘭士街15號 地下至 2樓",
      "addressEn": "G/F - 2/F, 15 ST. FRANCIS STREET, WAN CHAI, HONG KONG",
      "lat": 22.27602,
      "lng": 114.16913,
      "placeId": "ChIJ2XjbroIABDQRy8i7pMPjgm4"
    },
    {
      "licence": 2212802494,
      "nameZh": "火車頭越南餐室",
      "nameEn": "CAFE LOCOMOTIVE CONTEMPORARY VIETNAMESE",
      "district": "灣仔區",
      "districtEn": "Wan Chai",
      "region": "香港島",
      "regionEn": "Hong Kong Island",
      "category": "咖啡店",
      "categoryEn": "Cafe",
      "address": "香港大坑浣紗街11號地下",
      "addressEn": "G/F., 11 WUN SHA STREET, TAI HANG, HONG KONG",
      "lat": 22.27902,
      "lng": 114.19265,
      "placeId": null
    }
  ],
  "meta": { "count": 7 }
}

Restaurant fields

FieldTypeDescription
licencenumber10-digit FEHD licence number, also the unique id.
nameZhstringChinese name.
nameEnstringEnglish name.
districtstringDistrict (Chinese).
districtEnstringDistrict (English).
regionstringRegion (香港島 / 九龍 / 新界).
regionEnstringRegion in English.
categorystringApproximate type (Chinese, indicative). Derived from Google place types; see Licence.
categoryEnstringApproximate type (English). Derived from Google place types; see Licence.
addressstringAddress (Chinese).
addressEnstringAddress (English).
addedOnstring | nullDate first seen on the list, YYYY-MM-DD (null for baseline records).
latnumber | nullLatitude (WGS84).
lngnumber | nullLongitude (WGS84).
placeIdstring | nullGoogle Place ID for the premises, or null if we have not matched one. Business details (rating, hours, photos) are not included: Google's terms only allow the ID itself to be stored, so look those up with the Places API using this ID.

Filter values

GET/api/meta

Every value the /api/restaurants filters accept: the region → district tree and the category list, each with how many restaurants it holds. Call this to populate dropdowns, or to check a value before filtering on it. No parameters.

Request

curl "https://pawsdine.com/api/meta"

Response

json
{
  "success": true,
  "data": {
    "total": 996,
    "geocoded": 996,
    "lastUpdated": "2026-09-11",
    "sourceUpdated": "2026-09-11",
    "regions": [
      {
        "name": "香港島",
        "nameEn": "Hong Kong Island",
        "count": 294,
        "districts": [{ "name": "灣仔區", "nameEn": "Wan Chai", "count": 119 }]
      }
    ],
    "categories": [{ "name": "餐廳", "nameEn": "Restaurant", "count": 151 }]
  }
}

Errors

Error responses carry the matching HTTP status and a stable error.code.

Statuserror.codeDescription
400INVALID_REGIONUnknown region value.
400INVALID_DISTRICTUnknown district value.
400INVALID_CATEGORYUnknown category value.
400INVALID_DATEfrom or to is not a valid YYYY-MM-DD date.
400INVALID_RANGEfrom is later than to.
404NOT_FOUNDUnknown API route.
405METHOD_NOT_ALLOWEDOnly GET (and HEAD) is supported.
500INTERNAL_ERRORUnexpected server error.

Examples

{
  "success": false,
  "error": {
    "code": "INVALID_DISTRICT",
    "message": "Unknown district \"foo\". See /api/meta for valid values."
  }
}

Usage

// q is a single case-insensitive keyword — matches EN/ZH name, address, district
const res = await fetch("https://pawsdine.com/api/restaurants?q=wan chai");
const json = await res.json();
if (!json.success) throw new Error(json.error.message);
console.log(json.meta.count, json.data.length);

Licence & attribution

Free to use, including commercially. Credit "pawsdine.com" with a link when you redistribute or display this data. The underlying data is used under the data.gov.hk Terms of Use, which govern the source. Two fields are excepted: category and categoryEn are derived from Google place types, fall outside the licence above, and are provided under the Google Maps Platform Terms of Service.

  • Restaurant list © Food and Environmental Hygiene Department (FEHD), "List of premises where dogs are permitted to enter".
  • Geocoding uses data.gov.hk's Address Lookup Service (ALS), © The Government of the HKSAR.
  • Basemap © OpenFreeMap and OpenStreetMap contributors.
  • Business information © Google. Ratings, hours, prices and photos come from Google Maps and are not redistributed by this API; category and categoryEn are derived from Google place types and provided under Google's terms.
← Back to the map