Skip to main content

For developers

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

978 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-15, so ?from=2026-07-15 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.

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.
removedbooleantrueSet to false to leave the removed array out of every entry.

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-15

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": 2212191804, "nameZh": "BBQ", "nameEn": "BBQ",
          "district": "灣仔區", "districtEn": "Wan Chai",
          "address": "香港灣仔灣仔道207號地下",
          "addressEn": "G/F, 207 WAN CHAI ROAD, WAN CHAI, HONG KONG"
        }
      ],
      "removed": [
        {
          "licence": 2297807221, "nameZh": "ALVA HOUSE", "nameEn": "ALVA HOUSE",
          "district": "沙田區", "districtEn": "Sha Tin",
          "address": "新界沙田源康街1號帝逸酒店一樓 …",
          "addressEn": "1/F, HOTEL ALVA, 1 YUEN HONG STREET, SHA TIN, NEW TERRITORIES"
        }
      ]
    }
  ],
  "meta": {
    "count": 6,
    "from": "2026-07-15",
    "to": "2026-07-22",
    "earliest": "2026-07-15",
    "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
    },
    {
      "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
    }
  ],
  "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).
categoryEnstringApproximate type (English).
addressstringAddress (Chinese).
addressEnstringAddress (English).
addedOnstring | nullDate first seen on the list, YYYY-MM-DD (null for baseline records).
latnumber | nullLatitude (WGS84).
lngnumber | nullLongitude (WGS84).

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": 978,
    "geocoded": 978,
    "regions": [
      {
        "name": "香港島",
        "nameEn": "Hong Kong Island",
        "count": 287,
        "districts": [{ "name": "灣仔區", "nameEn": "Wan Chai", "count": 117 }]
      }
    ],
    "categories": [{ "name": "咖啡店", "nameEn": "Cafe", "count": 154 }]
  }
}

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.
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; this API adds no further restrictions.

  • 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.
  • Map © OpenFreeMap · © OpenStreetMap contributors.
← Back to the map