API Documentation – v2
Version 2 introduces structured resource responses using Laravel API
Resources, consistent field naming, and count fields on detail endpoints. Base URL: https://psgc.cloud/api/v2
Need v1? View v1 docs.
Endpoints Overview
Regions
List: GET https://psgc.cloud/api/v2/regions
Detail: GET https://psgc.cloud/api/v2/regions/{code_name}
List Fields: code, name
Detail Fields: code, name, provinces_count, cities_municipalities_count, barangays_count
Nested:
GET https://psgc.cloud/api/v2/regions/{code_name}/provinces
– ProvincesGET https://psgc.cloud/api/v2/regions/{code_name}/cities-municipalities
– Cities & MunicipalitiesGET https://psgc.cloud/api/v2/regions/{code_name}/cities
– CitiesGET https://psgc.cloud/api/v2/regions/{code_name}/municipalities
– MunicipalitiesGET https://psgc.cloud/api/v2/regions/{code_name}/sub-municipalities
– Sub-MunicipalitiesGET https://psgc.cloud/api/v2/regions/{code_name}/barangays
– Barangays
# curl list
curl -s https://psgc.cloud/api/v2/regions | jq '.[0]'
# curl detail (replace CODE_OR_NAME)
curl -s https://psgc.cloud/api/v2/regions/CODE_OR_NAME | jq
# fetch example
const res = await fetch('https://psgc.cloud/api/v2/regions');
const items = await res.json();
console.log(items[0]);
Provinces
List: GET https://psgc.cloud/api/v2/provinces
Detail: GET https://psgc.cloud/api/v2/provinces/{code_name}
List Fields: code, name, region
Detail Fields: code, name, region, cities_municipalities_count, barangays_count
Nested:
GET https://psgc.cloud/api/v2/provinces/{code_name}/cities-municipalities
– Cities & MunicipalitiesGET https://psgc.cloud/api/v2/provinces/{code_name}/cities
– CitiesGET https://psgc.cloud/api/v2/provinces/{code_name}/municipalities
– MunicipalitiesGET https://psgc.cloud/api/v2/provinces/{code_name}/sub-municipalities
– Sub-MunicipalitiesGET https://psgc.cloud/api/v2/provinces/{code_name}/barangays
– Barangays
# curl list
curl -s https://psgc.cloud/api/v2/provinces | jq '.[0]'
# curl detail (replace CODE_OR_NAME)
curl -s https://psgc.cloud/api/v2/provinces/CODE_OR_NAME | jq
# fetch example
const res = await fetch('https://psgc.cloud/api/v2/provinces');
const items = await res.json();
console.log(items[0]);
Cities & Municipalities
List: GET https://psgc.cloud/api/v2/cities-municipalities
Detail: GET https://psgc.cloud/api/v2/cities-municipalities/{code_name}
List Fields: code, name, type, region, province
Detail Fields: code, name, type, region, province, barangays_count
Nested:
GET https://psgc.cloud/api/v2/cities-municipalities/{code_name}/barangays
– Barangays
# curl list
curl -s https://psgc.cloud/api/v2/cities-municipalities | jq '.[0]'
# curl detail (replace CODE_OR_NAME)
curl -s https://psgc.cloud/api/v2/cities-municipalities/CODE_OR_NAME | jq
# fetch example
const res = await fetch('https://psgc.cloud/api/v2/cities-municipalities');
const items = await res.json();
console.log(items[0]);
Barangays
List: GET https://psgc.cloud/api/v2/barangays
Detail: GET https://psgc.cloud/api/v2/barangays/{code_name}
List Fields: code, name, status, region, province, city_municipality
Detail Fields: code, name, status, region, province, city_municipality
# curl list
curl -s https://psgc.cloud/api/v2/barangays | jq '.[0]'
# curl detail (replace CODE_OR_NAME)
curl -s https://psgc.cloud/api/v2/barangays/CODE_OR_NAME | jq
# fetch example
const res = await fetch('https://psgc.cloud/api/v2/barangays');
const items = await res.json();
console.log(items[0]);
Chainable Nested Paths
Traverse the full hierarchy with ancestry validation. Each segment must belong to the previous ones or a 404 is returned.
GET https://psgc.cloud/api/v2/regions/{region}/provinces/{province}
GET https://psgc.cloud/api/v2/regions/{region}/provinces/{province}/cities-municipalities
GET https://psgc.cloud/api/v2/regions/{region}/provinces/{province}/cities-municipalities/{city_municipality}
GET https://psgc.cloud/api/v2/regions/{region}/provinces/{province}/cities-municipalities/{city_municipality}/barangays
GET https://psgc.cloud/api/v2/regions/{region}/provinces/{province}/cities-municipalities/{city_municipality}/barangays/{barangay}
# List cities/municipalities for a province inside a region
curl -s https://psgc.cloud/api/v2/regions/Region V (Bicol Region)/provinces/Albay/cities-municipalities | jq '.[0]'
# Fetch a barangay validating full ancestry
curl -s https://psgc.cloud/api/v2/regions/Region V (Bicol Region)/provinces/Albay/cities-municipalities/City of Tabaco/barangays/Mariroc | jq
# JS example
const url = 'https://psgc.cloud/api/v2/regions/Region V (Bicol Region)/provinces/Albay/cities-municipalities/City of Tabaco/barangays';
const brgys = await (await fetch(url)).json();
console.log(brgys.length);
# An ancestry mismatch -> 404
Use direct endpoints when you don't need hierarchy validation.
Counts
Fields ending in _count
appear only on
detail requests where the resource was queried with counts. Collection endpoints omit them to stay lean.
Errors
404 for unknown code_name
. 429 when rate
limited.
500 for unexpected errors.
{
"message": "Region not found"
}
Changelog
- V2.1.0 – Chainable nested hierarchy endpoints (
regions/{region}/provinces/{province}/cities-municipalities/{city_municipality}/barangays/{barangay}
& intermediate levels). - v2.0.0 – Introduced resource-based responses & count fields.
See also: v1 changelog.