이 기술 문서는 현재 베트남어로만 제공됩니다.

Tài liệu kỹ thuật

Kết nối API

API v1 · Cập nhật 31/10/2026

Trang này dành cho đội kỹ thuật của đại lý, đơn vị vận hành lưu trú và đối tác dịch vụ muốn nối phần mềm của mình vào hệ thống The An Second-Home: xem tình trạng, giữ chỗ, gửi khách tiềm năng, nhận thông báo tự động khi có thay đổi.

1. Xin kết nối

Kết nối chỉ cấp cho tổ chức đã ký thỏa thuận với The An. Gửi đề nghị tới support@secondhome.vn, ghi tên tổ chức, phần mềm sẽ kết nối, việc cần làm và email đầu mối kỹ thuật.

Khi được duyệt, bạn nhận trong một gói riêng:

  • Mã kết nối và bí mật. Bí mật chỉ trao một lần và có hạn dùng.
  • Địa chỉ gọi và danh sách việc được mở cho kết nối của bạn.
  • Tài liệu đầy đủ và tệp openapi.json (OpenAPI 3.1) mô tả từng đường gọi, nạp thẳng vào Postman hay bộ sinh mã.
  • Khoá kiểm thông báo, nếu bạn đăng ký nhận thông báo tự động.

Mỗi phần mềm một kết nối. Bạn có hai hệ thống thì xin hai kết nối.

2. Lấy token

Đăng nhập theo chuẩn OAuth 2 client credentials; thư viện OAuth nào cũng dùng được.

curl -s https://agent.secondhome.vn/api/v1/oauth/token \
  -d grant_type=client_credentials \
  -d client_id="$CLIENT_ID" \
  -d client_secret="$CLIENT_SECRET"
{
  "access_token": "...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "scope": "..."
}
  • Mã kết nối và bí mật cũng gửi được bằng header Authorization: Basic.
  • Token sống 1 giờ. Giữ lại và dùng cho mọi lượt gọi tới khi gần hết hạn; đừng lấy token mới cho từng lượt gọi, hệ thống giới hạn số token còn hạn của một kết nối.
  • Không có refresh token. Hết hạn thì gọi lại đường này.
  • Gửi token ở header Authorization: Bearer <token> cho mọi lượt gọi khác.
  • Bí mật cất ở kho bí mật của máy chủ. Không để trong mã nguồn, ứng dụng di động hay trình duyệt.

3. Khung trả lời

Mọi trả lời, trừ đường token, theo một khung:

{ "ok": true, "data": { } }
{ "ok": false, "loi": { "ma": "...", "thongDiep": "..." } }
  • Rẽ nhánh theo loi.ma, không theo thongDiep: câu chữ có thể đổi, mã thì không.
  • Tiền luôn là chuỗi thập phân, ví dụ "125000000", không phải số.
  • Mỗi trả lời có header X-Request-Id. Khi báo lỗi, gửi kèm mã ấy.
  • API v1 không xoá trường, không đổi kiểu, không đổi nghĩa mã lỗi. Trường mới có thể được thêm: phần mềm của bạn bỏ qua trường không biết.

4. Gửi lại an toàn

Mạng rớt giữa chừng thì bạn không biết lượt ghi đã vào chưa. Vì vậy mọi lượt ghi nên kèm header Idempotency-Key: 8 đến 200 ký tự ASCII, không khoảng trắng, mỗi việc một khoá do bạn tự sinh.

  • Gửi lại cùng khoá và cùng thân trong 24 giờ: nhận đúng trả lời của lượt đầu, kèm header Idempotent-Replayed: true. Không có gì chạy lần hai.
  • Cùng khoá mà khác thân: 422.
  • Lượt đầu chưa xong: 409. Chờ vài giây rồi gửi lại.
  • Lỗi 5xx: gửi lại bằng cùng khoá.

5. Hạn mức

Mỗi kết nối có hạn mức lượt đọc và lượt ghi theo phút, tính chung cho mọi token; con số cụ thể ghi trong gói trao kết nối. Vượt thì nhận 429 kèm header Retry-After (số giây). Chờ đúng số giây ấy rồi gọi tiếp.

Đừng hỏi lại danh sách mỗi vài giây để biết thứ gì đã đổi. Dùng thông báo tự động ở mục 6.

6. Nhận thông báo tự động

Bạn đưa The An một địa chỉ https:// công khai. Khi có thay đổi thuộc tổ chức bạn, hệ thống gửi:

