Tài liệu API

REST, JSON, UTF-8. Các API tra cứu dùng miễn phí không cần khoá (100 yêu cầu/phút cho mỗi địa chỉ IP). API chuyển đổi cần khoá API; mỗi tài khoản có 1.000 lượt/tháng, mỗi địa chỉ trong một lô tính một lượt.

Base URL https://tinhthanhpho.com/api/v1
Xác thực Authorization: Bearer hvn_live_… Lấy khoá API →
Phiên bản dữ liệu 2026.10.8 · 06/10/2026 Đặc tả 1.1.0

Ví dụ đọc khoá từ biến môi trường TTP_API_KEY; đừng nhúng khoá vào mã chạy trên trình duyệt.

Đơn vị cũ (trước 1/7/2025)

GET /api/v1/provinces Không cần khoá

Danh sách tỉnh/thành trước 1/7/2025

63 tỉnh/thành cũ, có phân trang và tìm theo từ khoá.

Tham số

keyword
string · query
Từ khoá tìm kiếm (có dấu hoặc không dấu)
limit
integer · query
Số kết quả mỗi trang (mặc định 20)
page
integer · query
Số trang (mặc định 1)
curl 'https://tinhthanhpho.com/api/v1/provinces' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/provinces', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/provinces');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/provinces",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "province_id": 57,
            "code": "89",
            "name": "An Giang",
            "type": "Tỉnh",
            "created_at": null,
            "updated_at": null,
            "area_km2": null,
            "population": null,
            "district_count": 11
        },
        {
            "province_id": 49,
            "code": "77",
            "name": "Bà Rịa - Vũng Tàu",
            "type": "Tỉnh",
            "created_at": null,
            "updated_at": null,
            "area_km2": null,
            "population": null,
            "district_count": 7
        }
    ],
    "metadata": {
        "total": 63,
        "page": 1,
        "limit": 2,
        "data_version": "2026.10.0"
    }
}
GET /api/v1/provinces/{code} Không cần khoá

Chi tiết một tỉnh/thành cũ

Thông tin tỉnh/thành theo mã cũ.

Tham số

code
string · đường dẫn · bắt buộc
Mã đơn vị hành chính
curl 'https://tinhthanhpho.com/api/v1/provinces/79' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/provinces/79', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/provinces/79');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/provinces/79",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 404

{
    "success": true,
    "message": "Success",
    "data": {
        "province_id": 50,
        "code": "79",
        "name": "Hồ Chí Minh",
        "type": "Thành phố",
        "created_at": null,
        "updated_at": null,
        "area_km2": null,
        "population": null,
        "district_count": 22
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}
GET /api/v1/provinces/{provinceCode}/districts Không cần khoá

Quận/huyện của một tỉnh cũ

Danh sách quận/huyện thuộc tỉnh/thành cũ.

Tham số

provinceCode
string · đường dẫn · bắt buộc
Mã tỉnh/thành
keyword
string · query
Từ khoá tìm kiếm (có dấu hoặc không dấu)
limit
integer · query
Số kết quả mỗi trang (mặc định 20)
page
integer · query
Số trang (mặc định 1)
curl 'https://tinhthanhpho.com/api/v1/provinces/79/districts' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/provinces/79/districts', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/provinces/79/districts');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/provinces/79/districts",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "district_id": 541,
            "code": "760",
            "name": "1",
            "type": "Quận",
            "province_code": "79",
            "created_at": null,
            "updated_at": null
        },
        {
            "district_id": 550,
            "code": "771",
            "name": "10",
            "type": "Quận",
            "province_code": "79",
            "created_at": null,
            "updated_at": null
        }
    ],
    "metadata": {
        "total": 22,
        "page": 1,
        "limit": 2,
        "data_version": "2026.10.0"
    }
}
GET /api/v1/districts/{code} Không cần khoá

Chi tiết một quận/huyện

Thông tin quận/huyện theo mã.

Tham số

code
string · đường dẫn · bắt buộc
Mã đơn vị hành chính
curl 'https://tinhthanhpho.com/api/v1/districts/760' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/districts/760', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/districts/760');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/districts/760",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 404

{
    "success": true,
    "message": "Success",
    "data": {
        "district_id": 541,
        "code": "760",
        "name": "1",
        "type": "Quận",
        "province_code": "79",
        "created_at": null,
        "updated_at": null,
        "province": {
            "province_id": 50,
            "code": "79",
            "name": "Hồ Chí Minh",
            "type": "Thành phố",
            "created_at": null,
            "updated_at": null,
            "area_km2": null,
            "population": null,
            "district_count": 22
        }
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}
GET /api/v1/districts/{districtCode}/wards Không cần khoá

Xã/phường của một quận/huyện

Danh sách xã/phường cũ thuộc quận/huyện.

Tham số

districtCode
string · đường dẫn · bắt buộc
Mã quận/huyện (cũ)
keyword
string · query
Từ khoá tìm kiếm (có dấu hoặc không dấu)
limit
integer · query
Số kết quả mỗi trang (mặc định 20)
page
integer · query
Số trang (mặc định 1)
curl 'https://tinhthanhpho.com/api/v1/districts/760/wards' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/districts/760/wards', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/districts/760/wards');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/districts/760/wards",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "ward_id": 8195,
            "code": "26740",
            "name": "Bến Nghé",
            "type": "Phường",
            "district_code": "760",
            "province_code": "79",
            "created_at": null,
            "updated_at": null
        },
        {
            "ward_id": 8196,
            "code": "26743",
            "name": "Bến Thành",
            "type": "Phường",
            "district_code": "760",
            "province_code": "79",
            "created_at": null,
            "updated_at": null
        }
    ],
    "metadata": {
        "total": 10,
        "page": 1,
        "limit": 2,
        "data_version": "2026.10.0"
    }
}
GET /api/v1/wards/{code} Không cần khoá

