AOV live config

Tổng quan

Theo dõi trạng thái và quy mô dữ liệu đang phục vụ client.

v0
API reference

Tài liệu tích hợp AOV Config API

Toàn bộ API đọc dữ liệu đều công khai — không cần đăng nhập: config cho client, catalog runtime, tra cứu skin và ảnh. Chỉ thao tác ghi mới cần token quản trị.

Base URLhttps://aov.anhvu.cc
Xác thực khi đọcKhông cần
Phiên bản configv0
Catalog dump lúc—

Bắt đầu nhanh

Client chỉ cần một request để lấy toàn bộ cấu hình đang phục vụ. So version để biết có bản mới; assetVersion là mốc dump catalog tương ứng.

curl https://aov.anhvu.cc/api/config {"version": 16, "assetVersion": "2026-09-29T20:31:59Z", "buttons": [{"name": "Maloch Bách Tướng Ma Nhân", "id": 85}, …], "billboards": [{"name": "Gildur Jiji", "id": 65}, …], "soldierSkins": [{"name": "lính thường", "id": 0}, …], "excludedSkins": {"106": [11, 20], "190": [7, 9], …}, "bannedSkins": [10611, 10620, 59903, …], "skinNames": {"10917": "Veera Momo", …}}

Thứ tự phần tử trong buttons / billboards / soldierSkins chính là thứ tự hiển thị trên client, nên hãy render theo đúng thứ tự mảng.

4 request còn lại để có đủ dữ liệu hiển thị
GET /api/runtime/thumbnails → ảnh cho buttons / billboards / soldierSkins GET /api/heroes?limit=… → tướng + ảnh đại diện (160 tướng) GET /api/hero-skills → nội tại, 3 chiêu mỗi tướng + phép bổ trợ GET /api/items → trang bị: nhóm, bậc, giá, chỉ số, nội tại GET /api/dump/runtime/status → số lượng + version từng bộ dữ liệu (field library)

Lấy ảnh và thông tin hiển thị

Có 3 cách lấy ảnh, tuỳ nhu cầu. Tất cả đều không cần token và ảnh CDN đều được server tải sẵn rồi cache — client không phải xử lý CORS.

Bảng nguồn ảnh — tất cả đường lấy ảnh
ẢnhEndpointTham sốGhi chú
Nút bấm · thông báo hạ · skin línhGET /api/runtime/thumbnailstypesMap id → {imageUrl, thumbnailUrl} theo đúng danh sách trong /api/config. Nhanh nhất khi render danh sách.
Một ảnh bất kỳGET /api/dump/runtime/imagetype id variantProxy + cache. heroSkins luôn trả ảnh (placeholder SVG nếu thiếu), loại khác 404 nếu CDN không có.
Avatar tướng · tìm skin tướngGET /api/heroes · /api/skin-catalogq heroId keys sort pageMỗi mục đã kèm sẵn thumbnailUrl/imageUrl + hasImage (biết chắc CDN có ảnh thật hay không).
Ảnh tĩnh trong repoGET /runtime-assets/…—ranks, heroRanks, runtimeImages trả về path dạng này — tải trực tiếp, không qua proxy.
Icon kỹ năng · phép bổ trợGET /api/skills/iconurl (encode)Proxy + cache icon trang chủ chính thức; chỉ nhận host lienquan.garena.vn, cache 1 năm.
Icon trang bịGET /api/items/iconurl (encode)Cùng xử lý với /api/skills/icon.
Ảnh trong tab Dump (mọi loại)GET /api/dump/runtime/itemstype q page limitMỗi mục trả imageUrl + thumbnailUrl đã tính sẵn của loại đó.
Cách 1 — Bản đồ ảnh cho danh sách config (nhanh nhất)

Trả về map id → ảnh cho đúng các mục trong /api/config. Dùng khi cần render danh sách Nút bấm / Thông báo hạ / Skin lính kèm ảnh.

