Skip to content
Ngôn ngữ: Tiếng Việt

API cho nhà phát triển

Định dạng lỗi API và mã lỗi

Cập nhật 1 tháng 11, 2026 6 phút đọc

Phản hồi lỗi của API LinkHarbor có cấu trúc thế nào, các mã lỗi quan trọng nhất có nghĩa gì và mã của bạn nên phản ứng ra sao.

Mọi phản hồi lỗi của API đều có cùng định dạng. Mã của bạn nên dựa vào mã lỗi trong trường error, không dựa vào văn bản trong message – mã luôn ổn định, còn văn bản có thể thay đổi và được dịch sang ngôn ngữ tài khoản.

Cấu trúc của phản hồi lỗi

Ví dụ: 422 validation_failed
{
  "error": "validation_failed",
  "message": "Some of the information provided is invalid. Please check and try again.",
  "details": [
    { "field": "title", "reason": "minLength", "message": "…" }
  ],
  "request_id": "6b1f0c2e-…"
}
error
Mã máy đọc được, ví dụ not_found. Với phần lớn lỗi, mã này cũng có trong header X-Error-Code – nhưng hãy dựa vào trường trong phần thân.
message
Mô tả cho người đọc theo ngôn ngữ tài khoản: với khóa API là ngôn ngữ của chủ sở hữu không gian làm việc, với ứng dụng đã kết nối là ngôn ngữ của người đã kết nối nó. Khi không có token hợp lệ – ví dụ 401 từ bước kiểm tra token – ngôn ngữ theo Accept-Language, nếu không thì là tiếng Anh. Header Content-Language nêu ngôn ngữ.
details
Chỉ có khi cần nói thêm. Với 422 từ kiểm tra dữ liệu nhập, là một danh sách với field, reason và message cho từng vấn đề; với 422 từ logic nghiệp vụ và mọi lỗi khác, là một object, ví dụ với reason, retry_after_sec hoặc danh sách issues. Khi vượt kích thước, nó chứa field, reason và limit, và với 413 request_too_large là max_bytes và max_kb. Vì vậy hãy kiểm tra details có phải danh sách không.
request_id
ID của yêu cầu. ID này cũng có trong header X-Request-Id. Hãy gửi kèm khi liên hệ bộ phận hỗ trợ.

Ngoại lệ: phản hồi 429 rate_limited có trường retry_after_sec thay vì details; với 429 và 403 insufficient_scope, request_id không có trong phần thân. 401 từ bước kiểm tra token và 422 từ bước kiểm tra schema không có header X-Error-Code, và với bước kiểm tra schema chỉ message cấp cao nhất được dịch; các văn bản bên trong details vẫn bằng tiếng Anh. Header X-Request-Id luôn được đặt.

Các mã quan trọng nhất