Chi tiết một xã/phường cũ

Thông tin xã/phường theo mã cũ.

Tham số

code
string · đường dẫn · bắt buộc
Mã đơn vị hành chính
curl 'https://tinhthanhpho.com/api/v1/wards/26740' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/wards/26740', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/wards/26740');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/wards/26740",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 404

{
    "success": true,
    "message": "Success",
    "data": {
        "ward_id": 8195,
        "code": "26740",
        "name": "Bến Nghé",
        "type": "Phường",
        "district_code": "760",
        "province_code": "79",
        "created_at": null,
        "updated_at": null,
        "district": {
            "district_id": 541,
            "code": "760",
            "name": "1",
            "type": "Quận",
            "province_code": "79",
            "created_at": null,
            "updated_at": null
        },
        "province": {
            "province_id": 50,
            "code": "79",
            "name": "Hồ Chí Minh",
            "type": "Thành phố",
            "created_at": null,
            "updated_at": null,
            "area_km2": null,
            "population": null,
            "district_count": 22
        }
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}
GET /api/v1/full-address Không cần khoá

Địa chỉ đầy đủ theo mã cũ

Ghép tỉnh, huyện, xã cũ từ các mã.

Tham số

provinceCode
string · query
Mã tỉnh/thành
districtCode
string · query
Mã quận/huyện (cũ)
wardCode
string · query
Mã xã/phường
curl 'https://tinhthanhpho.com/api/v1/full-address?provinceCode=79&districtCode=760&wardCode=26740' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/full-address?provinceCode=79&districtCode=760&wardCode=26740', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/full-address?provinceCode=79&districtCode=760&wardCode=26740');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/full-address?provinceCode=79&districtCode=760&wardCode=26740",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": {
        "province": {
            "province_id": 50,
            "code": "79",
            "name": "Hồ Chí Minh",
            "type": "Thành phố",
            "created_at": null,
            "updated_at": null,
            "area_km2": null,
            "population": null,
            "district_count": 22
        },
        "district": {
            "district_id": 541,
            "code": "760",
            "name": "1",
            "type": "Quận",
            "province_code": "79",
            "created_at": null,
            "updated_at": null
        },
        "ward": {
            "ward_id": 8195,
            "code": "26740",
            "name": "Bến Nghé",
            "type": "Phường",
            "district_code": "760",
            "province_code": "79",
            "created_at": null,
            "updated_at": null,
            "district": {
                "district_id": 541,
                "code": "760",
                "name": "1",
                "type": "Quận",
                "province_code": "79",
                "created_at": null,
                "updated_at": null
            },
            "province": {
                "province_id": 50,
                "code": "79",
                "name": "Hồ Chí Minh",
                "type": "Thành phố",
                "created_at": null,
                "updated_at": null,
                "area_km2": null,
                "population": null,
                "district_count": 22
            }
        }
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}
GET /api/v1/search-address Không cần khoá

Tìm địa chỉ cũ ở mọi cấp

Tìm tỉnh, huyện, xã trước 1/7/2025 theo từ khoá.

Tham số

keyword
string · query · bắt buộc
Từ khoá tìm kiếm (có dấu hoặc không dấu)
limit
integer · query
Số kết quả mỗi trang (mặc định 20)
curl 'https://tinhthanhpho.com/api/v1/search-address?keyword=B%E1%BA%BFn%20Ngh%C3%A9' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/search-address?keyword=B%E1%BA%BFn%20Ngh%C3%A9', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/search-address?keyword=B%E1%BA%BFn%20Ngh%C3%A9');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/search-address?keyword=B%E1%BA%BFn%20Ngh%C3%A9",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "type": "ward",
            "code": "26740",
            "name": "Bến Nghé",
            "full_name": "Phường Bến Nghé",
            "address": "Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh",
            "district_code": "760",
            "province_code": "79"
        }
    ],
    "metadata": {
        "data_version": "2026.10.0"
    }
}

Đơn vị mới (từ 1/7/2025)

GET /api/v1/new-provinces Không cần khoá

Danh sách tỉnh/thành từ 1/7/2025

34 tỉnh/thành mới kèm merged_from (tỉnh cũ hợp nhất), ward_count và căn cứ pháp lý.

Tham số

