Thiết bị
thiet biThiết bị chuyển tiếp tin (Android, iOS Shortcuts): mã ghép, trạng thái, lệnh kiểm tra, nhật ký, quy tắc cảnh báo và bản phát hành ứng dụng. thiet bi chuyen tiep tin (android, ios shortcuts): ma ghep, trang thai, lenh kiem tra, nhat ky, quy tac canh bao va ban phat hanh ung dung.Thiết bị chuyển tiếp tin (Android, iOS Shortcuts): mã ghép, trạng thái, lệnh kiểm tra, nhật ký, quy tắc cảnh báo và bản phát hành ứng dụng.
Endpoint
Phần tiêu đề “Endpoint”| Method | Path | Tóm tắt | Quyền | Nhóm tốc độ | Tương tác |
|---|---|---|---|---|---|
GET | /v1/app/android/latest | Bản app Android mới nhất | Công khai, không cần khoá | read | Scalar |
GET | /v1/app/ios-shortcut/latest | Bản Shortcut iPhone mới nhất | Công khai, không cần khoá | read | Scalar |
GET | /v1/banks/ios-keywords | Từ khoá automation iPhone theo ngân hàng | device.read | read | Scalar |
GET | /v1/device-alert-rules | Quy tắc cảnh báo thiết bị | device.read | read | Scalar |
PUT | /v1/device-alert-rules | Lưu quy tắc cảnh báo thiết bị | notify.org_rule.manage | write | Scalar |
GET | /v1/devices | Danh sách thiết bị | device.read | read | Scalar |
POST | /v1/devices | Tạo thiết bị iPhone (Shortcuts) | device.manage | write | Scalar |
POST | /v1/devices/pairing-codes | Tạo mã ghép thiết bị Android | device.manage | write | Scalar |
GET | /v1/devices/{id} | Chi tiết thiết bị | device.read | read | Scalar |
PATCH | /v1/devices/{id} | Cập nhật thiết bị | device.manage | write | Scalar |
DELETE | /v1/devices/{id} | Gỡ thiết bị | device.manage | write | Scalar |
PATCH | /v1/devices/{id}/accounts/{account_id} | Bật/tắt "Tính giao dịch iOS là đã xác thực" cho một tài khoản | device.manage | write | Scalar |
GET | /v1/devices/{id}/banks | Automation theo ngân hàng của iPhone | device.read | read | Scalar |
PATCH | /v1/devices/{id}/banks/{bank_code} | Đánh dấu đã tạo automation cho ngân hàng | device.manage | write | Scalar |
GET | /v1/devices/{id}/events | Nhật ký thiết bị | device.read | read | Scalar |
GET | /v1/devices/{id}/queue | Hàng đợi tin chờ gửi trên thiết bị | device.read_queue | read | Scalar |
POST | /v1/devices/{id}/test-sms | Gửi tin thử qua iPhone | device.manage | write | Scalar |
GET | /v1/devices/{id}/test-stream | Theo dõi lần gửi thử (SSE) | device.read | read | Scalar |
POST | /v1/devices/{id}:nudge | Nhắc người phụ trách thiết bị | device.manage | write | Scalar |
POST | /v1/devices/{id}:ping | Gửi lệnh kiểm tra tới thiết bị | device.manage | write | Scalar |
POST | /v1/devices/{id}:restore-trust | Xoay token và tin cậy lại iPhone | device.manage | write | Scalar |
POST | /v1/devices/{id}:rotate-token | Xoay token iPhone | device.manage | write | Scalar |
Chi tiết endpoint
Phần tiêu đề “Chi tiết endpoint”GET /v1/app/android/latest
Phần tiêu đề “GET /v1/app/android/latest”Bản app Android mới nhất
Công khai, không cần xác thực. Chỉ trả bản đang staged/stable/mandatory; bản halted bị bỏ qua (trả bản ổn định trước đó). Máy chỉ cài khi qua cổng rollout theo băm device_id và chữ ký Ed25519 hợp lệ. Chưa có bản nào → 404 resource_not_found.
- Nhóm tốc độ:
read - Phản hồi thành công
200: Manifest. —AndroidReleaseManifest,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
channel | query | Không | string | — |
curl -sS -X GET "https://api.dongtien.pro/v1/app/android/latest"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/app/android/latest");import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import get_android_latest
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_android_latest.sync(client=dt.client)GET /v1/app/ios-shortcut/latest
Phần tiêu đề “GET /v1/app/ios-shortcut/latest”Bản Shortcut iPhone mới nhất
Công khai. Chỉ trả bản staged/stable/mandatory mới nhất; chưa có bản nào → 404 resource_not_found. Liên kết iCloud do quy trình phát hành (ký trên macOS) đặt.
- Nhóm tốc độ:
read - Phản hồi thành công
200: Manifest. —IosShortcutRelease,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
curl -sS -X GET "https://api.dongtien.pro/v1/app/ios-shortcut/latest"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/app/ios-shortcut/latest");import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import get_ios_shortcut_latest
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_ios_shortcut_latest.sync(client=dt.client)GET /v1/banks/ios-keywords
Phần tiêu đề “GET /v1/banks/ios-keywords”Từ khoá automation iPhone theo ngân hàng
Danh mục chung (không theo công ty): từ khoá mà tin biến động số dư của từng ngân hàng luôn chứa, dùng cho bước "Tạo automation". Từ khoá chỉ để bắt tin, không tham gia xác thực nguồn.
Quyền: device.read- Nhóm tốc độ:
read - Phản hồi thành công
200: Danh sách. —IosBankKeywordList,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
curl -sS -X GET "https://api.dongtien.pro/v1/banks/ios-keywords" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/banks/ios-keywords");import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import list_ios_bank_keywords
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_ios_bank_keywords.sync(client=dt.client)GET /v1/device-alert-rules
Phần tiêu đề “GET /v1/device-alert-rules”Quy tắc cảnh báo thiết bị
Chưa lưu thì trả mặc định (updated_at = null).
- Nhóm tốc độ:
read - Phản hồi thành công
200: Quy tắc. —DeviceAlertRules,application/json - Mã lỗi: chỉ các mã lỗi chung ở Tổng quan
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
company_id | query | Không | OrgId | Mã công ty / tổ chức (org_…). |
curl -sS -X GET "https://api.dongtien.pro/v1/device-alert-rules" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/device-alert-rules");import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import get_device_alert_rules
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_device_alert_rules.sync(client=dt.client)PUT /v1/device-alert-rules
Phần tiêu đề “PUT /v1/device-alert-rules”Lưu quy tắc cảnh báo thiết bị
Thay toàn bộ quy tắc của công ty (company_id trong thân).
- Nhóm tốc độ:
write - Nội dung yêu cầu:
PutDeviceAlertRules(application/json, bắt buộc) - Phản hồi thành công
200: Quy tắc sau khi lưu. —DeviceAlertRules,application/json - Mã lỗi riêng của endpoint:
conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X PUT "https://api.dongtien.pro/v1/device-alert-rules" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "company_id": "org_01hz8x9k3m4n5p6q7r8s9t0v1w", "no_heartbeat_min": 15, "battery_lt": 20, "queue_gt": 10, "queue_age_min": 30, "ios_silent_hours": 36, "channels": [ "zalo", "push" ], "enabled": { "no_heartbeat": true, "battery": true, "queue": true, "ios_silent": true }}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.PUT("/v1/device-alert-rules", { body: { "company_id": "org_01hz8x9k3m4n5p6q7r8s9t0v1w", "no_heartbeat_min": 15, "battery_lt": 20, "queue_gt": 10, "queue_age_min": 30, "ios_silent_hours": 36, "channels": [ "zalo", "push" ], "enabled": { "no_heartbeat": true, "battery": true, "queue": true, "ios_silent": true } },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import put_device_alert_rulesfrom dongtien_api.models import PutDeviceAlertRules
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = put_device_alert_rules.sync( client=dt.client, body=PutDeviceAlertRules.from_dict({ "company_id": "org_01hz8x9k3m4n5p6q7r8s9t0v1w", "no_heartbeat_min": 15, "battery_lt": 20, "queue_gt": 10, "queue_age_min": 30, "ios_silent_hours": 36, "channels": [ "zalo", "push", ], "enabled": { "no_heartbeat": True, "battery": True, "queue": True, "ios_silent": True, }, }), )GET /v1/devices
Phần tiêu đề “GET /v1/devices”Danh sách thiết bị
Thiết bị trong phạm vi của thông tin xác thực. Heartbeat sống ở Durable Object, Postgres chỉ rollup mỗi 60 s nên last_seen_at có thể trễ tới 1 phút.
- Nhóm tốc độ:
read - Phản hồi thành công
200: Danh sách. —DeviceList,application/json - Mã lỗi riêng của endpoint:
invalid_cursor
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
limit | query | Không | integer | Số phần tử mỗi trang (1–100, mặc định 20). |
cursor | query | Không | Cursor | Con trỏ phân trang mờ (cur_…) lấy từ next_cursor; không tự tạo hay sửa. |
company_id | query | Không | OrgId | Mã công ty / tổ chức (org_…). |
kind | query | Không | DeviceKind | — |
state | query | Không | DeviceState | — |
q | query | Không | string | Tìm theo tên/model thiết bị. |
include_revoked | query | Không | boolean | null | — |
curl -sS -X GET "https://api.dongtien.pro/v1/devices" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/devices");import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import list_devices
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_devices.sync(client=dt.client)POST /v1/devices
Phần tiêu đề “POST /v1/devices”Tạo thiết bị iPhone (Shortcuts)
Tạo thiết bị ở trạng thái pending_pair (hết hạn sau 24 giờ nếu chưa nhận được tin nào) và trả token dtd_… MỘT LẦN. Không dùng Idempotency-Key (kết quả là bí mật). Ghi nhật ký kiểm toán device.create.
- Nhóm tốc độ:
write - Nội dung yêu cầu:
CreateIosDevice(application/json, bắt buộc) - Phản hồi thành công
201: Đã tạo; có token. —IosDeviceCredential,application/json - Mã lỗi riêng của endpoint:
conflict
curl -sS -X POST "https://api.dongtien.pro/v1/devices" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yzd", "kind": "ios_shortcut", "name": "iPhone quầy 1"}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/devices", { body: { "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yzd", "kind": "ios_shortcut", "name": "iPhone quầy 1" },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import create_ios_devicefrom dongtien_api.models import CreateIosDevice
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = create_ios_device.sync( client=dt.client, body=CreateIosDevice.from_dict({ "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yzd", "kind": "ios_shortcut", "name": "iPhone quầy 1", }), )POST /v1/devices/pairing-codes
Phần tiêu đề “POST /v1/devices/pairing-codes”Tạo mã ghép thiết bị Android
Mã PAIR-XXXX-XXXX (Crockford 40 bit) hiệu lực 5 phút, dùng một lần; máy sai mã 5 lần thì mã bị khoá. Tạo mã mới vô hiệu mọi mã chưa dùng cùng (tổ chức, loại). Mã chỉ lưu dạng băm HMAC nên không xem lại được. Không dùng Idempotency-Key (kết quả là bí mật).
- Nhóm tốc độ:
write - Nội dung yêu cầu:
CreateDevicePairingCode(application/json, bắt buộc) - Phản hồi thành công
201: Mã ghép mới. —DevicePairingCode,application/json - Mã lỗi riêng của endpoint:
conflict
curl -sS -X POST "https://api.dongtien.pro/v1/devices/pairing-codes" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yz0", "kind": "android", "account_ids": [ "acc_0f5k2m9q4h7t3n8r6v1w0x5yz0" ]}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/devices/pairing-codes", { body: { "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yz0", "kind": "android", "account_ids": [ "acc_0f5k2m9q4h7t3n8r6v1w0x5yz0" ] },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import create_device_pairing_codefrom dongtien_api.models import CreateDevicePairingCode
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = create_device_pairing_code.sync( client=dt.client, body=CreateDevicePairingCode.from_dict({ "company_id": "org_0f5k2m9q4h7t3n8r6v1w0x5yz0", "kind": "android", "account_ids": [ "acc_0f5k2m9q4h7t3n8r6v1w0x5yz0", ], }), )GET /v1/devices/{id}
Phần tiêu đề “GET /v1/devices/{id}”Chi tiết thiết bị
Quyền: device.read- Nhóm tốc độ:
read - Phản hồi thành công
200: Thiết bị. —Device,application/json - Mã lỗi riêng của endpoint:
resource_not_found
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
curl -sS -X GET "https://api.dongtien.pro/v1/devices/$ID" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/devices/{id}", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import get_device
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_device.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)PATCH /v1/devices/{id}
Phần tiêu đề “PATCH /v1/devices/{id}”Cập nhật thiết bị
Đổi tên, người phụ trách, tài khoản phụ trách hoặc tắt bớt nguồn. Đổi nguồn tăng config_version; máy nhận cấu hình mới ở heartbeat kế tiếp.
- Nhóm tốc độ:
write - Nội dung yêu cầu:
UpdateDevice(application/json, bắt buộc) - Phản hồi thành công
200: Sau cập nhật. —Device,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X PATCH "https://api.dongtien.pro/v1/devices/$ID" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "responsible_user_id": "usr_0f5k2m9q4h7t3n8r6v1w0x5yz0", "account_ids": [ "acc_0f5k2m9q4h7t3n8r6v1w0x5yz0" ], "sources": [ { "kind": "app_package" } ]}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.PATCH("/v1/devices/{id}", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, }, body: { "responsible_user_id": "usr_0f5k2m9q4h7t3n8r6v1w0x5yz0", "account_ids": [ "acc_0f5k2m9q4h7t3n8r6v1w0x5yz0" ], "sources": [ { "kind": "app_package" } ] },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import update_devicefrom dongtien_api.models import UpdateDevice
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = update_device.sync( id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client, body=UpdateDevice.from_dict({ "responsible_user_id": "usr_0f5k2m9q4h7t3n8r6v1w0x5yz0", "account_ids": [ "acc_0f5k2m9q4h7t3n8r6v1w0x5yz0", ], "sources": [ { "kind": "app_package", }, ], }), )DELETE /v1/devices/{id}
Phần tiêu đề “DELETE /v1/devices/{id}”Gỡ thiết bị
Thu hồi ngay: request kế tiếp của máy nhận 401 device_revoked (≤ 5 giây); tin còn trong hàng đợi của máy sẽ không được nhận. Ghi nhật ký kiểm toán device.revoke. Gỡ lại thiết bị đã gỡ trả 409 conflict.
- Nhóm tốc độ:
write - Phản hồi thành công
200: Thiết bị sau khi gỡ (state = revoked). —Device,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X DELETE "https://api.dongtien.pro/v1/devices/$ID" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.DELETE("/v1/devices/{id}", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import delete_device
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = delete_device.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)PATCH /v1/devices/{id}/accounts/{account_id}
Phần tiêu đề “PATCH /v1/devices/{id}/accounts/{account_id}”Bật/tắt "Tính giao dịch iOS là đã xác thực" cho một tài khoản
Tắt: giao dịch iOS của tài khoản này luôn provisional (đã verified thì giữ nguyên). Nếu máy đang phụ trách mọi tài khoản của công ty, lần đổi đầu tiên ghim máy vào danh sách tài khoản hiện có.
- Nhóm tốc độ:
write - Nội dung yêu cầu:
PatchDeviceIosAccount(application/json, bắt buộc) - Phản hồi thành công
200: Sau cập nhật. —DeviceIosAccount,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
account_id | path | Có | AccountId | Mã tài khoản ngân hàng (acc_…). |
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X PATCH "https://api.dongtien.pro/v1/devices/$ID/accounts/$ACCOUNT_ID" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ios_trust_enabled": false}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.PATCH("/v1/devices/{id}/accounts/{account_id}", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", "account_id": "acc_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, }, body: { "ios_trust_enabled": false },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import patch_device_ios_accountfrom dongtien_api.models import PatchDeviceIosAccount
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = patch_device_ios_account.sync( id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", account_id="acc_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client, body=PatchDeviceIosAccount.from_dict({ "ios_trust_enabled": False, }), )GET /v1/devices/{id}/banks
Phần tiêu đề “GET /v1/devices/{id}/banks”Automation theo ngân hàng của iPhone
Các ngân hàng của tài khoản máy phụ trách (và ngân hàng đã có thống kê), kèm từ khoá, trạng thái và bộ đếm hôm nay; cùng công tắc ios_trust_enabled từng tài khoản. Bộ đếm sống ở Durable Object và được rollup tối đa mỗi 60 giây. Thiết bị Android trả 409 conflict.
- Nhóm tốc độ:
read - Phản hồi thành công
200: Danh sách. —DeviceBankList,application/json - Mã lỗi riêng của endpoint:
resource_not_found
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
curl -sS -X GET "https://api.dongtien.pro/v1/devices/$ID/banks" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/devices/{id}/banks", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import list_device_banks
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_device_banks.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)PATCH /v1/devices/{id}/banks/{bank_code}
Phần tiêu đề “PATCH /v1/devices/{id}/banks/{bank_code}”Đánh dấu đã tạo automation cho ngân hàng
Chỉ ghi nhận lựa chọn của người dùng ("Đã tạo"), để hiện untested cho tới khi có tin. Không bật/tắt việc nhận tin: bỏ automation là việc trong app Shortcuts.
- Nhóm tốc độ:
write - Nội dung yêu cầu:
PatchDeviceBank(application/json, bắt buộc) - Phản hồi thành công
200: Sau cập nhật. —DeviceBankStatus,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
bank_code | path | Có | string | — |
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X PATCH "https://api.dongtien.pro/v1/devices/$ID/banks/$BANK_CODE" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "automation_created": true}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.PATCH("/v1/devices/{id}/banks/{bank_code}", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", "bank_code": "<bank_code>" }, }, body: { "automation_created": true },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import patch_device_bankfrom dongtien_api.models import PatchDeviceBank
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = patch_device_bank.sync( id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", bank_code="<bank_code>", client=dt.client, body=PatchDeviceBank.from_dict({ "automation_created": True, }), )GET /v1/devices/{id}/events
Phần tiêu đề “GET /v1/devices/{id}/events”Nhật ký thiết bị
Nhật ký chỉ-thêm của thiết bị (mới nhất trước), phân trang theo con trỏ.
Quyền: device.read- Nhóm tốc độ:
read - Phản hồi thành công
200: Nhật ký. —DeviceEventList,application/json - Mã lỗi riêng của endpoint:
invalid_cursor,resource_not_found
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
limit | query | Không | integer | Số phần tử mỗi trang (1–100, mặc định 20). |
cursor | query | Không | Cursor | Con trỏ phân trang mờ (cur_…) lấy từ next_cursor; không tự tạo hay sửa. |
kind | query | Không | string | — |
curl -sS -X GET "https://api.dongtien.pro/v1/devices/$ID/events" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/devices/{id}/events", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import list_device_events
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = list_device_events.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)GET /v1/devices/{id}/queue
Phần tiêu đề “GET /v1/devices/{id}/queue”Hàng đợi tin chờ gửi trên thiết bị
Đọc ảnh chụp 20 mục đầu của hàng đợi, nội dung rút gọn 80 ký tự và che số tài khoản. Chưa có ảnh chụp mới thì xếp lệnh upload_queue_preview (trả state: requested, hỏi lại sau ≤ 45 giây). Ảnh chụp hết hạn sau 15 phút. Mỗi lần đọc ghi nhật ký kiểm toán device.queue_read.
- Nhóm tốc độ:
read - Phản hồi thành công
200: Hàng đợi. —DeviceQueue,application/json - Mã lỗi riêng của endpoint:
resource_not_found
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
curl -sS -X GET "https://api.dongtien.pro/v1/devices/$ID/queue" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/devices/{id}/queue", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import get_device_queue
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = get_device_queue.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)POST /v1/devices/{id}/test-sms
Phần tiêu đề “POST /v1/devices/{id}/test-sms”Gửi tin thử qua iPhone
Mở lần thử 90 giây. Người dùng chuyển khoản số tiền nhỏ với nội dung TEST DTP… tới tài khoản của mình; khi SMS ngân hàng tới Shortcut, máy chủ khớp mã trong tin và trả kết quả (kênh GET …/test-stream). Lần thử không tạo giao dịch riêng: tin vẫn đi qua đường nhập thường (tạm tính). Thiết bị Android trả 409 conflict.
- Nhóm tốc độ:
write - Phản hồi thành công
201: Lần thử đã mở. —IosSmsTest,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X POST "https://api.dongtien.pro/v1/devices/$ID/test-sms" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/devices/{id}/test-sms", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import test_ios_device_sms
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = test_ios_device_sms.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)GET /v1/devices/{id}/test-stream
Phần tiêu đề “GET /v1/devices/{id}/test-stream”Theo dõi lần gửi thử (SSE)
text/event-stream: sự kiện channel_test (JSON IosSmsTest) mỗi khi trạng thái đổi, ping mỗi 15 giây, rồi đóng khi received / expired hoặc sau 90 giây. Chọn lần thử bằng ?test=cht_… (mặc định lần mới nhất của máy).
- Nhóm tốc độ:
read - Phản hồi thành công
200: Luồng SSE. —string,text/event-stream - Mã lỗi riêng của endpoint:
resource_not_found
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
test | query | Không | ChannelTestId | Mã lần gửi thử kênh (cht_…). |
curl -sS -X GET "https://api.dongtien.pro/v1/devices/$ID/test-stream" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.GET("/v1/devices/{id}/test-stream", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import stream_ios_device_sms_test
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = stream_ios_device_sms_test.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)POST /v1/devices/{id}:nudge
Phần tiêu đề “POST /v1/devices/{id}:nudge”Nhắc người phụ trách thiết bị
Gửi nhắc tới người phụ trách (kênh thông báo của phase 18). Tối đa 1 lần mỗi 6 giờ cho mỗi thiết bị; quá hạn mức trả 429 rate_limited.
- Nhóm tốc độ:
write - Phản hồi thành công
200: Đã nhắc. —DeviceNudge,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X POST "https://api.dongtien.pro/v1/devices/$ID:nudge" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/devices/{id}:nudge", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import nudge_device
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = nudge_device.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)POST /v1/devices/{id}:ping
Phần tiêu đề “POST /v1/devices/{id}:ping”Gửi lệnh kiểm tra tới thiết bị
Xếp lệnh ping/diagnose/test_send vào hàng của máy; máy nhận ở heartbeat kế tiếp. Không dùng FCM. Thiết bị iOS trả 409 conflict (Shortcuts không nhận lệnh). Ghi nhật ký kiểm toán device.command.
- Nhóm tốc độ:
write - Nội dung yêu cầu:
PingDevice(application/json) - Phản hồi thành công
202: Lệnh đã xếp hàng. —DeviceCommand,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict,idempotency_in_flight,idempotency_key_reused
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
idempotency-key | header | Không | string | Khoá chống gửi trùng (≤ 255 ký tự, nên là UUID). Giữ 24 giờ; gửi lại cùng khoá + cùng nội dung trả lại kết quả cũ. |
curl -sS -X POST "https://api.dongtien.pro/v1/devices/$ID:ping" \ -H "Authorization: Bearer $DT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "kind": "ping"}'import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/devices/{id}:ping", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, }, body: { "kind": "ping" },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import ping_devicefrom dongtien_api.models import PingDevice
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = ping_device.sync( id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client, body=PingDevice.from_dict({ "kind": "ping", }), )POST /v1/devices/{id}:restore-trust
Phần tiêu đề “POST /v1/devices/{id}:restore-trust”Xoay token và tin cậy lại iPhone
Cần xác thực lại (step-up). Xoay token (như :rotate-token) và xoá việc hạ tin cậy D42; giao dịch mới của máy lại có thể verified nếu đủ điều kiện. Giao dịch đã ghi không đổi. Ghi nhật ký kiểm toán device.token_rotate với trust_restored: true.
- Nhóm tốc độ:
write - Phản hồi thành công
200: Token mới;device.trust_downgraded_atlànull. —IosDeviceCredential,application/json - Mã lỗi riêng của endpoint:
step_up_required,resource_not_found,conflict
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
curl -sS -X POST "https://api.dongtien.pro/v1/devices/$ID:restore-trust" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/devices/{id}:restore-trust", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import restore_ios_device_trust
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = restore_ios_device_trust.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)POST /v1/devices/{id}:rotate-token
Phần tiêu đề “POST /v1/devices/{id}:rotate-token”Xoay token iPhone
Tạo token mới; token cũ còn hiệu lực 30 phút để cập nhật Shortcut rồi trả 401. Thiết bị, bộ đếm và cảnh báo im lặng giữ nguyên (cùng device_id). KHÔNG khôi phục độ tin cậy đã bị hạ (D42): dùng :restore-trust. Chỉ thiết bị iOS; Android trả 409 conflict. Ghi nhật ký kiểm toán device.token_rotate. Không dùng Idempotency-Key.
- Nhóm tốc độ:
write - Phản hồi thành công
200: Token mới. —IosDeviceCredential,application/json - Mã lỗi riêng của endpoint:
resource_not_found,conflict
Tham số
Phần tiêu đề “Tham số”| Tên | Vị trí | Bắt buộc | Kiểu | Mô tả |
|---|---|---|---|---|
id | path | Có | DeviceId | Mã thiết bị chuyển tiếp tin (dev_…). |
curl -sS -X POST "https://api.dongtien.pro/v1/devices/$ID:rotate-token" \ -H "Authorization: Bearer $DT_API_KEY"import { createClient } from "@dongtien/sdk";
const dt = createClient({ apiKey: process.env.DT_API_KEY! });
const { data } = await dt.POST("/v1/devices/{id}:rotate-token", { params: { path: { "id": "dev_0f5k2m9q4h7t3n8r6v1w0x5yz0" }, },});import os
from dongtien import DongTienfrom dongtien_api.api.thiet_bi import rotate_ios_device_token
with DongTien(api_key=os.environ["DT_API_KEY"]) as dt: result = rotate_ios_device_token.sync(id="dev_0f5k2m9q4h7t3n8r6v1w0x5yz0", client=dt.client)Đối tượng
Phần tiêu đề “Đối tượng”AndroidReleaseManifest
Phần tiêu đề “AndroidReleaseManifest”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
channel | string | Có | Giá trị: stable, beta. |
id | AppReleaseId | Có | — |
mandatory_by | string | null | Có | Sau mốc này app hiện màn cập nhật bắt buộc (vẫn nhận và xếp hàng tin). |
min_supported_version_code | integer | Có | Sau mandatory_by + 7 ngày ân hạn, phiên bản thấp hơn nhận 426 upgrade_required. |
object | string | Có | Giá trị: android_release. |
published_at | Timestamp | null | Có | — |
release_notes | string[] | Có | — |
rollout_pct | integer | Có | — |
rollout_salt | string | Có | — |
sha256 | string | Có | SHA-256 (hex) của APK. |
signature | string | Có | Ed25519 (hex, 64 byte) trên chuỗi DTM1… mô tả ở đầu tài liệu. |
size | integer | Có | Byte. |
state | AppReleaseState | Có | Giá trị: draft, staged, stable, mandatory, halted. |
url | string (uri) | Có | Địa chỉ tải APK (R2 dl.dongtien.pro). |
version | string | Có | — |
version_code | integer | Có | — |
IosShortcutRelease
Phần tiêu đề “IosShortcutRelease”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
icloud_url | string (uri) | Có | Liên kết iCloud của file Shortcut đã ký. |
id | AppReleaseId | Có | — |
import_questions | object[] | Có | Câu hỏi khi nhập Shortcut (vd. dán token dtd_…). |
import_questions[].key | string | Có | — |
import_questions[].prompt | string | Có | — |
min_ios | string | null | Có | — |
object | string | Có | Giá trị: ios_shortcut_release. |
published_at | Timestamp | Có | — |
release_notes | string[] | Có | — |
version | string | Có | — |
version_code | integer | Có | — |
IosBankKeywordList
Phần tiêu đề “IosBankKeywordList”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
data | IosBankKeyword[] | Có | — |
data[].bank_code | string | Có | — |
data[].brand | string | Có | — |
data[].keywords | string[] | Có | Từ khoá cho bộ lọc Message Contains của automation (hoặc của ô tìm trong Shortcuts). |
data[].name | string | null | Có | — |
object | string | Có | Giá trị: list. |
DeviceAlertRules
Phần tiêu đề “DeviceAlertRules”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
battery_lt | integer | Có | Pin dưới N % (mặc định 20). |
channels | string[] | Có | Giá trị: zalo, push, email. |
company_id | OrgId | Có | — |
enabled | object | Có | — |
enabled.battery | boolean | Có | — |
enabled.ios_silent | boolean | Có | — |
enabled.no_heartbeat | boolean | Có | — |
enabled.queue | boolean | Có | — |
ios_silent_hours | integer | Có | iOS: không có SMS hợp lệ quá N giờ ⇒ silent (mặc định 36). |
no_heartbeat_min | integer | Có | Không heartbeat quá N phút ⇒ stale; gấp đôi ⇒ offline (mặc định 15 / 30). |
object | string | Có | Giá trị: device_alert_rules. |
queue_age_min | integer | Có | …kéo dài quá N phút mới cảnh báo (mặc định 30). |
queue_gt | integer | Có | Hàng đợi quá N tin (mặc định 10). |
remind_every_hours | number | Có | Nhắc lại tối đa 1 lần / 6 giờ (cố định). Giá trị: 6. |
updated_at | string | null | Có | null khi đang dùng mặc định chưa lưu. |
PutDeviceAlertRules
Phần tiêu đề “PutDeviceAlertRules”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
battery_lt | integer | Có | Pin dưới N % (mặc định 20). |
channels | string[] | Có | Giá trị: zalo, push, email. |
company_id | OrgId | Có | — |
enabled | object | Có | — |
enabled.battery | boolean | Có | — |
enabled.ios_silent | boolean | Có | — |
enabled.no_heartbeat | boolean | Có | — |
enabled.queue | boolean | Có | — |
ios_silent_hours | integer | Có | iOS: không có SMS hợp lệ quá N giờ ⇒ silent (mặc định 36). |
no_heartbeat_min | integer | Có | Không heartbeat quá N phút ⇒ stale; gấp đôi ⇒ offline (mặc định 15 / 30). |
queue_age_min | integer | Có | …kéo dài quá N phút mới cảnh báo (mặc định 30). |
queue_gt | integer | Có | Hàng đợi quá N tin (mặc định 10). |
DeviceList
Phần tiêu đề “DeviceList”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
data | Device[] | Có | — |
data[].account_ids | AccountId[] | Có | Tài khoản mà thiết bị này phụ trách chuyển tiếp. |
data[].app_version | string | null | Có | — |
data[].attestation_level | DeviceAttestationLevel | null | Có | Giá trị: strongbox, tee, software, none. |
data[].battery_pct | integer | null | Có | — |
data[].company | object | Có | — |
data[].config_version | integer | Có | — |
data[].created_at | Timestamp | Có | — |
data[].id | DeviceId | Có | — |
data[].kind | DeviceKind | Có | Giá trị: android, ios_shortcut. |
data[].last_seen_at | string | null | Có | Heartbeat gần nhất (rollup tối đa 60 s). |
data[].last_sms_at | Timestamp | null | Có | — |
data[].manufacturer | string | null | Có | — |
data[].model | string | null | Có | — |
data[].name | string | Có | — |
data[].object | string | Có | Giá trị: device. |
data[].oem_checks | DeviceOemChecks | null | Có | — |
data[].os | string | null | Có | — |
data[].perms | DevicePerms | null | Có | — |
data[].queue_depth | integer | null | Có | — |
data[].responsible_user_id | string | null | Có | Người phụ trách nhận nhắc khi máy mất kết nối. |
data[].revoked_at | Timestamp | null | Có | — |
data[].rom | string | null | Có | — |
data[].send_stats | DeviceSendStats | null | Có | — |
data[].silent_since | string | null | Có | iOS: bắt đầu im lặng quá 36 giờ. |
data[].sources | DeviceSource[] | Có | — |
data[].state | DeviceState | Có | Giá trị: pending_pair, active, stale, offline, silent, revoked. |
data[].token_last4 | string | null | Có | iOS: 4 ký tự cuối token dtd_… (đã che). |
data[].trust_downgraded_at | string | null | Có | iOS (D42): thời điểm hệ thống hạ tin cậy thiết bị; giao dịch mới về provisional. |
data[].update_available | DeviceUpdateInfo | null | Có | — |
data[].version_code | integer | null | Có | — |
has_more | boolean | Có | — |
next_cursor | string | null | Có | Con trỏ trang kế; null khi hết dữ liệu. |
object | string | Có | Giá trị: list. |
CreateIosDevice
Phần tiêu đề “CreateIosDevice”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
account_ids | AccountId[] | Không | Tài khoản máy phụ trách; bỏ trống = mọi tài khoản của công ty. |
company_id | OrgId | Có | — |
kind | string | Không | Giá trị: ios_shortcut. |
name | string | Có | — |
responsible_user_id | string | Không | Người phụ trách (tuỳ chọn). |
IosDeviceCredential
Phần tiêu đề “IosDeviceCredential”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
device | Device | Có | — |
device.account_ids | AccountId[] | Có | Tài khoản mà thiết bị này phụ trách chuyển tiếp. |
device.app_version | string | null | Có | — |
device.attestation_level | DeviceAttestationLevel | null | Có | Giá trị: strongbox, tee, software, none. |
device.battery_pct | integer | null | Có | — |
device.company | object | Có | — |
device.config_version | integer | Có | — |
device.created_at | Timestamp | Có | — |
device.id | DeviceId | Có | — |
device.kind | DeviceKind | Có | Giá trị: android, ios_shortcut. |
device.last_seen_at | string | null | Có | Heartbeat gần nhất (rollup tối đa 60 s). |
device.last_sms_at | Timestamp | null | Có | — |
device.manufacturer | string | null | Có | — |
device.model | string | null | Có | — |
device.name | string | Có | — |
device.object | string | Có | Giá trị: device. |
device.oem_checks | DeviceOemChecks | null | Có | — |
device.os | string | null | Có | — |
device.perms | DevicePerms | null | Có | — |
device.queue_depth | integer | null | Có | — |
device.responsible_user_id | string | null | Có | Người phụ trách nhận nhắc khi máy mất kết nối. |
device.revoked_at | Timestamp | null | Có | — |
device.rom | string | null | Có | — |
device.send_stats | DeviceSendStats | null | Có | — |
device.silent_since | string | null | Có | iOS: bắt đầu im lặng quá 36 giờ. |
device.sources | DeviceSource[] | Có | — |
device.state | DeviceState | Có | Giá trị: pending_pair, active, stale, offline, silent, revoked. |
device.token_last4 | string | null | Có | iOS: 4 ký tự cuối token dtd_… (đã che). |
device.trust_downgraded_at | string | null | Có | iOS (D42): thời điểm hệ thống hạ tin cậy thiết bị; giao dịch mới về provisional. |
device.update_available | DeviceUpdateInfo | null | Có | — |
device.version_code | integer | null | Có | — |
object | string | Có | Giá trị: ios_device_credential. |
token | string | Có | Token dtd_… của Shortcut. CHỈ hiện ở lần trả lời này; chỉ lưu băm SHA-256. Mất token phải xoay token (mã cũ còn dùng được 30 phút). |
token_last4 | string | Có | 4 ký tự cuối, hiển thị sau này. |
CreateDevicePairingCode
Phần tiêu đề “CreateDevicePairingCode”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
account_ids | AccountId[] | Không | Tài khoản máy sẽ phụ trách; bỏ trống = mọi tài khoản của công ty. |
company_id | OrgId | Có | — |
device_name_hint | string | Không | — |
kind | string | Không | Giá trị: android. |
DevicePairingCode
Phần tiêu đề “DevicePairingCode”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
account_ids | AccountId[] | Có | — |
code | string | Có | Mã ghép một lần, chỉ hiện ở lần trả lời này. |
company | object | Có | — |
company.id | OrgId | Có | — |
company.mst | string | null | Có | — |
device_name_hint | string | null | Có | — |
expires_at | Timestamp | Có | — |
expires_in | integer | Có | Số giây còn lại (300). |
kind | string | Có | Giá trị: android. |
object | string | Có | Giá trị: device_pairing_code. |
qr_payload | string | Có | Nội dung mã QR: https://dongtien.pro/p/<code> (mở app hoặc trang tải). |
Device
Phần tiêu đề “Device”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
account_ids | AccountId[] | Có | Tài khoản mà thiết bị này phụ trách chuyển tiếp. |
app_version | string | null | Có | — |
attestation_level | DeviceAttestationLevel | null | Có | Giá trị: strongbox, tee, software, none. |
battery_pct | integer | null | Có | — |
company | object | Có | — |
company.id | OrgId | Có | — |
company.mst | string | null | Có | Mã số thuế của công ty. |
config_version | integer | Có | — |
created_at | Timestamp | Có | — |
id | DeviceId | Có | — |
kind | DeviceKind | Có | Giá trị: android, ios_shortcut. |
last_seen_at | string | null | Có | Heartbeat gần nhất (rollup tối đa 60 s). |
last_sms_at | Timestamp | null | Có | — |
manufacturer | string | null | Có | — |
model | string | null | Có | — |
name | string | Có | — |
object | string | Có | Giá trị: device. |
oem_checks | DeviceOemChecks | null | Có | — |
oem_checks.autostart_confirmed | boolean | Có | — |
os | string | null | Có | — |
perms | DevicePerms | null | Có | — |
perms.battery_unrestricted | boolean | Có | — |
perms.notification_listener | boolean | Có | — |
perms.post_notifications | boolean | Có | — |
perms.read_sms | boolean | Có | — |
perms.receive_sms | boolean | Có | — |
queue_depth | integer | null | Có | — |
responsible_user_id | string | null | Có | Người phụ trách nhận nhắc khi máy mất kết nối. |
revoked_at | Timestamp | null | Có | — |
rom | string | null | Có | — |
send_stats | DeviceSendStats | null | Có | — |
send_stats.charging | boolean | null | Có | — |
send_stats.foreign_sender_dropped_today | integer | Có | — |
send_stats.oldest_queued_age_s | integer | null | Có | — |
send_stats.otp_dropped_today | integer | Có | — |
send_stats.pin_mismatch | boolean | Có | — |
send_stats.queue_overflow | integer | Có | — |
send_stats.send_latency_ms | integer | null | Có | — |
send_stats.sent_today | integer | Có | — |
silent_since | string | null | Có | iOS: bắt đầu im lặng quá 36 giờ. |
sources | DeviceSource[] | Có | — |
sources[].enabled | boolean | Có | — |
sources[].kind | string | Có | Giá trị: app_package, sms_brand. |
sources[].value | string | Có | Package app ngân hàng hoặc brandname SMS (chữ thường). |
state | DeviceState | Có | Giá trị: pending_pair, active, stale, offline, silent, revoked. |
token_last4 | string | null | Có | iOS: 4 ký tự cuối token dtd_… (đã che). |
trust_downgraded_at | string | null | Có | iOS (D42): thời điểm hệ thống hạ tin cậy thiết bị; giao dịch mới về provisional. |
update_available | DeviceUpdateInfo | null | Có | — |
update_available.mandatory_by | Timestamp | null | Có | — |
update_available.version | string | Có | — |
update_available.version_code | integer | Có | — |
version_code | integer | null | Có | — |
UpdateDevice
Phần tiêu đề “UpdateDevice”| Trường | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
account_ids | AccountId[] | Không | — |
name | string | Không | — |
responsible_user_id | UserId | null | Không | — |
sources | DeviceSource[] | Không | Bật/tắt nguồn. Chỉ tắt thêm được nguồn trong danh sách server; không thêm được nguồn ngoài danh mục. |
sources[].enabled | boolean | Có | — |
sources[].kind | string | Có | Giá trị: app_package, sms_brand. |
sources[].value | string | Có | Package app ngân hàng hoặc brandname SMS (chữ thường). |
Đối tượng khác của nhóm này (xem tài liệu tương tác): PatchDeviceIosAccount, DeviceIosAccount, DeviceBankList, PatchDeviceBank, DeviceBankStatus, DeviceEventList, DeviceQueue, IosSmsTest, DeviceNudge, PingDevice, DeviceCommand
Lưu ý về từ "đã xác thực": đây là xác thực nguồn, không phải ngân hàng xác nhận quyết toán.
do da danh doi dang dinh dat dong de duoc dau dem doc di duong du dieu dia diem day