iClinic Developers

Lỗi & giới hạn tốc độ

Mã lỗi

Lỗi luôn có dạng { requestId, error: { code, message } }. Xử lý theo code, không theo message — nội dung message dành cho người đọc và có thể được chỉnh lại.

HTTPerror.codeKhi nàoThử lại?
400INVALID_DATEThiếu hoặc sai định dạng from, to.Không — sửa yêu cầu
400INVALID_RANGEto trước from, hoặc khoảng quá 31 ngày.Không — sửa yêu cầu
400INVALID_STATUSstatus không hợp lệ.Không — sửa yêu cầu
400INVALID_PAGEpage hoặc pageSize sai.Không — sửa yêu cầu
400INVALID_UPDATED_SINCEupdatedSince không phải thời điểm ISO 8601 có múi giờ, hoặc xuất hiện nhiều lần.Không — sửa yêu cầu
400INVALID_CURSORcursor không hợp lệ, hoặc do đường dẫn khác cấp.Không — dùng đúng nextCursor
400INVALID_LIMITlimit không phải số nguyên từ 1 đến 500.Không — sửa yêu cầu
400UNKNOWN_PARAMETERTham số không được hỗ trợ ở đường dẫn này (chỉ với đường dẫn mới; /encounters vẫn bỏ qua tham số lạ).Không — sửa yêu cầu
401UNAUTHORIZEDThiếu, sai hoặc key đã bị thu hồi; hoặc phòng khám đang bị tạm ngưng.Không — kiểm tra lại key
403INSUFFICIENT_SCOPEKey hợp lệ nhưng không có quyền đọc đường dẫn này.Không — xin quyền từ quản trị viên
404NOT_FOUNDKhông có bản ghi với id này trong phòng khám của key.Không
405METHOD_NOT_ALLOWEDChỉ hỗ trợ GET.Không
429RATE_LIMITEDVượt giới hạn tốc độ hoặc IP đang bị khoá tạm.Có — sau Retry-After
5xx—Lỗi phía máy chủ.Có — chờ tăng dần
400 INVALID_RANGE
{
  "requestId": "req_7c1f3a",
  "error": {
    "code": "INVALID_RANGE",
    "message": "`to` phải sau `from` và khoảng tối đa 31 ngày."
  }
}

Giới hạn tốc độ (rate limit)

60yêu cầu mỗi phút, tính theo từng key
5lần gửi sai key trong 10 phút, từ cùng một IP
15′IP bị khoá tạm thời, dù sau đó gửi đúng key

Cả hai giới hạn trả về 429 RATE_LIMITED kèm header Retry-After (số giây). Hãy chờ đúng khoảng đó rồi thử lại, đừng gọi lặp liên tục.

Đừng để hệ thống tự thử lại khi gửi sai key. Một vòng lặp gửi sai key sẽ khoá IP của bạn 15 phút. Khi gặp 401, dừng lại và báo cho người phụ trách kiểm tra key.
Node.js · chờ theo Retry-After
async function callWithRetry(url, options, attempts = 4) {
  for (let i = 0; i < attempts; i += 1) {
    const res = await fetch(url, options);
    if (res.status === 429) {
      const seconds = Number(res.headers.get('Retry-After')) || 30;
      await new Promise((r) => setTimeout(r, seconds * 1000));
      continue;
    }
    if (res.status >= 500) {
      await new Promise((r) => setTimeout(r, 2 ** i * 1000));
      continue;
    }
    return res; // 2xx, 4xx: không thử lại
  }
  throw new Error('Hết số lần thử');
}

Hỗ trợ

Khi cần hỗ trợ, hãy gửi kèm requestId của yêu cầu lỗi (có trong thân phản hồi và header X-Request-Id), thời điểm gọi và tham số bạn đã dùng. Đừng gửi kèm API key — nếu lỡ gửi, hãy thu hồi key đó ngay.

Liên hệ iClinic