keyword
string · query
Từ khoá tìm kiếm (có dấu hoặc không dấu)
limit
integer · query
Số kết quả mỗi trang (mặc định 20)
page
integer · query
Số trang (mặc định 1)
curl 'https://tinhthanhpho.com/api/v1/new-provinces' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/new-provinces', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/new-provinces');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/new-provinces",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "province_id": 2,
            "code": "91",
            "name": "An Giang",
            "slug": "an-giang",
            "short_name": null,
            "type": "Tỉnh",
            "created_at": null,
            "updated_at": null,
            "area_km2": "9888.91",
            "population": 4952238,
            "hq_address": "Số 06 đường Nguyễn Công Trứ, phường Rạch Giá, tỉnh An Giang",
            "legal_refs": [
                {
                    "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=213930",
                    "date": "2025-06-12",
                    "title": "Nghị quyết về việc sắp xếp đơn vị hành chính cấp tỉnh",
                    "number": "202/2025/QH15",
                    "effective_date": "2025-07-01"
                }
            ],
            "type_history": null,
            "centroid_lat": 10.31725,
            "centroid_lng": 105.034738,
            "neighbors": [
                "82"
            ],
            "merged_from": [
                "89"
            ],
            "ward_count": 102,
            "legal_ref": "202/2025/QH15"
        },
        {
            "province_id": 3,
            "code": "24",
            "name": "Bắc Ninh",
            "slug": "tp-bac-ninh",
            "short_name": null,
            "type": "Thành phố",
            "created_at": null,
            "updated_at": null,
            "area_km2": "4718.60",
            "population": 3619433,
            "hq_address": "Số 82 Hùng Vương, phường Bắc Giang, thành phố Bắc Ninh",
            "legal_refs": [
                {
                    "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=213930",
                    "date": "2025-06-12",
                    "title": "Nghị quyết về việc sắp xếp đơn vị hành chính cấp tỉnh",
                    "number": "202/2025/QH15",
                    "effective_date": "2025-07-01"
                }
            ],
            "type_history": [
                {
                    "from": "2025-07-01",
                    "type": "Tỉnh",
                    "until": "2026-09-19"
                }
            ],
            "centroid_lat": 21.362619,
            "centroid_lng": 106.629202,
            "neighbors": [
                "01"
            ],
            "merged_from": [
                "24"
            ],
            "ward_count": 99,
            "legal_ref": "202/2025/QH15; 39/2026/QH16"
        }
    ],
    "metadata": {
        "total": 34,
        "page": 1,
        "limit": 2,
        "data_version": "2026.10.0"
    }
}
GET /api/v1/new-provinces/{code} Không cần khoá

Chi tiết một tỉnh/thành mới

Thông tin tỉnh/thành mới theo mã.

Tham số

code
string · đường dẫn · bắt buộc
Mã đơn vị hành chính
curl 'https://tinhthanhpho.com/api/v1/new-provinces/79' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/new-provinces/79', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/new-provinces/79');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/new-provinces/79",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 404

{
    "success": true,
    "message": "Success",
    "data": {
        "province_id": 37,
        "code": "79",
        "name": "Hồ Chí Minh",
        "slug": "tp-ho-chi-minh",
        "short_name": null,
        "type": "Thành phố",
        "created_at": null,
        "updated_at": null,
        "area_km2": "6772.59",
        "population": 14002598,
        "hq_address": "Số 86 đường Lê Thánh Tôn, phường Sài Gòn, TP Hồ Chí Minh",
        "legal_refs": [
            {
                "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=213930",
                "date": "2025-06-12",
                "title": "Nghị quyết về việc sắp xếp đơn vị hành chính cấp tỉnh",
                "number": "202/2025/QH15",
                "effective_date": "2025-07-01"
            }
        ],
        "type_history": null,
        "centroid_lat": 11.163651,
        "centroid_lng": 106.636408,
        "neighbors": [
            "68"
        ],
        "merged_from": [
            "74"
        ],
        "ward_count": 168,
        "legal_ref": "202/2025/QH15"
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}
GET /api/v1/new-provinces/{provinceCode}/wards Không cần khoá

Xã/phường của một tỉnh mới

Danh sách xã/phường/đặc khu thuộc tỉnh mới, lọc theo loại bằng ?type=.

Tham số

provinceCode
string · đường dẫn · bắt buộc
Mã tỉnh/thành
keyword
string · query
Từ khoá tìm kiếm (có dấu hoặc không dấu)
type
string · query
Chỉ lấy một loại đơn vị: phuong, xa hoặc dac-khu (dấu không bắt buộc)
limit
integer · query
Số kết quả mỗi trang (mặc định 20)
page
integer · query
Số trang (mặc định 1)
curl 'https://tinhthanhpho.com/api/v1/new-provinces/79/wards?type=phuong' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/new-provinces/79/wards?type=phuong', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/new-provinces/79/wards?type=phuong');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/new-provinces/79/wards?type=phuong",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "ward_id": 2636,
            "code": "27316",
            "name": "An Đông",
            "slug": "phuong-an-dong",
            "short_name": null,
            "type": "Phường",
            "province_code": "79",
            "created_at": null,
            "updated_at": null,
            "area_km2": "1.32",
            "population": 81229,
            "hq_address": "209 An Dương Vương, phường 7, quận 5 cũ",
            "legal_refs": [
                {
                    "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=214007",
                    "date": "2025-06-16",
                    "title": "Nghị quyết về việc sắp xếp các đơn vị hành chính cấp xã của thành phố Hồ Chí Minh năm 2025",
                    "number": "1685/NQ-UBTVQH15",
                    "effective_date": "2025-07-01"
                }
            ],
            "type_history": null,
            "centroid_lat": 10.75475,
            "centroid_lng": 106.671622,
            "neighbors": [
                "27169"
            ]
        },
        {
            "ward_id": 2674,
            "code": "26878",
            "name": "An Hội Đông",
            "slug": "phuong-an-hoi-dong",
            "short_name": null,
            "type": "Phường",
            "province_code": "79",
            "created_at": null,
            "updated_at": null,
            "area_km2": "3.29",
            "population": 123681,
            "hq_address": "328 Thống Nhất, Phường 16, quận Gò Vấp cũ",
            "legal_refs": [
                {
                    "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=214007",
                    "date": "2025-06-16",
                    "title": "Nghị quyết về việc sắp xếp các đơn vị hành chính cấp xã của thành phố Hồ Chí Minh năm 2025",
                    "number": "1685/NQ-UBTVQH15",
                    "effective_date": "2025-07-01"
                }
            ],
            "type_history": null,
            "centroid_lat": 10.850197,
            "centroid_lng": 106.667229,
            "neighbors": [
                "26767"
            ]
        }
    ],
    "metadata": {
        "total": 113,
        "page": 1,
        "limit": 2,
        "data_version": "2026.10.0"
    }
}
GET /api/v1/new-wards/{code} Không cần khoá

