Danh sách đường phố theo phường/xã API
Liệt kê và tìm tên đường, phố, ngõ, hẻm của từng phường/xã và tỉnh mới từ OpenStreetMap, tìm được cả khi gõ không dấu.
Dữ liệu địa chỉ đến cấp tên đường cho 34 tỉnh, thành và 3.321 phường / xã / đặc khu áp dụng từ 1/7/2025. ward=<mã hoặc tên> liệt kê các đường của một phường/xã (đường phố trước, ngõ / hẻm / kiệt sau), province=<mã hoặc tên> liệt kê mọi tuyến đường của một tỉnh kèm các phường/xã mà đường đi qua, còn q tìm theo tên: không phân biệt dấu và hoa thường (le loi ra “Đường Lê Lợi”), bỏ qua chữ chung như đường, phố, ngõ, hẻm, kết quả đúng dấu được xếp trước. Chỉ dùng q thì tìm trên cả nước và trả về các tỉnh có tên đường đó. Lọc theo type (street, alley cho ngõ/hẻm, bridge cho cầu, road cho đường có số hiệu như QL1A), phân trang bằng limit và offset.
Mỗi tuyến đường có loại đường theo OpenStreetMap, chiều dài gần đúng trong phạm vi phường/xã, một điểm đại diện (lat / lng) và đường dẫn tới một way trên OSM. Dữ liệu lấy từ OpenStreetMap (bản trích Việt Nam của Geofabrik), dựng lại hằng tháng: từng đoạn của đường có tên được gán vào phường/xã bằng phép điểm-trong-đa-giác trên cùng bộ ranh giới rút gọn của /v1/vn-geo, nên một con đường dài có mặt ở mọi phường mà nó đi qua, còn đường chỉ chạm ranh giới thì không bị tính.
Độ phủ phụ thuộc OpenStreetMap: dày ở Hà Nội, TP.HCM, Đà Nẵng và các đô thị (tổng cộng khoảng 118.000 cặp phường – đường), thưa ở xã nông thôn, miền núi, nơi nhiều con đường chưa được đặt tên trên OSM. Dữ liệu © OpenStreetMap contributors theo giấy phép ODbL 1.0: mọi phản hồi đều kèm ghi công, và bản sao danh sách khi phân phối lại phải giữ ghi công và dùng cùng giấy phép ODbL.
Tham số
| Tên | Vị trí | Kiểu | Bắt buộc | Mặc định | |
|---|---|---|---|---|---|
ward | query | string | không | Phường/xã: mã 5 chữ số (ví dụ 00070) hoặc tên (Phường Hoàn Kiếm, thêm province khi tên trùng ở nhiều tỉnh). Có thể đặt trong đường dẫn: /v1/vn-streets/00070. | |
province | query | string | không | Mã tỉnh (01, 79) hoặc tên (Hà Nội, hcm). Dùng riêng: mọi tuyến đường của tỉnh kèm các phường/xã. | |
q | query | string | không | Tên cần tìm, có dấu hoặc không dấu (tối đa 100 ký tự). Dùng riêng: tìm trên cả nước. | |
type | query | string | không | all | street, alley (ngõ, ngách, hẻm, kiệt), bridge (cầu), road (đường có số hiệu) hoặc all. |
limit | query | number | không | 1000 | Số kết quả tối đa (1–5000; mặc định 50 khi có q, 1000 khi không). |
offset | query | number | không | 0 | Bỏ qua bấy nhiêu kết quả (phân trang). |
Ví dụ
curl "https://apibox.io.vn/v1/vn-streets?ward=00070&q=hang&limit=3" \
-H "Authorization: Bearer YOUR_API_KEY"const res = await fetch('https://apibox.io.vn/v1/vn-streets?ward=00070&q=hang&limit=3', {
method: 'GET',
headers: {
Authorization: 'Bearer YOUR_API_KEY',
},
});
const data = await res.json();
console.log(data);import requests
res = requests.get(
"https://apibox.io.vn/v1/vn-streets?ward=00070&q=hang&limit=3",
headers={"Authorization": "Bearer YOUR_API_KEY"},
timeout=30,
)
print(res.json())<?php
$ch = curl_init('https://apibox.io.vn/v1/vn-streets?ward=00070&q=hang&limit=3');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer YOUR_API_KEY'],
]);
$response = curl_exec($ch);
print_r(json_decode($response, true));Kết quả trả về
{
"ward": {
"code": "00070",
"name": "Phường Hoàn Kiếm",
"province_code": "01",
"province": "Thành phố Hà Nội"
},
"total": 55,
"offset": 0,
"count": 3,
"streets": [
{
"name": "Hàng Cân",
"name_ascii": "hang can",
"type": "street",
"highway": "tertiary",
"length_m": 157,
"lat": 21.03465,
"lng": 105.84967,
"osm_way": "https://www.openstreetmap.org/way/28102774"
},
{
"name": "Phố Hàng Bè",
"name_ascii": "pho hang be",
"type": "street",
"highway": "residential",
"length_m": 177,
"lat": 21.03264,
"lng": 105.85382,
"osm_way": "https://www.openstreetmap.org/way/399591853"
},
{
"name": "Phố Hàng Bồ",
"name_ascii": "pho hang bo",
"type": "street",
"highway": "residential",
"length_m": 285,
"lat": 21.03382,
"lng": 105.84815,
"osm_way": "https://www.openstreetmap.org/way/28103110"
}
],
"attribution": "© OpenStreetMap contributors",
"licence": "ODbL-1.0",
"licence_url": "https://www.openstreetmap.org/copyright",
"licence_note": "Street data © OpenStreetMap contributors, available under the Open Database License. This list is a derived database: if you redistribute it (or a substantial extract), credit OpenStreetMap and share it under the ODbL.",
"coverage_note": "Only streets that carry a name in OpenStreetMap are listed; coverage is good in cities and incomplete in rural and mountainous areas. Wards are assigned from simplified boundaries, so streets on a ward border can appear in both wards.",
"data": {
"version": "20261111",
"osm_timestamp": "2026-11-09T21:22:17.000Z",
"built_at": "2026-11-11T03:01:14.154Z",
"admin_version": "v5.2.0",
"refresh": "monthly"
}
}
Ứng dụng
- Gợi ý tên đường trong form địa chỉ đặt hàng, giao hàng
- Kiểm tra tên đường có thuộc phường/xã mới đã chọn
- Làm bộ chọn đường theo phường cho CRM, phần mềm vận chuyển
- Đối chiếu địa chỉ cũ sang phường mới theo tên đường
Hỏi đáp
Vì sao không thấy tên đường của tôi?
Chỉ những con đường đã có tên trên OpenStreetMap mới được liệt kê. Bạn có thể bổ sung tên trên openstreetmap.org; tên sẽ xuất hiện sau lần dựng dữ liệu hằng tháng tiếp theo.
Vì sao một con đường thuộc hai phường?
Đường dài đi qua nhiều phường nên được liệt kê ở từng phường, kèm chiều dài trong phường đó. Đường nằm đúng trên ranh giới có thể xuất hiện ở cả hai bên.
Tôi có được tải về và dùng lại danh sách không?
Được, theo giấy phép ODbL: ghi “© OpenStreetMap contributors” và chia sẻ bản cơ sở dữ liệu phân phối lại theo cùng giấy phép.
API liên quan
Kiểm tra JSON
Kiểm tra cú pháp JSON, báo đúng dòng và cột bị lỗi, và validate dữ liệu theo JSON Schema (draft 4, 7, 2019-09 hoặc 2020-12).
{ }Định dạng JSON
Làm đẹp JSON với thụt lề 0-8 dấu cách hoặc tab, rút gọn (minify) hoặc sắp xếp key theo bảng chữ cái. Báo lỗi cú pháp kèm dòng và cột.
CSVCSV sang JSON
Chuyển CSV thành mảng object JSON theo dòng tiêu đề, tự nhận dấu phân cách, tự chuyển số và boolean, báo lỗi từng dòng.