HTTPerrorÝ nghĩaCần làm gì
400invalid_jsonPhần thân không phải JSON hợp lệKiểm tra JSON
400bad_requestSai Content-Type hoặc yêu cầu sai định dạngĐặt Content-Type: application/json
401missing_bearer_tokenKhông có token trong header AuthorizationĐặt header Authorization: Bearer …
401invalid_tokenToken hết hạn hoặc không hợp lệ, hoặc khóa đã bị xóaLấy token mới; nếu không được, hãy kiểm tra khóa
401invalid_api_keySai ID khóa hoặc mã bí mật khi đổi tokenKiểm tra thông tin xác thực
402plan_limit_reachedĐạt giới hạn của gói, ví dụ với liên kết rút gọnNâng cấp hoặc xóa bớt mục
403insufficient_scopeThiếu phạm vi hoặc endpoint không mở cho khóa APITạo khóa với đúng phạm vi
403forbiddenKhông có quyền cho thao tác nàyThực hiện trong bảng điều khiển
403feature_not_availableTính năng không có trong góiKiểm tra gói
403block_type_requires_planLoại khối chỉ có ở gói cao hơnChọn loại khối khác hoặc nâng cấp
403template_lockedMẫu premium không có trong gói hiện tạiChọn mẫu từ GET /v1/templates/available
403workspace_suspended, workspace_read_only, workspace_grace_expiredKhông gian làm việc bị khóa hoặc chỉ đọc vì khoản thanh toán còn nợXử lý thanh toán trong bảng điều khiển
404not_foundTài nguyên không tồn tại hoặc không thuộc không gian làm việc của bạnKiểm tra ID
409conflictXung đột chung với trạng thái hiện tạiTải lại trạng thái, thay đổi dữ liệu nhập
409workspace_template_in_useMẫu không gian làm việc vẫn đang được các trang dùng; số lượng nằm trong details.countChuyển các trang sang mẫu khác rồi xóa
409handle_taken, slug_takenHandle hoặc slug liên kết rút gọn đã có người dùngChọn giá trị khác
409form_in_use, page_not_private, page_not_published, never_publishedXung đột với trạng thái: biểu mẫu vẫn ở trên trang, trang không riêng tư hoặc chưa xuất bản, chưa từng xuất bảnThay đổi trạng thái rồi thử lại
409page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reachedĐạt giới hạn số lượng hoặc dung lượng của góiXóa bớt mục hoặc nâng cấp
409draft_not_publishableBản nháp có vấn đề; danh sách nằm trong details.issuesSửa các vấn đề rồi xuất bản lại
413request_too_largePhần thân lớn hơn mức cho phép của endpoint này (64 KB, 1 MB hoặc 2 MB); giới hạn nằm trong details.max_kbGửi ít dữ liệu hơn mỗi yêu cầu, xem Giới hạn tần suất
413payload_too_largeTệp tải lên lớn hơn 10 MBLàm tệp nhỏ hơn
422validation_failedDữ liệu nhập không hợp lệ hoặc trường không xác định; chi tiết trong detailsSửa các trường như mô tả trong details
422handle_reserved, target_url_invalid, target_url_scheme, target_url_hostHandle được dành riêng, hoặc URL đích không hợp lệ hay không được phépChọn giá trị khác
422workspace_template_disabledMẫu không gian làm việc đã chọn bị tắtBật mẫu trong “Tên miền & mẫu” hoặc chọn mẫu khác
422template_css_external, template_section_invalidMẫu không gian làm việc: CSS tải từ máy chủ bên ngoài, hoặc một phần {{#if}}/{{#unless}}/{{#each}} đặt sai vị tríXóa địa chỉ bên ngoài, hoặc đóng phần đó trong cùng thẻ hoặc văn bản
422custom_css_externalCSS tùy chỉnh tải nội dung từ máy chủ bên ngoàiXóa địa chỉ bên ngoài khỏi CSS
429rate_limited, api_key_lockedQuá nhiều yêu cầu, hoặc khóa bị khóa sau các lần thử saiĐợi theo Retry-After hoặc details.retry_after_sec
500internal_errorLỗi không mong muốnThử lại sau, ghi lại request_id
503service_unavailableDịch vụ tạm thời không khả dụngThử lại sau một khoảng nghỉ

Đọc lỗi dữ liệu nhập

Với 422 validation_failed, details liệt kê riêng từng vấn đề: field là đường dẫn của trường (với dấu gạch chéo cho object lồng nhau, ví dụ theme_config/button_style), reason là quy tắc bị vi phạm, như required, minLength, maxLength, enum hoặc additionalProperties. Với additionalProperties, message cho biết những trường nào không xác định – thường do gõ sai tên trường.

Cách xử lý khuyến nghị trong mã

  • 400, 413 và 422: đừng thử lại, hãy sửa yêu cầu
  • 401 invalid_token: lấy token mới một lần rồi thử lại
  • 403: đừng thử lại; hãy kiểm tra phạm vi, gói hoặc ai được phép làm việc này
  • 404: kiểm tra ID; sau khi xóa thì điều này là bình thường
  • 409: tải lại trạng thái và quyết định thao tác có còn cần không
  • 429: đợi theo Retry-After rồi thử lại – xem Giới hạn tần suất
  • 500 và 503: thử lại vài lần với khoảng nghỉ tăng dần

Không tìm thấy?

Hãy cho chúng tôi biết bạn cần gì, đội hỗ trợ sẽ trực tiếp giúp bạn.

Liên hệ hỗ trợ