Chi tiết một xã/phường mới

Thông tin xã/phường/đặc khu mới theo mã; mã đã hiệu chỉnh trả đơn vị hiện hành kèm deprecated_code.

Tham số

code
string · đường dẫn · bắt buộc
Mã đơn vị hành chính
curl 'https://tinhthanhpho.com/api/v1/new-wards/26740' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/new-wards/26740', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/new-wards/26740');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/new-wards/26740",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 404

{
    "success": true,
    "message": "Success",
    "data": {
        "ward_id": 2625,
        "code": "26740",
        "name": "Sài Gòn",
        "slug": "phuong-sai-gon",
        "short_name": null,
        "type": "Phường",
        "province_code": "79",
        "created_at": null,
        "updated_at": null,
        "area_km2": "3.04",
        "population": 47022,
        "hq_address": "45 - 47 Lê Duẩn, phường Bến Nghé, quận 1 cũ",
        "legal_refs": [
            {
                "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=214007",
                "date": "2025-06-16",
                "title": "Nghị quyết về việc sắp xếp các đơn vị hành chính cấp xã của thành phố Hồ Chí Minh năm 2025",
                "number": "1685/NQ-UBTVQH15",
                "effective_date": "2025-07-01"
            }
        ],
        "type_history": null,
        "centroid_lat": 10.781051,
        "centroid_lng": 106.703947,
        "neighbors": [
            "26737"
        ],
        "province": {
            "province_id": 37,
            "code": "79",
            "name": "Hồ Chí Minh",
            "slug": "tp-ho-chi-minh",
            "short_name": null,
            "type": "Thành phố",
            "created_at": null,
            "updated_at": null,
            "area_km2": "6772.59",
            "population": 14002598,
            "hq_address": "Số 86 đường Lê Thánh Tôn, phường Sài Gòn, TP Hồ Chí Minh",
            "legal_refs": [
                {
                    "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=213930",
                    "date": "2025-06-12",
                    "title": "Nghị quyết về việc sắp xếp đơn vị hành chính cấp tỉnh",
                    "number": "202/2025/QH15",
                    "effective_date": "2025-07-01"
                }
            ],
            "type_history": null,
            "centroid_lat": 11.163651,
            "centroid_lng": 106.636408,
            "neighbors": [
                "68"
            ]
        }
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}
GET /api/v1/new-full-address Không cần khoá

Địa chỉ đầy đủ theo mã mới

Ghép tỉnh và xã mới từ các mã.

Tham số

provinceCode
string · query
Mã tỉnh/thành
wardCode
string · query
Mã xã/phường
curl 'https://tinhthanhpho.com/api/v1/new-full-address?provinceCode=79&wardCode=26740' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/new-full-address?provinceCode=79&wardCode=26740', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/new-full-address?provinceCode=79&wardCode=26740');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/new-full-address?provinceCode=79&wardCode=26740",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": {
        "province": {
            "province_id": 37,
            "code": "79",
            "name": "Hồ Chí Minh",
            "slug": "tp-ho-chi-minh",
            "short_name": null,
            "type": "Thành phố",
            "created_at": null,
            "updated_at": null,
            "area_km2": "6772.59",
            "population": 14002598,
            "hq_address": "Số 86 đường Lê Thánh Tôn, phường Sài Gòn, TP Hồ Chí Minh",
            "legal_refs": [
                {
                    "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=213930",
                    "date": "2025-06-12",
                    "title": "Nghị quyết về việc sắp xếp đơn vị hành chính cấp tỉnh",
                    "number": "202/2025/QH15",
                    "effective_date": "2025-07-01"
                }
            ],
            "type_history": null,
            "centroid_lat": 11.163651,
            "centroid_lng": 106.636408,
            "neighbors": [
                "68"
            ]
        },
        "ward": {
            "ward_id": 2625,
            "code": "26740",
            "name": "Sài Gòn",
            "slug": "phuong-sai-gon",
            "short_name": null,
            "type": "Phường",
            "province_code": "79",
            "created_at": null,
            "updated_at": null,
            "area_km2": "3.04",
            "population": 47022,
            "hq_address": "45 - 47 Lê Duẩn, phường Bến Nghé, quận 1 cũ",
            "legal_refs": [
                {
                    "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=214007",
                    "date": "2025-06-16",
                    "title": "Nghị quyết về việc sắp xếp các đơn vị hành chính cấp xã của thành phố Hồ Chí Minh năm 2025",
                    "number": "1685/NQ-UBTVQH15",
                    "effective_date": "2025-07-01"
                }
            ],
            "type_history": null,
            "centroid_lat": 10.781051,
            "centroid_lng": 106.703947,
            "neighbors": [
                "26737"
            ],
            "province": {
                "province_id": 37,
                "code": "79",
                "name": "Hồ Chí Minh",
                "slug": "tp-ho-chi-minh",
                "short_name": null,
                "type": "Thành phố",
                "created_at": null,
                "updated_at": null,
                "area_km2": "6772.59",
                "population": 14002598,
                "hq_address": "Số 86 đường Lê Thánh Tôn, phường Sài Gòn, TP Hồ Chí Minh",
                "legal_refs": [
                    {
                        "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=213930",
                        "date": "2025-06-12",
                        "title": "Nghị quyết về việc sắp xếp đơn vị hành chính cấp tỉnh",
                        "number": "202/2025/QH15",
                        "effective_date": "2025-07-01"
                    }
                ],
                "type_history": null,
                "centroid_lat": 11.163651,
                "centroid_lng": 106.636408,
                "neighbors": [
                    "68"
                ]
            }
        }
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}
GET /api/v1/search-new-address Không cần khoá