GET /api/runtime/thumbnails GET /api/runtime/thumbnails?types=buttons,billboards,soldierSkins {"success": true, "available": true, "catalogGeneratedAt": "2026-09-29T20:31:59Z", "counts": {"buttons": 81, "billboards": 64, "soldierSkins": 6}, "images": { "buttons": {"85": {"imageUrl": "/api/dump/runtime/image?type=buttons&id=85&variant=preview&v=…", "thumbnailUrl": ""}}, "billboards": {"65": {"imageUrl": "/api/dump/runtime/image?type=billboards&id=65&variant=preview&v=…", "thumbnailUrl": ""}}, "soldierSkins": {"0": {"imageUrl": "/api/dump/runtime/image?type=soldierSkins&id=93000&variant=share&v=…", "thumbnailUrl": "/api/dump/runtime/image?type=soldierSkins&id=93000&variant=icon&v=…"}}}}

Khoá map = id trong config (buttons[].id, billboards[].id, soldierSkins[].id). Ưu tiên thumbnailUrl, nếu rỗng thì dùng imageUrl.

Cách 2 — Proxy ảnh theo loại và kích thước

Dùng khi cần ảnh lớn/nhỏ khác nhau, hoặc lấy ảnh skin tướng theo từng cfgId.

GET /api/dump/runtime/image?type=<type>&id=<id>&variant=<variant> type / id variant nội dung ───────────────────────────────────────────────────────────────────── heroSkins / cfgId picture ảnh lớn của skin tướng (jpg) heroSkins / cfgId head ảnh chân dung (jpg, dùng làm avatar) soldierSkins / id share ảnh share của skin lính (png) soldierSkins / id icon icon skin lính (png) buttons / buttonId preview ảnh nút bấm cá nhân (png) billboards / billboardId preview ảnh thông báo hạ (png) → heroSkins LUÔN trả ảnh: nếu game chưa có ảnh thì server trả placeholder SVG (HTTP 200). → các loại khác trả 404 nếu CDN không có file ⇒ client tự hiển thị ảnh mặc định.
Cách 3 — Ảnh runtime đã tải sẵn trên máy

Với ranks, heroRanks, runtimeImages, field imageUrl trả về dạng tĩnh /runtime-assets/… — tải trực tiếp, không qua proxy:

GET /runtime-assets/heroRank/141611876719b0d4_legend_icon_5.png → 200 image/png
Ví dụ: render danh sách nút bấm kèm ảnh
const cfg = await (await fetch('/api/config')).json(); const map = (await (await fetch('/api/runtime/thumbnails')).json()).images.buttons; for (const item of cfg.buttons) { const image = map[item.id]; const src = image && (image.thumbnailUrl || image.imageUrl); render({ id: item.id, name: item.name, image: src || null }); }

Dữ liệu có sẵn — lấy được những gì

Toàn bộ dữ liệu của web gom thành 6 bộ, tất cả đều đọc công khai. Cột “Số lượng” là số thật đang phục vụ (lấy từ /api/dump/runtime/status, field library).

Bộ dữ liệuEndpointNội dung chínhSố lượng
Config clientGET /api/configversion, buttons, billboards, soldierSkins, excludedSkins, bannedSkins, skinNames—
Tướng + ảnh đại diệnGET /api/heroesheroId, heroName, skinCount, ảnh đại diện, hasImage— tướng
Skin tướngGET /api/skin-catalogkey (= heroId×100+skinId), tên, hero, ảnh lớn/ảnh chân dung, inAssetBundle— skin
Kỹ năng & bổ trợGET /api/hero-skillsNội tại + 3 chiêu mỗi tướng (tên, mô tả, icon), danh sách phép bổ trợ, mùa hiện tại— tướng · — chiêu · — bổ trợ
Trang bịGET /api/itemsNhóm, bậc 1–3, giá vàng, chỉ số, nội tại, icon, kind (mới/làm lại), version bản game— món
Runtime catalog (dump từ game)GET /api/dump/runtime/itemsNút bấm · thông báo hạ · skin lính · skin tướng · rank · top tướng · vip assets · ảnh runtime · asset discovery— loại

Chẩn đoán & đồng bộ: GET /api/dump/runtime/status (số lượng + library), GET /api/dump/runtime/additions (mục chưa có trong config), GET /api/dump/runtime/devices (thiết bị debug đã gửi dump).

Toàn bộ endpoint GET — công khai, không cần token

