Tài liệu API
Sinh khuôn bế bao bì tham số bằng HTTP: chọn mẫu, gửi ba số đo, nhận lại hình học đầy đủ — đường cắt, đường cấn, hệ kích thước, bình khuôn và file sản xuất. Cùng engine mà ứng dụng web đang dùng, không phải bản rút gọn.
Tổng quan
Mọi endpoint nhận và trả JSON UTF-8. Thân yêu cầu tối đa 256 KB.
Đường dẫn công khai bắt đầu bằng /api/v1/.
Có ba nhóm quyền, phân biệt rõ ở từng endpoint bên dưới:
| Nhãn | Nghĩa | Gồm những gì |
|---|---|---|
| mở | Không cần danh tính | Tình trạng máy chủ, danh mục mẫu, danh mục vật liệu |
| khoá API | Cần Authorization: Bearer dlk_… | Sinh khuôn, bình khuôn, xuất file — có đo đếm |
| phiên đăng nhập | Chỉ cookie trình duyệt | Tạo / xem / thu hồi khoá API, thông tin tài khoản |
Chạy trong 3 phút
- Lấy khoá — đăng nhập rồi tạo ở mục Khoá của tôi ngay trên trang này. Khoá hiện đúng một lần.
- Sinh khuôn — gọi
POST /api/v1/designs, nhậndesignId+ bản xem trước. - Xuất file — đưa
designIdsangPOST /api/v1/exportsđể lấy liên kết tải file sạch.
# Đặt khoá vào biến môi trường, đừng viết thẳng vào mã nguồn
export DIELINE_API_KEY="dlk_..."
curl -s __DL_GOC__/api/v1/designs \
-H "Authorization: Bearer $DIELINE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"templateId":"CORRUGATED-RSC","lengthMm":200,"widthMm":150,"heightMm":100,"flute":"C"}'
Xác thực
Gửi khoá ở header Authorization, dạng Bearer:
Authorization: Bearer dlk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Quy tắc về khoá
- Khoá bắt đầu bằng
dlk_— tiền tố cố định để nếu lỡ lọt vào log hay ảnh chụp màn hình thì còn nhận ra mà thu hồi. - Máy chủ không lưu khoá gốc, chỉ lưu bản băm. Mất khoá thì không ai lấy lại được — kể cả chúng tôi. Hãy thu hồi và tạo khoá mới.
- Mỗi tài khoản giữ tối đa 10 khoá còn hiệu lực. Nên tách khoá theo từng hệ thống để thu hồi lẻ khi cần.
- Thu hồi có hiệu lực ngay lập tức, không có độ trễ cache.
- Tài khoản bị khoá thì mọi khoá của nó chết theo, không cần thu hồi từng cái.
- Gói hết hạn thì khoá tự rơi về quyền
free— đi qua đúng một đường tính quyền với trình duyệt, không có ngoại lệ.
Khoá của tôi
Hạn mức & tính phí
Mỗi lời gọi có đo đếm trừ một lượt vào hạn mức ngày của tài khoản (theo giờ Việt Nam, GMT+7). Hạn mức dùng chung cho mọi khoá của cùng tài khoản; bộ đếm riêng từng khoá vẫn được ghi để bạn đối soát xem hệ thống nào tiêu bao nhiêu.
| Gói | REST API / ngày | API key | Xuất file / ngày | Định dạng |
|---|---|---|---|---|
| Miễn phí | Không hỗ trợ | 0 | 2 | SVG |
| Vé ngày | Không hỗ trợ | 0 | 10 | SVG · PDF · AI · Bình khuôn |
| Cá nhân | 1.000 | 3 | 100 | SVG · PDF · AI · Bình khuôn |
| VIP 3 năm | 5.000 | 5 | 500 | SVG · PDF · AI · Bình khuôn |
Cái gì bị trừ lượt, cái gì không
- Bị trừ: mỗi lần
POST /api/v1/designshoặcPOST /api/v1/impositiontrả về200. - Không bị trừ: tham số sai (
400), engine lỗi (5xx) — hỏng việc thì không thu tiền. - Vẫn bị trừ: kết quả lấy từ bộ nhớ đệm. Bạn nhận đủ dữ liệu, nên vẫn tính một lượt.
- Tính riêng:
POST /api/v1/exportstrừ vào lượt xuất file, không trừ thêm lượt API — một việc không thu tiền hai lần.
Giới hạn tần suất
| Giới hạn | Ngưỡng | Vượt thì nhận |
|---|---|---|
| Sinh khuôn | 120 lượt / phút / IP | 429 RATE_LIMITED |
| Xuất file | 10 lượt / phút / IP | 429 RATE_LIMITED |
| Kích thước thân yêu cầu | 256 KB | 413 INVALID_INPUT |
| Kích thước hộp | 1 – 3000 mm mỗi chiều | 400 |
429 là “gọi quá nhanh”, chờ một phút rồi thử lại là được.
402 là “hết hạn mức ngày” hoặc “gói không kèm API” — thử lại
không bao giờ thành công cho tới khi sang ngày hoặc nâng gói. Đừng để
thư viện HTTP tự động lặp lại 402.Danh sách endpoint
Kiểm tra máy chủ sống và biết phiên bản engine.
{ "ok": true, "service": "dieline-gateway", "version": "0.9.131" }Toàn bộ thư viện mẫu. Dùng id làm templateId khi sinh khuôn.
{ "templates": [
{ "id": "ECMA-A2020-0101",
"family": "HOP_GIAY",
"nameVi": "Hộp nắp cài hai đầu — hai nắp CÙNG mặt (ECMA A20.20.01.01)",
"formulaId": "ecma-a20-workbook",
"defaultDimensions": { "lengthMm": 100, "widthMm": 60, "heightMm": 150 } } ] }family quyết định bộ tham số hợp lệ — xem Tham số theo họ mẫu.
Đừng ghi cứng danh sách mẫu trong mã của bạn: thư viện được bổ sung liên tục, hãy đọc từ endpoint này.
Danh mục hồ sơ vật liệu (sóng carton, giấy bìa) kèm độ dày danh định và nguồn dữ liệu.
Sinh khuôn. Đây là endpoint chính.
Tham số bắt buộc
| Trường | Kiểu | Ghi chú |
|---|---|---|
templateId | chuỗi | Mã mẫu lấy từ /api/v1/templates |
lengthMm | số | 1 – 3000 |
widthMm | số | 1 – 3000 |
heightMm | số | 1 – 3000 |
Tham số tuỳ chọn phụ thuộc họ mẫu — xem mục kế tiếp.
Tính bình khuôn: xếp nhiều khuôn lên khổ giấy, trả số con, hướng xếp và tỷ lệ hao phí.
Đổi designId lấy file sạch. Xem Xuất file sạch.
| Trường | Giá trị |
|---|---|
designId | lấy từ phản hồi của /api/v1/designs |
format | SVG · PDF · AI · IMPOSITION |
Đường tải do bước trên phát ra. Có chữ ký, hạn 60 giây, dùng một lần.
Gói hiện tại, hạn mức còn lại, định dạng được phép và số lượt API đã dùng hôm nay.
Liệt kê khoá còn hiệu lực kèm số lượt đã dùng hôm nay. POST để tạo, POST /api/v1/keys/revoke để thu hồi, GET /api/v1/keys/usage lấy số liệu 30 ngày để đối soát.
Tham số theo họ mẫu
400, chứ
không im lặng bỏ qua. Ví dụ gửi flute (sóng carton) cho một mẫu hộp
giấy gấp sẽ hỏng ngay lời gọi.| Họ mẫu | Nhận biết | Tham số riêng |
|---|---|---|
| Carton sóng | family = CARTON_SONG |
flute (E B C A BB BC BA XL) · dimensionMode (MANUFACTURE mặc định · INNER · OUTER) · allowanceProfile (ARTIOSCAD · COMMERCIAL) · thicknessMm · foldLossMm · slotWidthMm · glueFlapMm · bleedMm · overlapMm … |
| Hộp giấy gấp | family = HOP_GIAY |
paperGrade (ivory bristol duplex1 duplex2 couche ford carton kraft) · grammageGsm · caliperMm (0,1–2) · dustFlapStyle · magazineSlot · cornerStyle |
| Mẫu ArtiosCAD tĩnh | Chỉ nhận templateId và showDimensions. Kích thước do chính file bản vẽ quyết định — gửi lengthMm cũng không đổi được. |
Tham số dùng chung
showAdvancedDimensions— hiện đầy đủ tham số kỹ thuật lên bản vẽ, thay vì chỉ dài × rộng × cao.dimensionGroup— chỉ hiện một nhóm kích thước (thân, nắp trên, tai bụi, tai dán, đáy) cho đỡ rối.detailViews— thêm bản trích phóng to cho chi tiết nhỏ.advancedOverrides— ghi đè biến công thức, danh sách cho phép riêng theo từng mẫu.
Đọc kết quả trả về
| Trường | Nội dung |
|---|---|
designId | Mã để xuất file. Suy từ chính bộ tham số nên cùng đầu vào cho cùng mã. |
document.stockEnvelope | Khổ phôi thật cần cắt (mm) — số dùng để đặt giấy. |
document.dimensionSystems | Cả ba hệ kích thước: manufacture, inner (lọt lòng), outer (phủ bì). |
document.entities | Hình học: đường cắt, đường cấn, đường bleed. |
document.foldPreview | Đồ thị tấm và bản lề để mô phỏng gấp 3D. |
formula | Các đại lượng dẫn xuất theo công thức của mẫu. |
materialSelection | Vật liệu engine đã chọn: loại sóng, độ dày, bề rộng rãnh. |
svg | Bản xem trước — đã đóng dấu chìm và làm tròn toạ độ, xem cảnh báo dưới. |
summary.errors / warnings | Số lỗi và cảnh báo khi kiểm tra hình học. |
svg KHÔNG dùng cho sản xuất
Toạ độ trong bản xem trước bị làm tròn về bội 0,5 mm và có lớp
dấu chìm. Đủ đẹp để hiển thị trên màn hình, không đủ chính xác để ra khuôn
bế. File sản xuất chỉ đi qua POST /api/v1/exports.
Ngược lại,
document.dimensionSystems và formula
mang số đo chính xác, không bị làm tròn — cần con số thì đọc ở đó.Xuất file sạch
Ba bước, mỗi bước một lời gọi:
API=__DL_GOC__
AUTH="Authorization: Bearer $DIELINE_API_KEY"
# 1 — sinh khuôn, lấy designId
DESIGN=$(curl -s "$API/api/v1/designs" -H "$AUTH" -H "Content-Type: application/json" \
-d '{"templateId":"CORRUGATED-RSC","lengthMm":200,"widthMm":150,"heightMm":100,"flute":"C"}' \
| jq -r .designId)
# 2 — đổi lấy liên kết tải (hạn 60 giây, dùng một lần)
URL=$(curl -s "$API/api/v1/exports" -H "$AUTH" -H "Content-Type: application/json" \
-d "{\"designId\":\"$DESIGN\",\"format\":\"PDF\"}" | jq -r .downloadUrl)
# 3 — tải NGAY, đừng để dành
curl -s "$API$URL" -o khuon.pdf
410. Cần file lần nữa thì gọi lại
/api/v1/exports (và tốn thêm một lượt xuất).Mã lỗi
Mọi lỗi cùng một khuôn:
{ "error": { "code": "API_QUOTA_EXCEEDED",
"messageVi": "Hết hạn mức gọi API hôm nay — nâng gói hoặc quay lại ngày mai." } }| HTTP | code | Nghĩa & cách xử lý |
|---|---|---|
| 400 | INVALID_INPUTGENERATION_FAILED | Tham số sai hoặc không hợp lệ với họ mẫu. Sửa yêu cầu, đừng thử lại y nguyên. |
| 401 | UNAUTHENTICATED | Thiếu khoá, khoá sai, hoặc khoá đã thu hồi. |
| 402 | PAYMENT_REQUIRED | Gói hiện tại không kèm quyền gọi API. Nâng gói. |
| 402 | API_QUOTA_EXCEEDED | Hết lượt gọi hôm nay. Đừng retry — chờ sang ngày hoặc nâng gói. |
| 402 | QUOTA_EXCEEDED | Hết lượt xuất file hôm nay. |
| 403 | FORBIDDEN | Gói không bao gồm định dạng vừa yêu cầu. |
| 404 | NOT_FOUND | designId hết hiệu lực — dựng lại khuôn rồi xuất lại. |
| 410 | GONE | Liên kết tải đã hết hạn hoặc đã dùng. |
| 413 | INVALID_INPUT | Thân yêu cầu vượt 256 KB. |
| 429 | RATE_LIMITED | Gọi quá nhanh. Chờ rồi thử lại — đây mới là lỗi nên retry. |
| 502/503 | ENGINE_UNAVAILABLE | Engine bận hoặc lỗi. Thử lại sau, không bị trừ lượt. |
Bẫy thường gặp
1. Tham số không tồn tại bị bỏ qua âm thầm
Chỉ những tham số có tên đúng mới có tác dụng. Gửi materialId —
một tên nghe rất hợp lý nhưng không có trong hợp đồng API — thì máy chủ
vẫn trả 200 và lặng lẽ dùng vật liệu mặc định. Với carton sóng,
tên đúng là flute.
| Gửi đi | Kết quả | Khổ phôi nhận về |
|---|---|---|
"materialId":"C-FLUTE" | 200 — bị bỏ qua, rơi về sóng B mặc định | 736 × 307 mm |
"flute":"C" | 200 — đúng ý | 741 × 307 mm |
Cách tự vệ: luôn đọc lại materialSelection trong phản hồi
và so với thứ bạn định đặt. Nếu lệch thì tên tham số của bạn sai.
2. designId không sống mãi
Nó nằm trong bộ nhớ máy chủ. Sau khi máy chủ khởi động lại hoặc bộ nhớ đệm
đầy, mã cũ trả 404. Đừng lưu designId vào cơ sở dữ liệu
để dùng ngày hôm sau — hãy lưu bộ tham số và dựng lại khi cần.
3. /api/generate không phải API công khai
Bạn có thể thấy ứng dụng web gọi /api/generate. Đó là đường nội
bộ của trang, không đo đếm và từ chối lời gọi từ máy chủ khác. Hãy dùng
/api/v1/designs.
4. Số đo lấy nhầm chỗ
Đọc số từ document.dimensionSystems (chính xác), đừng đo lại từ
chuỗi svg (đã làm tròn 0,5 mm).
Ví dụ đầy đủ
JavaScript (Node.js)
const API = "__DL_GOC__";
const KEY = process.env.DIELINE_API_KEY;
async function goi(duongDan, than) {
const res = await fetch(API + duongDan, {
method: "POST",
headers: { "Authorization": `Bearer ${KEY}`, "Content-Type": "application/json" },
body: JSON.stringify(than),
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.error?.code}: ${data.error?.messageVi}`);
return data;
}
const khuon = await goi("/api/v1/designs", {
templateId: "CORRUGATED-RSC", lengthMm: 200, widthMm: 150, heightMm: 100, flute: "C",
});
console.log("Khổ phôi:", khuon.document.stockEnvelope);
console.log("Lọt lòng:", khuon.document.dimensionSystems.inner);
const xuat = await goi("/api/v1/exports", { designId: khuon.designId, format: "PDF" });
const file = await fetch(API + xuat.downloadUrl); // tải NGAY: hạn 60 giây
await require("node:fs/promises").writeFile(xuat.filename, Buffer.from(await file.arrayBuffer()));Python
import os, requests
API = "__DL_GOC__"
S = requests.Session()
S.headers.update({"Authorization": f"Bearer {os.environ['DIELINE_API_KEY']}"})
def goi(duong_dan, than):
r = S.post(API + duong_dan, json=than, timeout=60)
if r.status_code == 402:
raise SystemExit("Hết hạn mức — thử lại cũng vô ích, nâng gói hoặc chờ sang ngày.")
r.raise_for_status()
return r.json()
khuon = goi("/api/v1/designs", {
"templateId": "ECMA-A2020-0101", "lengthMm": 100, "widthMm": 60,
"heightMm": 150, "paperGrade": "ivory", "grammageGsm": 350,
})
print("Khổ phôi:", khuon["document"]["stockEnvelope"])
xuat = goi("/api/v1/exports", {"designId": khuon["designId"], "format": "PDF"})
open(xuat["filename"], "wb").write(S.get(API + xuat["downloadUrl"]).content)