Tìm địa chỉ mới ở mọi cấp

Tìm tỉnh và xã từ 1/7/2025 theo từ khoá.

Tham số

keyword
string · query · bắt buộc
Từ khoá tìm kiếm (có dấu hoặc không dấu)
limit
integer · query
Số kết quả mỗi trang (mặc định 20)
curl 'https://tinhthanhpho.com/api/v1/search-new-address?keyword=S%C3%A0i%20G%C3%B2n' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/search-new-address?keyword=S%C3%A0i%20G%C3%B2n', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/search-new-address?keyword=S%C3%A0i%20G%C3%B2n');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/search-new-address?keyword=S%C3%A0i%20G%C3%B2n",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "type": "ward",
            "code": "26740",
            "name": "Sài Gòn",
            "full_name": "Phường Sài Gòn",
            "address": "Phường Sài Gòn, Thành phố Hồ Chí Minh",
            "province_code": "79"
        }
    ],
    "metadata": {
        "data_version": "2026.10.0"
    }
}

Chuyển đổi địa chỉ

POST /api/v1/convert/address Cần khoá · quyền convert

Chuyển một địa chỉ cũ sang mới

Gửi địa chỉ tự do (`text`) hoặc ba mã cũ. Kết quả giữ các trường v1 (old, new, mergeInfo) và thêm confidence (exact | check), reason, candidates (mọi xã mới của một xã cũ bị chia, hoặc khi địa chỉ chưa rõ). Không tìm thấy: HTTP 422 kèm message, reason và suggestions.

Nội dung yêu cầu (JSON)

text
string ≤ 300 · body
Địa chỉ gõ tự do; hoặc dùng bộ mã bên dưới
provinceCode
string · body
Mã tỉnh/thành
districtCode
string · body
Mã quận/huyện (cũ)
wardCode
string · body
Mã xã/phường
streetAddress
string · body
Số nhà, tên đường (ghép vào địa chỉ mới)
curl -X POST 'https://tinhthanhpho.com/api/v1/convert/address' \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $TTP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"12 Nguyễn Huệ, P. Bến Nghé, Q.1, TP.HCM"}'
const response = await fetch('https://tinhthanhpho.com/api/v1/convert/address', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Authorization': `Bearer ${process.env.TTP_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "text": "12 Nguyễn Huệ, P. Bến Nghé, Q.1, TP.HCM"
  }),
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/convert/address');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json', 'Authorization: Bearer ' . getenv('TTP_API_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'text' => '12 Nguyễn Huệ, P. Bến Nghé, Q.1, TP.HCM',
    ], JSON_UNESCAPED_UNICODE),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import os
import requests

response = requests.post(
    "https://tinhthanhpho.com/api/v1/convert/address",
    headers={"Accept": "application/json", "Authorization": f"Bearer {os.environ['TTP_API_KEY']}"},
    json={
        "text": "12 Nguyễn Huệ, P. Bến Nghé, Q.1, TP.HCM"
    },
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 401, 422

{
    "success": true,
    "message": "Success",
    "data": {
        "old": {
            "province": {
                "code": "79",
                "name": "Hồ Chí Minh",
                "type": "Thành phố"
            },
            "district": {
                "code": "760",
                "name": "1",
                "type": "Quận"
            },
            "ward": {
                "code": "26740",
                "name": "Bến Nghé",
                "type": "Phường"
            },
            "fullAddress": "12 Nguyễn Huệ, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh"
        },
        "new": {
            "province": {
                "code": "79",
                "name": "Hồ Chí Minh",
                "type": "Thành phố",
                "slug": "tp-ho-chi-minh"
            },
            "ward": {
                "code": "26740",
                "name": "Sài Gòn",
                "type": "Phường",
                "slug": "phuong-sai-gon"
            },
            "fullAddress": "12 Nguyễn Huệ, Phường Sài Gòn, Thành phố Hồ Chí Minh"
        },
        "mergeInfo": {
            "notes": "Phường Bến Nghé, Quận 1 đã được sắp xếp vào Phường Sài Gòn, Thành phố Hồ Chí Minh.",
            "legal": "1685/NQ-UBTVQH15"
        },
        "confidence": "exact",
        "reason": "merged",
        "candidates": []
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}
POST /api/v1/convert/batch Cần khoá · quyền convert

Chuyển nhiều địa chỉ trong một lần gọi

Mỗi địa chỉ là text hoặc bộ mã; kết quả theo đúng thứ tự, kèm confidence, reason và candidates. Số địa chỉ tối đa theo cài đặt batch_conversion_limit.

Nội dung yêu cầu (JSON)

addresses
array<object> · body · bắt buộc
Danh sách địa chỉ; mỗi địa chỉ là text hoặc bộ mã
addresses[].id
string · body
Mã tham chiếu của anh/chị, trả lại nguyên trong kết quả
addresses[].text
string · body
Địa chỉ gõ tự do; hoặc dùng bộ mã bên dưới
addresses[].provinceCode
string · body
Mã tỉnh/thành
addresses[].districtCode
string · body
Mã quận/huyện (cũ)
addresses[].wardCode
string · body
Mã xã/phường
addresses[].streetAddress
string · body
Số nhà, tên đường (ghép vào địa chỉ mới)
curl -X POST 'https://tinhthanhpho.com/api/v1/convert/batch' \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $TTP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"addresses":[{"id":"addr_001","text":"Phường Bến Nghé, Quận 1, TP HCM"}]}'
const response = await fetch('https://tinhthanhpho.com/api/v1/convert/batch', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Authorization': `Bearer ${process.env.TTP_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "addresses": [
      {
        "id": "addr_001",
        "text": "Phường Bến Nghé, Quận 1, TP HCM"
      }
    ]
  }),
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/convert/batch');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json', 'Authorization: Bearer ' . getenv('TTP_API_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'addresses' => [
            [
                'id' => 'addr_001',
                'text' => 'Phường Bến Nghé, Quận 1, TP HCM',
            ],
        ],
    ], JSON_UNESCAPED_UNICODE),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import os