19 endpoint dưới đây trả dữ liệu hiển thị. Có thể gọi trực tiếp từ client, web hay công cụ bên thứ ba. Các endpoint cần token nằm ở mục Ghi dữ liệu.

MethodĐường dẫnMô tả
GET/api/configConfig client đang phục vụ (nguồn dữ liệu chính).
GET/api/buttonsMảng nút bấm kèm thứ tự hiển thị.
GET/api/billboardsMảng thông báo hạ.
GET/api/soldierSkinsMảng skin lính.
GET/api/excludedSkinsMap {heroId: [skinId]} skin xử lý đặc biệt.
GET/api/bannedSkinsMảng key skin bị cấm (heroId*100 + skinId).
GET/api/dump/runtime/statusTổng quan catalog: counts, diff, autoSync, catalogGeneratedAt.
GET/api/dump/runtime/itemsDanh sách đã phân trang. Query: type (buttons, billboards, soldierSkins, heroSkins, ranks, heroRanks, vipAssets, runtimeImages, assetDiscovery), q, status, page, limit (tối đa 100).
GET/api/dump/runtime/additionsMục mới chưa có trong config (chẩn đoán đồng bộ). Query types.
GET/api/runtime/thumbnailsBản đồ ảnh id → ảnh. Query types.
GET/api/dump/runtime/imageProxy ảnh. Query type, id, variant.
GET/api/heroesDanh sách tướng gộp từ runtime dump: heroId, heroName, skinCount, thumbKey/thumbVariant và ảnh đại diện. Query q (tên hoặc ID).
GET/api/skin-catalogTra cứu skin tướng. Query q, keys (danh sách key), heroId, sort (image = ưu tiên skin có ảnh, name = theo tên), page, limit. Mỗi mục có hasImage cho biết CDN có ảnh thật hay không.
GET/api/hero-skillsNội tại + 3 chiêu của từng tướng kèm mô tả tiếng Việt, danh sách phép bổ trợ đang hiệu lực (spells, kèm kind: base/new/season), bổ trợ đã bỏ (retiredSpells) và mùa hiện tại (season). Query heroId, q. Trả heroId đã khớp với runtime dump (null nếu chưa có tướng đó trong game).
GET/api/skills/iconProxy + cache icon kỹ năng từ trang chủ (chỉ nhận host lienquan.garena.vn). Query url (đã encode).
GET/api/itemsTrang bị trong trận: name, type/typeId (nhóm), tier (bậc 1–3), price, stats, passives[], iconUrl, kind (base/new/rework). Trả thêm version của bản game. Query q, type, tier.
GET/api/items/iconProxy + cache icon trang bị (cùng xử lý với /api/skills/icon).
GET/api/dump/runtime/devicesThiết bị debug đã gửi catalog (mã ghép chỉ hiện với admin).
GET/runtime-assets/*Ảnh runtime tĩnh (rank, top tướng, ảnh chụp).

Cấu trúc /api/config

FieldKiểuÝ nghĩa
versionnumberTăng mỗi lần config thay đổi. Client so sánh để biết cần nạp lại.
assetVersionstringMốc thời gian của catalog dump đang dùng để sinh ảnh/tên.
buttons[]{ name, id }Nút bấm cá nhân. id = buttonId, dùng cho /api/dump/runtime/image?type=buttons.
billboards[]{ name, id }Thông báo hạ. id = billboardId.
soldierSkins[]{ name, id }Skin lính. id 93000…93005, riêng lính thường là 0.
excludedSkinsobject{"<heroId>": [skinId, …]} — skin cần xử lý đặc biệt trong trận ảo.
bannedSkins[]number[]Key skin bị cấm, key = heroId × 100 + skinId.
skinNamesobjectTên do quản trị đặt tay, ưu tiên hơn tên trong dump: {"<key>": "tên"}.

Quy ước key skin dùng xuyên suốt hệ thống: key = heroId × 100 + skinId (ví dụ hero 109 + skin 17 → 10917).

Tra cứu — 4 bộ dữ liệu, cùng một kiểu query

BộQueryTrả về
/api/skin-catalogq · keys · heroId · sort=image|name · page · limit{key, heroId, skinId, name, nameSource, thumbnailUrl, imageUrl, hasImage, inAssetBundle}
/api/heroesq (tên hoặc ID){heroId, heroName, skinCount, thumbKey, thumbVariant, hasImage, imageUrl, thumbnailUrl}
/api/hero-skillsheroId · q (tên chiêu / mô tả){heroId, name, slug, skills:[{slot, name, description, iconUrl}]} + spells[] + season
/api/itemsq · type · tier{name, type, typeId, tier, price, stats, passives[], iconUrl, kind} + version
// ví dụ: lấy skin có ảnh thật, rồi lấy kỹ năng của tướng đó const skins = await (await fetch('/api/skin-catalog?q=veera&sort=image&limit=24')).json(); const first = skins.results[0]; const hero = await (await fetch('/api/hero-skills?heroId=' + first.heroId)).json(); // first.thumbnailUrl | first.imageUrl → ảnh dùng trực tiếp (đã qua proxy + cache) // first.hasImage === false → CDN không có ảnh, tự hiển thị ảnh mặc định {"success": true, "page": 1, "limit": 36, "total": 2324, "pages": 65, "results": [{ "key": 10917, "heroId": 109, "skinId": 17, "name": "Veera Momo", "nameSource": "dump", "hasImage": true, "thumbnailUrl": "/api/dump/runtime/image?type=heroSkins&id=10917&variant=head&v=…", "imageUrl": "/api/dump/runtime/image?type=heroSkins&id=10917&variant=picture&v=…" }]} nameSource: "dump" = tên lấy từ catalog · "manual" = do quản trị đặt tay

Runtime dump — nguồn dữ liệu gốc

Catalog là dữ liệu dump từ game (nút bấm, thông báo hạ, skin tướng, rank, ảnh…). Các endpoint bên dưới dùng để tra cứu và chẩn đoán.

GET /api/dump/runtime/items?type=heroSkins&q=veera&page=1&limit=36 GET /api/dump/runtime/items?type=buttons&status=new # new | renamed | changed | removed | same | missingName GET /api/dump/runtime/status GET /api/dump/runtime/additions {"success": true, "type": "heroSkins", "page": 1, "limit": 36, "total": 3072, "pages": 86, "results": [{ "id": 10917, "configId": 10917, "cfgId": 10917, "name": "Veera Momo", "status": "same", "inConfig": true, "heroId": 109, "skinId": 17, "imageUrl": "/api/dump/runtime/image?type=heroSkins&id=10917&variant=picture&v=…", "thumbnailUrl": "/api/dump/runtime/image?type=heroSkins&id=10917&variant=head&v=…"}]} status: same (đã khớp config) · new (chưa có trong config) · renamed (tên khác) changed (dữ liệu đổi) · removed (mất khỏi dump) · missingName (chưa có tên hợp lệ)

Con số nhanh: catalog hiện có — nút bấm · — thông báo hạ · — skin tướng · — skin lính. Ảnh sẵn sàng: — nút · — thông báo hạ · — skin lính.

Ghi dữ liệu — cần token quản trị

Mọi thao tác thay đổi dữ liệu đều yêu cầu header x-auth-token. Không có token sẽ nhận 401 {"error":"Chưa đăng nhập"}.

POST /zcx {"password": "…"} → {"success": true, "token": "…"} Sau đó gửi kèm header: x-auth-token: <token>
Các nhóm endpoint ghi
NhómEndpointViệc
Phiên đăng nhậpPOST /zcx · POST /api/logout · GET /api/check-authLấy token quản trị qua lối vào ẩn /zcx (mở dashboard bằng GET /zcx), huỷ token, kiểm tra token còn hiệu lực.
Bản Debug (token thiết bị)POST /api/dump/runtime/device/register · /device-uploadĐăng ký ghép thiết bị và gửi catalog lên — dùng token thiết bị, không phải token admin.
Xuất bảnPOST /api/publishTăng version để client biết có bản mới.
Config thôPUT /api/configGhi đè toàn bộ config.
Danh sáchPOST · PUT /api/{resource}/:index · DELETE · POST /api/{resource}/reorderThêm / sửa / xoá / đổi thứ tự với buttons, billboards, soldierSkins.
Skin trận ảoPOST /api/excludedSkins · DELETE /api/excludedSkins/:heroIdGán danh sách skin theo hero.
Tài khoản (thiết bị)POST /api/account/uploadMod đẩy hồ sơ tài khoản đang đăng nhập. Xác thực bằng X-Runtime-Device-Id + X-Runtime-Upload-Token (như device-upload).
Tài khoản (quản trị)GET /api/accounts · GET /api/account/:key · POST /api/account · DELETE /api/account/:keyToàn bộ chức năng tài khoản là riêng quản trị: tra cứu, thêm/sửa tay, xoá hồ sơ.
Tài khoản (nguồn chính thức)GET/POST /api/account/garena/sessions · PATCH/DELETE /api/account/garena/sessions/:id · POST /api/account/garena/sessions/:id/sync · POST /api/account/garena/sync-allQuản lý nhiều phiên Garena: mỗi phiên là 1 tài khoản admin tự đăng nhập rồi dán cookie (session + session.sig) — không cần mật khẩu. Đồng bộ gọi GET /api/player/get của kientuong.lienquan.garena.vn → tên, level, trạng thái khoá, ngày tạo nhân vật. Cookie lưu cục bộ (quyền 0600), không bao giờ trả ra API.
Skin bị cấmPOST /api/bannedSkins · DELETE /api/bannedSkins/:keyQuản lý danh sách key bị cấm.
Tên skinPOST /api/skin-catalog/name · DELETE /api/skin-catalog/name/:keyĐặt tên hiển thị đè lên tên trong dump.
Nhập từ dumpPOST /api/skin-catalog/importThêm skin từ catalog vào danh sách theo target.
RuntimePOST /api/dump/runtime/import · /sync · /device-syncNạp catalog mới, đồng bộ mục mới vào config, kéo từ iPhone.
Thiết bịPOST /api/dump/runtime/devices/:deviceId/approve · DELETE …/devices/:deviceIdDuyệt hoặc xoá thiết bị debug.
Quét CDNPOST /api/dump/scan · /auto-load · /bobao-catalog · /scan-catalog · /scan-configCông cụ dump ảnh/tên theo ID.
Ảnh CDNPOST /api/dump/runtime/image-availability/refreshQuét lại bảng ảnh head/picture có thật trên CDN (chạy nền, dùng sau khi nạp dump mới).

Token được giữ trong bộ nhớ server: khởi động lại server là mọi phiên đăng nhập hết hiệu lực.

Lưu ý kỹ thuật

  • Cache — /api/config trả Cache-Control: no-store, luôn lấy bản mới. Ảnh qua proxy cache 1 ngày, ảnh /runtime-assets cache 1 ngày và immutable.
  • Ảnh CDN — server tải hộ và lưu vào data/runtime-image-cache/, client không cần quan tâm CORS hay link CDN.
  • Phân trang — /api/dump/runtime/items và /api/skin-catalog trả page, pages, total; limit tối đa 100.
  • Thiếu ảnh — với heroSkins server luôn trả ảnh (placeholder SVG nếu chưa có); các loại khác trả 404, hãy chuẩn bị ảnh mặc định trong app.
  • Kỹ năng tướng — nội tại, 3 chiêu và danh sách phép bổ trợ lấy từ trang chủ chính thức (lienquan.garena.vn) bằng node scripts/fetch-hero-skills.js. Icon được proxy + cache qua /api/skills/icon, không cần gọi thẳng CDN.
  • Bổ trợ lệch bản — trang chủ cập nhật chậm hơn game (ảnh bổ trợ còn là bản S1/2026). Phần chênh lệch so với bản đang chạy (Dịch Chuyển, giới hạn mùa Ma chủng hắc ám) và các bổ trợ đã bỏ nằm trong data/battle_spells_curated.json, được gộp tự động khi dump kèm nguồn (patch notes).
  • Trang bị — node scripts/fetch-items.js dump trang bị từ lienquan.garena.vn/hoc-vien/trang-bi/ (6 nhóm, 3 bậc, giá vàng, chỉ số, nội tại) vào data/items_catalog.json; icon qua /api/items/icon. Trang chủ dừng ở khoảng 07/2026 nên phần lệch của bản đang chạy (trang bị mới, trang bị làm lại) nằm trong data/items_curated.json và được gộp tự động khi dump — hiện là 114 trang bị theo bản 1.64 “Vết Nứt Thời Không”.
  • Tên nút cá nhân — nút cá nhân hoá gắn với một skin; nếu skin chưa có tên tiếng Việt (bản VN chưa phát hành, vd nút 57 = skin 13 của Zephys) thì tên hiển thị kèm số skin: Zephys - Nút cá nhân (skin 13), tên gốc tiếng Trung được trả riêng ở field skinNameCn.
  • Ảnh thông báo hạ — nếu CDN Việt Nam (kgvn) không có ảnh, server tự lấy bản gốc từ CDN quốc tế. Header X-Runtime-Image-Source: cdn-chs cho biết ảnh lấy từ bản đó (chữ trên ảnh có thể là tiếng Trung).
  • Tên hiển thị — tên trong config là tên chốt để client hiển thị; tên trong catalog (/api/dump/runtime/items) chỉ là dữ liệu tham chiếu để đối chiếu.
  • Ghi dữ liệu — sau khi thay đổi qua API, gọi POST /api/publish để tăng version, nếu không client cũ vẫn dùng bản cũ.
  • Giới hạn — endpoint ghi không dành cho client phát hành; chỉ dùng từ công cụ quản trị nội bộ của bạn.
Cosmetic controls

Nút bấm 0

Kéo để đổi thứ tự hiển thị trên client.

Vị tríẢnhTên hiển thịIDThao tác
Kill notification

Thông báo hạ 0

Danh sách hiệu ứng thông báo khi hạ mục tiêu.

Vị tríẢnhTên hiển thịIDThao tác
Đang kiểm tra catalog
Dump lúc — Ngôn ngữ — Cập nhật server —

aov_runtime_catalog.json

Đồng bộ tự động từ bản DebugĐang kiểm tra thiết bị đã ghép.
Chưa có thiết bị gửi yêu cầu ghép.
Đang kiểm tra tự động đồng bộMục mới có tên hợp lệ sẽ tự được thêm vào API; tên thủ công và thứ tự cũ được giữ nguyên.
Đang tải dữ liệu...
1 / 1
Đang chuẩn bị runtime catalog...
Quét CDN thủ công theo ID
Loại tài nguyên

Nguồn ảnh: BoBao/bobao{id}.png. Phù hợp để quét các ID dạng 1–100.

Chưa quét dữ liệu. Nhập tối đa 150 ID mỗi lần.
Ảnh và tên tìm thấy sẽ xuất hiện tại đây.
Hero roster

Danh sách Hero 0

Toàn bộ tướng có trong runtime dump. Bấm vào thẻ để xem skin của tướng đó.

Đang tải danh sách tướng...
Skin catalog

Danh sách skin 0

Toàn bộ skin tướng trong runtime dump — xem nhanh không cần vào tab Dump.

Đang tải danh sách skin...
1 / 1
Đang tải danh sách skin...
Skills & spells

Kỹ năng tướng 0

Nội tại và 3 chiêu của từng tướng kèm mô tả tiếng Việt, cùng danh sách phép bổ trợ.

Phép bổ trợ 0

Đang tải phép bổ trợ...

Kỹ năng theo tướng

Đang tải kỹ năng tướng...
Trang bị trong trận

Trang bị 0

Toàn bộ trang bị của bản đang chạy: nhóm, bậc, giá vàng, chỉ số và nội tại (trang chủ chính thức + patch notes).

Đang tải trang bị...
Player profile

Tài khoản 0

Hồ sơ người chơi do mod trong game đẩy lên: tên, level, VIP, rank và danh sách tướng + skin đang sở hữu.

Battle cosmetics

Skin lính 0

Quản lý skin lính và thứ tự xuất hiện.

Vị tríẢnhTên hiển thịIDThao tác
Virtual match skins

Skin trận ảo 0

Chọn trực tiếp skin có trong runtime dump.