DDIELINE API v1 đang kiểm…

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.

Máy chủ
__DL_GOC__
Phiên bản engine
Số mẫu trong thư việ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ãnNghĩaGồm những gì
mởKhông cần danh tínhTình trạng máy chủ, danh mục mẫu, danh mục vật liệu
khoá APICần Authorization: Bearer dlk_…Sinh khuôn, bình khuôn, xuất file — có đo đếm
phiên đăng nhậpChỉ cookie trình duyệtTạo / xem / thu hồi khoá API, thông tin tài khoản
Vì sao quản lý khoá không dùng được bằng khoá Một khoá lỡ lộ chỉ tiêu được hạn mức của bạn. Nó không tự tạo được khoá mới, không thu hồi được khoá khác, không chạm được trang quản trị hay dữ liệu đơn hàng. Muốn làm những việc đó phải đăng nhập bằng trình duyệt.

Chạy trong 3 phút

  1. 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.
  2. Sinh khuôn — gọi POST /api/v1/designs, nhận designId + bản xem trước.
  3. Xuất file — đưa designId sang POST /api/v1/exports để lấy liên kết tải file sạch.
bash — hộp carton sóng C, 200 × 150 × 100 mm
# Đặ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:

http
Authorization: Bearer dlk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Quy tắc về khoá

Khoá là bí mật ngang mật khẩu Đừng nhúng vào JavaScript chạy trên trình duyệt, ứng dụng di động hay kho mã công khai — ai đọc được cũng tiêu được hạn mức của bạn. Khoá chỉ nên nằm ở máy chủ của bạn, trong biến môi trường.

Khoá của tôi

Đang kiểm tra trạng thái đăng nhập…

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óiREST API / ngàyAPI keyXuất file / ngàyĐịnh dạng
Miễn phíKhông hỗ trợ02SVG
Vé ngàyKhông hỗ trợ010SVG · PDF · AI · Bình khuôn
Cá nhân1.0003100SVG · PDF · AI · Bình khuôn
VIP 3 năm5.0005500SVG · PDF · AI · Bình khuôn

Bảng trên đọc thẳng từ cấu hình gói của máy chủ; xem giá tại trang Bảng giá.

Cái gì bị trừ lượt, cái gì không

Giới hạn tần suất

Giới hạnNgưỡngVượt thì nhận
Sinh khuôn120 lượt / phút / IP429 RATE_LIMITED
Xuất file10 lượt / phút / IP429 RATE_LIMITED
Kích thước thân yêu cầu256 KB413 INVALID_INPUT
Kích thước hộp1 – 3000 mm mỗi chiều400
Phân biệt 429 và 402 — quan trọng khi viết retry 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

GET/api/v1/healthmở

Kiểm tra máy chủ sống và biết phiên bản engine.

phản hồi
{ "ok": true, "service": "dieline-gateway", "version": "0.9.131" }
GET/api/v1/templatesmở

Toàn bộ thư viện mẫu. Dùng id làm templateId khi sinh khuôn.

phản hồi (rút gọ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.

GET/api/v1/materialsmở

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.

POST/api/v1/designskhoá API · trừ 1 lượt

Sinh khuôn. Đây là endpoint chính.

Tham số bắt buộc

TrườngKiểuGhi chú
templateIdchuỗiMã mẫu lấy từ /api/v1/templates
lengthMmsố1 – 3000
widthMmsố1 – 3000
heightMmsố1 – 3000

Tham số tuỳ chọn phụ thuộc họ mẫu — xem mục kế tiếp.

POST/api/v1/impositionkhoá API · trừ 1 lượt

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í.

POST/api/v1/exportskhoá API · trừ 1 lượt xuất

Đổi designId lấy file sạch. Xem Xuất file sạch.

TrườngGiá trị
designIdlấy từ phản hồi của /api/v1/designs
formatSVG · PDF · AI · IMPOSITION
GET/api/v1/exports/downloadliên kết đã ký

Đườ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.

GET/api/v1/mekhoá API

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.

GET/api/v1/keysphiên đăng nhập

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

Đây là chỗ vấp nhiều nhất Gửi tham số của họ mẫu khác sẽ bị từ chối thẳng bằng 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ẫuNhận biếtTham số riêng
Carton sóng family = CARTON_SONG
CORRUGATED-*
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
ECMA-*, FOLDING-*
paperGrade (ivory bristol duplex1 duplex2 couche ford carton kraft) · grammageGsm · caliperMm (0,1–2) · dustFlapStyle · magazineSlot · cornerStyle
Mẫu ArtiosCAD tĩnh ARD-* Chỉ nhận templateIdshowDimensions. 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

Đọc kết quả trả về

TrườngNội dung
designIdMã để xuất file. Suy từ chính bộ tham số nên cùng đầu vào cho cùng mã.
document.stockEnvelopeKhổ phôi thật cần cắt (mm) — số dùng để đặt giấy.
document.dimensionSystemsCả ba hệ kích thước: manufacture, inner (lọt lòng), outer (phủ bì).
document.entitiesHì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.
formulaCác đại lượng dẫn xuất theo công thức của mẫu.
materialSelectionVật liệu engine đã chọn: loại sóng, độ dày, bề rộng rãnh.
svgBản xem trước — đã đóng dấu chìm và làm tròn toạ độ, xem cảnh báo dưới.
summary.errors / warningsSố lỗi và cảnh báo khi kiểm tra hình học.
Trường 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.dimensionSystemsformula 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:

bash — sinh khuôn rồi tải PDF
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
Liên kết tải sống 60 giây và chỉ dùng được một lần Lấy xong phải tải ngay. Đừng lưu vào hàng đợi hay gửi qua email — lần mở thứ hai sẽ nhận 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:

json
{ "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." } }
HTTPcodeNghĩa & cách xử lý
400INVALID_INPUT
GENERATION_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.
401UNAUTHENTICATEDThiếu khoá, khoá sai, hoặc khoá đã thu hồi.
402PAYMENT_REQUIREDGói hiện tại không kèm quyền gọi API. Nâng gói.
402API_QUOTA_EXCEEDEDHết lượt gọi hôm nay. Đừng retry — chờ sang ngày hoặc nâng gói.
402QUOTA_EXCEEDEDHết lượt xuất file hôm nay.
403FORBIDDENGói không bao gồm định dạng vừa yêu cầu.
404NOT_FOUNDdesignId hết hiệu lực — dựng lại khuôn rồi xuất lại.
410GONELiên kết tải đã hết hạn hoặc đã dùng.
413INVALID_INPUTThân yêu cầu vượt 256 KB.
429RATE_LIMITEDGọi quá nhanh. Chờ rồi thử lại — đây mới là lỗi nên retry.
502/503ENGINE_UNAVAILABLEEngine 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 điKết quảKhổ phôi nhận về
"materialId":"C-FLUTE"200 — bị bỏ qua, rơi về sóng B mặc định736 × 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)

node — sinh khuôn rồi xuất PDF
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

python 3 — requests
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)
Cần mẫu chưa có trong thư viện? Thư viện đang có hàng trăm mẫu và được bổ sung liên tục theo chuẩn FEFCO và ECMA. Nếu thiếu mẫu bạn cần, hãy liên hệ qua trang liên hệ.