Skip to content

HTTP status codes ​

Tham chiếu đầy đủ HTTP status codes Zorio API trả về và cách CRM xử lý.

2xx — Thành công ​

HTTPKhi nàoBody
200 OKĐa số request GET / PUT / DELETE thành công{ "data": {} } hoặc list paginated
201 CreatedPOST tạo resource mới{ "data": { "id": ..., "..." } }
202 AcceptedTác vụ bất đồng bộ đã được đưa vào hàng đợi (vd click-to-call, import lead){ "data": { "call_uuid": "...", "status": "queued" } }

3xx — Redirect ​

HTTPKhi nàoBody
302 Found/api/pbx/cdr/{uuid}/recording chuyển hướng tới URL có chữ kýEmpty body, header Location: <signed URL>

4xx — Lỗi từ client ​

400 Bad Request ​

Request không hợp lệ ở mức HTTP (JSON malformed, missing required header, ...).

json
{ "message": "Malformed request body" }

Xử lý: kiểm tra JSON đã đúng + header Content-Type: application/json đầy đủ.

401 Unauthorized ​

Token thiếu, không hợp lệ hoặc đã hết hạn.

json
{ "message": "Unauthenticated." }

Xử lý: redirect user đến trang login lấy token mới. KHÔNG hardcode token trong frontend.

403 Forbidden ​

Token hợp lệ nhưng thiếu permission.

json
{ "message": "This action is unauthorized." }

Xử lý: ghi nhật ký + báo quản trị viên cấp thêm quyền cho user (vd pbx_api_access, telesales_api_access).

404 Not Found ​

Resource không tồn tại trong dữ liệu của khách hàng.

json
{ "message": "Resource not found" }

Bảo mật

Khi gửi token sai khách hàng (vd tài khoản A truy vấn data của tài khoản B) — Zorio cũng trả 404 thay vì 403 để không leak existence của resource. CRM không phân biệt được 2 case này.

409 Conflict ​

State machine vi phạm hoặc unique constraint conflict.

json
{ "message": "Extension đã tồn tại trong queue này." }

Xử lý: đồng bộ lại trạng thái từ máy chủ + thông báo user.

422 Unprocessable Entity ​

Validation lỗi — body parse OK nhưng giá trị field không hợp lệ.

json
{
  "message": "The given data was invalid.",
  "errors": {
    "extension_number": ["Định dạng số máy nhánh không hợp lệ."],
    "outbound_caller_id": ["Giá trị đã chọn cho outbound caller id không hợp lệ."]
  }
}

Xử lý:

  • Lặp qua errors object, hiển thị error message bên cạnh field tương ứng trên UI.
  • Nếu là form submit — không refresh trang, giữ state cũ của user.

429 Too Many Requests ​

Vượt rate limit.

json
{ "message": "Too many requests. Retry after 25 seconds." }

Header trả về:

Retry-After: 25
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1782706011

Xử lý: backoff theo Retry-After. Triển khai exponential backoff + jitter để tránh thundering herd.

5xx — Lỗi từ server ​

500 Internal Server Error ​

Lỗi bất ngờ ở backend.

json
{ "message": "Internal server error" }

Xử lý: retry với exponential backoff (3 lần, 1s / 4s / 16s). Nếu vẫn 500 → báo team support Zorio kèm X-Request-Id (nếu có) hoặc timestamp request.

502 Bad Gateway ​

Lỗi tầng dưới — phổ biến nhất:

  • Click-to-call: Zorio PBX không tiếp nhận originate (có thể PBX restart).
json
{ "message": "PBX không tiếp nhận originate cuộc gọi. Vui lòng thử lại." }

Xử lý: retry sau vài giây. Nếu vẫn 502 → escalate.

503 Service Unavailable ​

Hệ thống đang bảo trì hoặc quá tải tạm thời.

json
{ "message": "Service temporarily unavailable" }

Header Retry-After: <giây> cho biết thời gian gợi ý retry.

504 Gateway Timeout ​

Upstream timeout. Hiếm gặp.

Best practice ​

Always handle 4xx + 5xx ​

Mọi API call PHẢI có error handler. KHÔNG mặc định giả định mọi request đều trả về 200 OK.

Phân biệt retry-able vs non-retry-able ​

StatusRetry?Lý do
4xx (trừ 408, 429)KhôngLỗi do client — retry không đổi kết quả
408 Request TimeoutCó (1-3 lần)Có thể do network
429 Too Many RequestsCó (sau Retry-After)Backoff theo header
500, 502, 503, 504Có (exponential backoff)Server lỗi tạm thời

Trace request ​

Header response: X-Request-Id: <uuid> — copy vào ticket support khi báo lỗi, team Zorio dùng để trace nguyên nhân nhanh.

Network error vs HTTP error ​

Network error (DNS fail, connection refused, TLS error) KHÔNG phải HTTP status code — không có body. Cần catch riêng:

js
try {
  const res = await fetch(url, opts);
  if (!res.ok) {
    // HTTP error 4xx / 5xx
  }
} catch (err) {
  // Network error
}

Cấp phép theo điều khoản sử dụng của Zorio.