import requests

response = requests.post(
    "https://tinhthanhpho.com/api/v1/convert/batch",
    headers={"Accept": "application/json", "Authorization": f"Bearer {os.environ['TTP_API_KEY']}"},
    json={
        "addresses": [
            {
                "id": "addr_001",
                "text": "Phường Bến Nghé, Quận 1, TP HCM"
            }
        ]
    },
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK

{
    "success": true,
    "message": "Success",
    "data": {
        "total": 1,
        "converted": 1,
        "failed": 0,
        "results": [
            {
                "id": "addr_001",
                "old": {
                    "province": {
                        "code": "79",
                        "name": "Hồ Chí Minh",
                        "type": "Thành phố"
                    },
                    "district": {
                        "code": "760",
                        "name": "1",
                        "type": "Quận"
                    },
                    "ward": {
                        "code": "26740",
                        "name": "Bến Nghé",
                        "type": "Phường"
                    },
                    "fullAddress": "Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh"
                },
                "new": {
                    "province": {
                        "code": "79",
                        "name": "Hồ Chí Minh",
                        "type": "Thành phố",
                        "slug": "tp-ho-chi-minh"
                    },
                    "ward": {
                        "code": "26740",
                        "name": "Sài Gòn",
                        "type": "Phường",
                        "slug": "phuong-sai-gon"
                    },
                    "fullAddress": "Phường Sài Gòn, Thành phố Hồ Chí Minh"
                },
                "confidence": "exact",
                "reason": "merged",
                "candidates": []
            }
        ],
        "errors": []
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}

Tìm kiếm

GET /api/v1/suggest Không cần khoá

Gợi ý cho ô tìm kiếm

Gợi ý tỉnh, xã mới và địa chỉ cũ; hiểu không dấu và viết tắt.

Tham số

q
string · query · bắt buộc
Từ 2 đến 100 ký tự
limit
integer · query
Số kết quả mỗi trang (mặc định 6)
curl 'https://tinhthanhpho.com/api/v1/suggest?q=ben%20nghe' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/suggest?q=ben%20nghe', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/suggest?q=ben%20nghe');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/suggest?q=ben%20nghe",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 422, 429

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "type": "old_ward",
            "code": "26740",
            "name": "Phường Bến Nghé",
            "context": "Quận 1, Thành phố Hồ Chí Minh",
            "province_code": "79",
            "slug": null,
            "target": {
                "code": "26740",
                "name": "Phường Sài Gòn",
                "province_code": "79",
                "fullAddress": "Phường Sài Gòn, Thành phố Hồ Chí Minh",
                "confidence": "exact"
            }
        }
    ],
    "metadata": {
        "data_version": "2026.10.0"
    }
}

Tài khoản

GET /api/v1/profile Cần khoá API

Tài khoản sở hữu khoá API

Trả id, tên, email và ngày tạo của tài khoản sở hữu khoá.

Tham số

Không có tham số.

