# TSP API — Vietmap API Playground

> Sắp lại thứ tự ghé thăm nhiều điểm sao cho quãng đường ngắn nhất, cho một xe.

TSP API (bài toán người giao hàng) sắp lại thứ tự ghé một danh sách điểm sao cho tổng quãng đường ngắn nhất, cho một xe. Có thể cố định điểm xuất phát, điểm kết thúc, hoặc yêu cầu quay về điểm đầu; kết quả trả thứ tự ghé tối ưu cùng đường đi. Khi có nhiều xe, tải trọng hay khung giờ, hãy dùng VRP.

Dùng để làm gì:
- Sắp thứ tự giao hàng trong ngày cho một shipper.
- Lộ trình thăm khách của nhân viên kinh doanh.
- Tuyến thu gom, kiểm tra thiết bị theo vòng.
- Lịch trình tham quan nhiều điểm trong ngày.

- Trang tương tác: https://tools.vietmap.vn/playground/tsp
- Endpoint: `GET /api/tsp/v4` trên `https://maps.vietmap.vn`
- Tài liệu chính thức: https://maps.vietmap.vn/docs/map-api/tsp-version/tsp-v4/
- API key: mọi request cần tham số `apikey`. Code mẫu dùng `YOUR_API_KEY` làm chỗ giữ key — khi tích hợp, đọc key từ biến môi trường (ví dụ `VIETMAP_API_KEY`). Lấy key tại https://maps.vietmap.vn/console-v2/consumers
- Mã lỗi: `401` sai API key · `403` key bị giới hạn domain/IP · `423` API chưa bật cho consumer của key, hoặc hết credit (phản hồi có "exceeded credit") · `429` vượt giới hạn tần suất.

## Code mẫu

_Đây là request ví dụ với tham số mẫu; mở trang tương tác để đổi tham số và chạy thật._

### cURL

```bash
curl 'https://maps.vietmap.vn/api/tsp/v4?apikey=YOUR_API_KEY&point=10.7768,106.7009&point=10.80189,106.7066&point=10.7725,106.6828&point=10.80159,106.68982&point=10.7839,106.6911&point=10.79628,106.70592&points_encoded=false&vehicle=car&roundtrip=false&sources=first&destinations=any'
```

### JavaScript

```javascript
// Khi đưa vào sản phẩm, đọc key từ biến môi trường thay vì ghi cứng.
const API_KEY = "YOUR_API_KEY";

const params = new URLSearchParams([
  ["apikey", API_KEY],
  ["point", "10.7768,106.7009"],
  ["point", "10.80189,106.7066"],
  ["point", "10.7725,106.6828"],
  ["point", "10.80159,106.68982"],
  ["point", "10.7839,106.6911"],
  ["point", "10.79628,106.70592"],
  ["points_encoded", "false"],
  ["vehicle", "car"],
  ["roundtrip", "false"],
  ["sources", "first"],
  ["destinations", "any"],
]);

const response = await fetch(`https://maps.vietmap.vn/api/tsp/v4?${params}`);
if (!response.ok) {
  throw new Error(`Vietmap ${response.status}: ${await response.text()}`);
}
const data = await response.json();
console.log(data);
```

### Python

```python
import requests

# Khi đưa vào sản phẩm, đọc key từ biến môi trường thay vì ghi cứng.
API_KEY = "YOUR_API_KEY"

params = [
    ("apikey", API_KEY),
    ("point", "10.7768,106.7009"),
    ("point", "10.80189,106.7066"),
    ("point", "10.7725,106.6828"),
    ("point", "10.80159,106.68982"),
    ("point", "10.7839,106.6911"),
    ("point", "10.79628,106.70592"),
    ("points_encoded", "false"),
    ("vehicle", "car"),
    ("roundtrip", "false"),
    ("sources", "first"),
    ("destinations", "any"),
]

response = requests.get("https://maps.vietmap.vn/api/tsp/v4", params=params, timeout=30)
response.raise_for_status()
print(response.json())
```

### URL

```text
https://maps.vietmap.vn/api/tsp/v4?apikey=YOUR_API_KEY&point=10.7768,106.7009&point=10.80189,106.7066&point=10.7725,106.6828&point=10.80159,106.68982&point=10.7839,106.6911&point=10.79628,106.70592&points_encoded=false&vehicle=car&roundtrip=false&sources=first&destinations=any
```

## AI prompt

Prompt soạn sẵn để giao cho trợ lý lập trình (ChatGPT, Claude, Copilot…) viết code tích hợp API này:

````text
Tôi cần tích hợp TSP API v4 của Vietmap vào ứng dụng của mình.

Tài liệu chính thức: https://maps.vietmap.vn/docs/map-api/tsp-version/tsp-v4/

Đây là một request mẫu đã chạy được trên Vietmap API Playground:

GET https://maps.vietmap.vn/api/tsp/v4?apikey=YOUR_API_KEY&point=10.7768,106.7009&point=10.80189,106.7066&point=10.7725,106.6828&point=10.80159,106.68982&point=10.7839,106.6911&point=10.79628,106.70592&points_encoded=false&vehicle=car&roundtrip=false&sources=first&destinations=any

Tham số đang dùng:
- point = 10.7768,106.7009
- point = 10.80189,106.7066
- point = 10.7725,106.6828
- point = 10.80159,106.68982
- point = 10.7839,106.6911
- point = 10.79628,106.70592
- points_encoded = false
- vehicle = car
- roundtrip = false
- sources = first
- destinations = any

Hãy viết code bằng [ngôn ngữ / framework của tôi] để gọi API này, với các yêu cầu:
1. Đọc API key từ biến môi trường VIETMAP_API_KEY, không ghi cứng trong code.
2. Truyền tham số qua query string đúng như request mẫu; tham số lặp lại (như `point`) phải giữ nguyên thứ tự.
3. Xử lý lỗi theo mã HTTP của Vietmap:
   - 401: API key sai hoặc đã bị thu hồi.
   - 403: key bị giới hạn theo domain / IP không khớp.
   - 423: API chưa được bật cho consumer của key, HOẶC tài khoản hết credit — phân biệt bằng nội dung phản hồi (có cụm "exceeded credit" là hết credit).
   - 429: vượt giới hạn tần suất — thử lại với backoff tăng dần.
4. Đặt timeout cho request, và định nghĩa kiểu dữ liệu (type / interface / dataclass) cho phản hồi.

Nếu không chắc tên một trường, tra trong tài liệu ở link trên thay vì đoán.
````

## Mở lại đúng request này trong Playground

https://tools.vietmap.vn/playground/tsp?point=10.7768,106.7009&point=10.80189,106.7066&point=10.7725,106.6828&point=10.80159,106.68982&point=10.7839,106.6911&point=10.79628,106.70592&vehicle=car&sources=first