POST <địa chỉ của bạn>
Content-Type: application/json
X-Tash-Event: <loại thông báo>
X-Tash-Delivery: <mã lượt gửi>
X-Tash-Timestamp: <giây Unix>
X-Tash-Signature: v1=<hex>

{ "id": "<mã lượt gửi>", "loai": "<loại thông báo>", "luc": "<thời điểm ISO 8601>", ... }

Máy chủ của bạn làm bốn việc:

  1. Tính HMAC-SHA256(khoá kiểm thông báo, "<X-Tash-Timestamp>.<thân thô>") dạng hex, so với phần sau v1=. Không khớp thì bỏ. Tính trên thân thô nhận được, không tính trên JSON đã đọc rồi ghi lại.
  2. Bỏ thư có X-Tash-Timestamp lệch quá 5 phút so với giờ của bạn.
  3. Đã thấy X-Tash-Delivery này rồi thì trả 2xx và không xử lý lại.
  4. Trả 2xx trong 10 giây. Việc nặng thì xếp hàng làm sau.
import { createHmac, timingSafeEqual } from 'node:crypto'

function chuKyDung(thanTho, headers, khoa) {
  const giay = headers['x-tash-timestamp']
  if (Math.abs(Date.now() / 1000 - Number(giay)) > 300) return false
  const mong = createHmac('sha256', khoa).update(`${giay}.${thanTho}`).digest('hex')
  const nhan = String(headers['x-tash-signature'] ?? '').replace(/^v1=/, '')
  return mong.length === nhan.length && timingSafeEqual(Buffer.from(mong), Buffer.from(nhan))
}

Không nhận được 2xx thì hệ thống thử lại nhiều lần, giãn dần trong khoảng hai ngày, rồi dừng. Thư có thể đến trễ hoặc sai thứ tự: lấy luc làm mốc, và gọi API khi cần trạng thái chắc chắn. Thư không mang thông tin cá nhân của khách. Thư thử có "loai": "thu".

7. Nhóm lỗi

Mã loi.ma cụ thể của từng đường gọi có trong tài liệu đầy đủ. Theo nhóm HTTP:

401
Token sai hoặc hết hạn, hay kết nối đã bị thu hồi
Lấy token mới; vẫn 401 thì liên hệ hỗ trợ
403
Kết nối chưa được mở việc này, hoặc đối tượng không thuộc tổ chức bạn
Không gọi lại; cần mở thêm thì liên hệ hỗ trợ
404
Không có, hoặc ngoài phạm vi của kết nối
Kiểm địa chỉ gọi và mã đối tượng
409
Xung đột trạng thái, hoặc lượt đầu cùng Idempotency-Key chưa xong
Xem lại tình trạng; chờ vài giây rồi gửi lại
422
Thân lượt gọi sai; thongDiep chỉ trường sai
Sửa thân rồi gửi lại
429
Vượt hạn mức
Chờ đúng số giây ở Retry-After
5xx
Lỗi tạm ở máy chủ
Gửi lại sau, cùng Idempotency-Key

8. Kiểm trước khi chạy thật

  • Bí mật nằm ở kho bí mật của máy chủ, không trong mã nguồn, không trong ứng dụng chạy trên máy người dùng.
  • Token được giữ lại và dùng chung, không lấy mới cho từng lượt gọi.
  • Mọi lượt ghi có Idempotency-Key, và phần mềm gửi lại khi gặp lỗi mạng hay 5xx.
  • Gặp 429 thì chờ theo Retry-After.
  • Giá hiện cho khách là giá hệ thống trả về.
  • Nơi nhận thông báo kiểm chữ ký, kiểm giờ, bỏ thư trùng, trả 2xx nhanh.
  • Đã gửi support@secondhome.vn email đầu mối kỹ thuật, để nhận thông báo khi đổi bí mật hay thu hồi kết nối.

9. Hỗ trợ kỹ thuật

Mọi yêu cầu về kết nối gửi về support@secondhome.vn: xin kết nối, báo lỗi, xin mở thêm việc, đăng ký hay đổi địa chỉ nhận thông báo, đổi bí mật.

Khi báo lỗi, gửi kèm tên tổ chức, mã kết nối, X-Request-Id của lượt gọi lỗi, thời điểm gọi và mã lỗi nhận được. Không gửi bí mật, token hay khoá kiểm thông báo qua email.

Nghi bí mật bị lộ: báo ngay để thu hồi và cấp lại. Khi The An cấp bí mật mới, bí mật cũ còn dùng được một thời gian để bạn đổi mà không đứt kết nối.