curl 'https://tinhthanhpho.com/api/v1/profile' \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $TTP_API_KEY"
const response = await fetch('https://tinhthanhpho.com/api/v1/profile', {
  headers: {
    'Accept': 'application/json',
    'Authorization': `Bearer ${process.env.TTP_API_KEY}`,
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/profile');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json', 'Authorization: Bearer ' . getenv('TTP_API_KEY')],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import os
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/profile",
    headers={"Accept": "application/json", "Authorization": f"Bearer {os.environ['TTP_API_KEY']}"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 401

{
    "success": true,
    "message": "Success",
    "data": {
        "id": 42,
        "name": "Nguyễn An",
        "email": "an.nguyen@example.com",
        "created_at": "2026-01-15T08:30:00.000000Z"
    },
    "metadata": {
        "data_version": "2026.10.0"
    }
}

Lịch sử sáp nhập

GET /api/v1/merge-history/province/{code} Không cần khoá

Lịch sử sáp nhập của một tỉnh

Các tỉnh cũ đã hợp nhất vào tỉnh mới (hoặc tỉnh mới mà tỉnh cũ thuộc về).

Tham số

code
string · đường dẫn · bắt buộc
Mã đơn vị hành chính
curl 'https://tinhthanhpho.com/api/v1/merge-history/province/79' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/merge-history/province/79', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/merge-history/province/79');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/merge-history/province/79",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 404

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "id": 53,
            "old_province_code": "79",
            "new_province_code": "79",
            "notes": "Sát nhập từ: Bà Rịa - Vũng Tàu, Bình Dương, Hồ Chí Minh",
            "created_at": null,
            "updated_at": null,
            "legal_ref": null,
            "old_province": {
                "province_id": 50,
                "code": "79",
                "name": "Hồ Chí Minh",
                "type": "Thành phố",
                "created_at": null,
                "updated_at": null,
                "area_km2": null,
                "population": null,
                "district_count": 22
            },
            "new_province": {
                "province_id": 37,
                "code": "79",
                "name": "Hồ Chí Minh",
                "slug": "tp-ho-chi-minh",
                "short_name": null,
                "type": "Thành phố",
                "created_at": null,
                "updated_at": null,
                "area_km2": "6772.59",
                "population": 14002598,
                "hq_address": "Số 86 đường Lê Thánh Tôn, phường Sài Gòn, TP Hồ Chí Minh",
                "legal_refs": [
                    {
                        "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=213930",
                        "date": "2025-06-12",
                        "title": "Nghị quyết về việc sắp xếp đơn vị hành chính cấp tỉnh",
                        "number": "202/2025/QH15",
                        "effective_date": "2025-07-01"
                    }
                ],
                "type_history": null,
                "centroid_lat": 11.163651,
                "centroid_lng": 106.636408,
                "neighbors": [
                    "68"
                ]
            }
        },
        {
            "id": 54,
            "old_province_code": "74",
            "new_province_code": "79",
            "notes": "Sát nhập từ: Bà Rịa - Vũng Tàu, Bình Dương, Hồ Chí Minh",
            "created_at": null,
            "updated_at": null,
            "legal_ref": null,
            "old_province": {
                "province_id": 47,
                "code": "74",
                "name": "Bình Dương",
                "type": "Tỉnh",
                "created_at": null,
                "updated_at": null,
                "area_km2": null,
                "population": null,
                "district_count": 9
            },
            "new_province": {
                "province_id": 37,
                "code": "79",
                "name": "Hồ Chí Minh",
                "slug": "tp-ho-chi-minh",
                "short_name": null,
                "type": "Thành phố",
                "created_at": null,
                "updated_at": null,
                "area_km2": "6772.59",
                "population": 14002598,
                "hq_address": "Số 86 đường Lê Thánh Tôn, phường Sài Gòn, TP Hồ Chí Minh",
                "legal_refs": [
                    {
                        "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=213930",
                        "date": "2025-06-12",
                        "title": "Nghị quyết về việc sắp xếp đơn vị hành chính cấp tỉnh",
                        "number": "202/2025/QH15",
                        "effective_date": "2025-07-01"
                    }
                ],
                "type_history": null,
                "centroid_lat": 11.163651,
                "centroid_lng": 106.636408,
                "neighbors": [
                    "68"
                ]
            }
        }
    ],
    "metadata": {
        "data_version": "2026.10.0"
    }
}
GET /api/v1/merge-history/ward/{code} Không cần khoá

Lịch sử sáp nhập của một xã

Ánh xạ xã cũ → mới, phạm vi (toàn bộ hay một phần) và căn cứ pháp lý.

Tham số

code
string · đường dẫn · bắt buộc
Mã đơn vị hành chính
curl 'https://tinhthanhpho.com/api/v1/merge-history/ward/26740' \
  -H "Accept: application/json"
const response = await fetch('https://tinhthanhpho.com/api/v1/merge-history/ward/26740', {
  headers: {
    'Accept': 'application/json',
  },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init('https://tinhthanhpho.com/api/v1/merge-history/ward/26740');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 10,
    CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($data);
import requests

response = requests.get(
    "https://tinhthanhpho.com/api/v1/merge-history/ward/26740",
    headers={"Accept": "application/json"},
    timeout=10,
)
print(response.json())

Phản hồi · 200 OK · Mã khác: 404

{
    "success": true,
    "message": "Success",
    "data": [
        {
            "id": 8456,
            "old_ward_code": "26737",
            "new_ward_code": "26740",
            "old_district_code": "760",
            "notes": "Nhập một phần",
            "created_at": "2026-10-05T17:58:21.000000Z",
            "updated_at": "2026-10-05T17:58:21.000000Z",
            "scope": "partial",
            "legal_ref": null,
            "note_public": null,
            "is_unchanged": 0,
            "old_ward": {
                "ward_id": 8194,
                "code": "26737",
                "name": "Đa Kao",
                "type": "Phường",
                "district_code": "760",
                "province_code": "79",
                "created_at": null,
                "updated_at": null,
                "district": {
                    "district_id": 541,
                    "code": "760",
                    "name": "1",
                    "type": "Quận",
                    "province_code": "79",
                    "created_at": null,
                    "updated_at": null
                }
            },
            "new_ward": {
                "ward_id": 2625,
                "code": "26740",
                "name": "Sài Gòn",
                "slug": "phuong-sai-gon",
                "short_name": null,
                "type": "Phường",
                "province_code": "79",
                "created_at": null,
                "updated_at": null,
                "area_km2": "3.04",
                "population": 47022,
                "hq_address": "45 - 47 Lê Duẩn, phường Bến Nghé, quận 1 cũ",
                "legal_refs": [
                    {
                        "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=214007",
                        "date": "2025-06-16",
                        "title": "Nghị quyết về việc sắp xếp các đơn vị hành chính cấp xã của thành phố Hồ Chí Minh năm 2025",
                        "number": "1685/NQ-UBTVQH15",
                        "effective_date": "2025-07-01"
                    }
                ],
                "type_history": null,
                "centroid_lat": 10.781051,
                "centroid_lng": 106.703947,
                "neighbors": [
                    "26737"
                ]
            }
        },
        {
            "id": 8457,
            "old_ward_code": "26740",
            "new_ward_code": "26740",
            "old_district_code": "760",
            "notes": "Nhập toàn bộ",
            "created_at": "2026-10-05T17:58:21.000000Z",
            "updated_at": "2026-10-05T17:58:21.000000Z",
            "scope": "full",
            "legal_ref": null,
            "note_public": null,
            "is_unchanged": 0,
            "old_ward": {
                "ward_id": 8195,
                "code": "26740",
                "name": "Bến Nghé",
                "type": "Phường",
                "district_code": "760",
                "province_code": "79",
                "created_at": null,
                "updated_at": null,
                "district": {
                    "district_id": 541,
                    "code": "760",
                    "name": "1",
                    "type": "Quận",
                    "province_code": "79",
                    "created_at": null,
                    "updated_at": null
                }
            },
            "new_ward": {
                "ward_id": 2625,
                "code": "26740",
                "name": "Sài Gòn",
                "slug": "phuong-sai-gon",
                "short_name": null,
                "type": "Phường",
                "province_code": "79",
                "created_at": null,
                "updated_at": null,
                "area_km2": "3.04",
                "population": 47022,
                "hq_address": "45 - 47 Lê Duẩn, phường Bến Nghé, quận 1 cũ",
                "legal_refs": [
                    {
                        "url": "https://vanban.chinhphu.vn/?pageid=27160&docid=214007",
                        "date": "2025-06-16",
                        "title": "Nghị quyết về việc sắp xếp các đơn vị hành chính cấp xã của thành phố Hồ Chí Minh năm 2025",
                        "number": "1685/NQ-UBTVQH15",
                        "effective_date": "2025-07-01"
                    }
                ],
                "type_history": null,
                "centroid_lat": 10.781051,
                "centroid_lng": 106.703947,
                "neighbors": [
                    "26737"
                ]
            }
        }
    ],
    "metadata": {
        "data_version": "2026.10.0"
    }
}

llms.txt — hướng dẫn cho AI

# tinhthanhpho.com

> Đơn vị hành chính Việt Nam trước và sau ngày 1/7/2025 (mô hình 2 cấp: 34 tỉnh/thành, xã/phường/đặc khu, không còn cấp huyện) và công cụ chuyển địa chỉ cũ sang địa chỉ mới. Vietnamese administrative units before and after 1 July 2025, with an old-to-new address converter.

Dữ liệu phiên bản 2026.10.8, cập nhật 06/10/2026. Mã đơn vị theo danh mục của Cục Thống kê; căn cứ là các nghị quyết của Quốc hội và Ủy ban Thường vụ Quốc hội. Khi trích dẫn, ghi nguồn "tinhthanhpho.com" kèm đường dẫn trang.

## Trang
- https://tinhthanhpho.com/{tỉnh}: một tỉnh/thành mới, ví dụ https://tinhthanhpho.com/tp-ho-chi-minh (khối "Tóm tắt nhanh", các tỉnh cũ hợp nhất, danh sách xã/phường)
- https://tinhthanhpho.com/{tỉnh}/{xã}: một xã/phường/đặc khu, ví dụ https://tinhthanhpho.com/tp-ho-chi-minh/phuong-sai-gon (hình thành từ các đơn vị cũ nào, toàn bộ hay một phần)
- Thêm `.json` vào cuối hai dạng đường dẫn trên để lấy cùng dữ liệu dạng JSON
- https://tinhthanhpho.com/en/…: bản tiếng Anh
- https://tinhthanhpho.com/llms-full.txt: danh sách đầy đủ các tỉnh và xã kèm đường dẫn
- https://tinhthanhpho.com/ma-vung-dien-thoai: mã vùng điện thoại cố định của 34 tỉnh/thành, kèm mã của từng tỉnh cũ (Công văn 2784/BKHCN-CVT); `?q=0219` tra ngược từ mã
- https://tinhthanhpho.com/bien-so-xe: ký hiệu biển số xe của 34 tỉnh/thành (Thông tư 51/2025/TT-BCA); `?q=51` tra ngược từ ký hiệu

## API
- https://tinhthanhpho.com/openapi.json: đặc tả OpenAPI
- GET https://tinhthanhpho.com/api/v1/new-provinces: tỉnh/thành mới; /api/v1/new-provinces/{mã}/wards: xã/phường của tỉnh
…

Dữ liệu mở

  • Tỉnh/thành sau 1/7/2025 provinces · CSV 9 KB
  • Xã/phường/đặc khu sau 1/7/2025 wards · CSV 581 KB
  • Bảng ánh xạ xã cũ → mới ward-merge-history · CSV 740 KB
  • Tỉnh/thành trước 1/7/2025 provinces-legacy · CSV 3 KB
  • Quận/huyện trước 1/7/2025 districts-legacy · CSV 20 KB
  • Xã/phường trước 1/7/2025 wards-legacy · CSV 318 KB

Ranh giới xã theo tỉnh: /data/wards-{mã tỉnh}.geojson

Giấy phép CC BY 4.0 — ghi nguồn tinhthanhpho.com