Chuyển đến nội dung chính

Tài liệu API

Tải số lên, nhận báo giá, đặt đơn và tải kết quả qua HTTP. Phù hợp với các đội ngũ xử lý hàng loạt và tự động hóa. Quy định giống như đặt đơn trên web, và giá tính theo tài khoản của bạn.

Đăng ký quyền truy cập API

  1. Nhờ bộ phận hỗ trợ mở tài khoản cho bạn.
  2. Gửi cho bộ phận hỗ trợ các dịch vụ bạn cần, tài khoản của bạn và IP đầu ra của máy chủ.
  3. Sau đó chúng tôi cấp khóa API và tài liệu tích hợp đầy đủ. Khóa có hiệu lực từ 1–730 ngày, và mỗi khóa cho phép tối đa 32 IP đầu ra.

Quy ước cơ bản

URL gốchttps://api.checkim.ai/openapi/v1
Xác thực
Gửi Authorization: Bearer <khóa API> trong mọi yêu cầu
User-Agent
Bắt buộc. Yêu cầu thiếu User-Agent sẽ bị Cloudflare chặn (error 1010)
Định dạng
Yêu cầu và phản hồi đều là JSON mã hóa UTF-8, trừ khi tải tệp lên
Thời gian
Dấu thời gian Unix theo UTC, tính bằng mili giây
Số tiền
Tối đa tám chữ số thập phân. Hãy dùng kiểu số thập phân và không làm tròn thành hai chữ số

Quy trình tích hợp

  1. Lấy danh sách dịch vụ và kiểm tra số dư. Lưu lại productId bạn cần.
  2. Đọc tuyên bố sử dụng dữ liệu và chấp nhận nếu bạn chưa làm.
  3. Tải tệp số điện thoại lên và lưu lại fileId được trả về.
  4. Nhận báo giá bằng productId và fileId. Kiểm tra số lượng, đơn giá và tổng tiền.
  5. Tạo và lưu một khóa idempotency, sau đó đặt đơn. Bước này sẽ trừ tiền trong số dư của bạn.
  6. Thiết lập webhook để nhận thông báo thay đổi trạng thái đơn, đồng thời đối soát bằng updatedSince mỗi 5–10 phút để không bỏ sót.
  7. Khi đơn hoàn tất, lấy danh sách tệp kết quả, tải về từng tệp và kiểm tra sha256. Tải cả các tệp không thành công.

Ví dụ curl

Thay các phần giữ chỗ bằng giá trị thật. Tham số đầy đủ cho báo giá và đặt đơn có trong tài liệu tích hợp bạn nhận được khi được cấp quyền truy cập.

  1. Đặt khóa và lấy danh sách dịch vụ

    export CHECKIM_TOKEN='thay bằng khóa API do bộ phận hỗ trợ cấp'
    export CHECKIM_BASE='https://api.checkim.ai/openapi/v1'
    
    curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/products"
  2. Tải tệp số điện thoại lên

    curl -H "Authorization: Bearer $CHECKIM_TOKEN" \
      -F 'file=@./numbers.csv;type=text/csv' \
      "$CHECKIM_BASE/files"
  3. Nhận báo giá

    curl -H "Authorization: Bearer $CHECKIM_TOKEN" \
      -H 'Content-Type: application/json' \
      -d '{"productId":"<productId>","name":"batch-001","fileId":"<fileId>"}' \
      "$CHECKIM_BASE/orders/check"
  4. Đặt đơn

    # Bước này trừ tiền trong số dư. Giữ nguyên khóa và nội dung yêu cầu khi thử lại.
    curl -H "Authorization: Bearer $CHECKIM_TOKEN" \
      -H 'Content-Type: application/json' \
      -H 'Idempotency-Key: partner-request-001' \
      -d '{"quoteId":"<quoteId>","clientOrderId":"partner-batch-001"}' \
      "$CHECKIM_BASE/orders"
  5. Xem đơn hàng, hoặc đối soát theo thời gian thay đổi

    curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>"
    
    curl -H "Authorization: Bearer $CHECKIM_TOKEN" \
      "$CHECKIM_BASE/orders?updatedSince=<UTC ms>&size=100"
  6. Liệt kê, tải kết quả và kiểm tra sha256

    curl -H "Authorization: Bearer $CHECKIM_TOKEN" "$CHECKIM_BASE/orders/<orderId>/results"
    
    curl -H "Authorization: Bearer $CHECKIM_TOKEN" -o result.csv \
      "$CHECKIM_BASE/orders/<orderId>/results/<fileId>/download"
    shasum -a 256 result.csv

Danh sách endpoint

Tài khoản và tuyên bố

Danh sách endpoint: Tài khoản và tuyên bố
EndpointMục đích
GET/complianceĐọc tuyên bố sử dụng dữ liệu và xem bạn đã chấp nhận hay chưa
POST/compliance/acceptChấp nhận phiên bản tuyên bố hiện tại
GET/balanceXem số dư tài khoản
GET/productsLiệt kê các dịch vụ có thể đặt và đơn giá của bạn

Tệp và báo giá

Danh sách endpoint: Tệp và báo giá
EndpointMục đích
POST/filesTải lên tệp số điện thoại (multipart, trường "file")
POST/orders/checkKiểm tra số và nhận báo giá, có hiệu lực trong 180 giây

Đơn hàng

Danh sách endpoint: Đơn hàng
EndpointMục đích
POST/ordersĐặt đơn theo báo giá; cần header Idempotency-Key
GET/ordersLiệt kê đơn hàng: phân trang bằng con trỏ, lọc theo trạng thái và thời gian tạo, đối soát bằng updatedSince
GET/orders/{orderId}Xem trạng thái và số lượng của một đơn hàng
POST/orders/{orderId}/cancelHủy đơn: đơn đang xếp hàng hoặc chưa phân phối được hoàn tiền đầy đủ ngay, đơn đã phân phối chuyển sang đang hủy, đơn đang chạy không thể hủy

Kết quả

Danh sách endpoint: Kết quả
EndpointMục đích
GET/orders/{orderId}/resultsLiệt kê các tệp kết quả, mỗi tệp kèm sha256
GET/orders/{orderId}/results/{fileId}/downloadTải về một tệp kết quả, hỗ trợ tải tiếp bằng Range và If-None-Match

Webhook

Danh sách endpoint: Webhook
EndpointMục đích
GET/webhookXem cấu hình webhook và tình trạng gửi
PUT/webhookĐặt URL nhận và các sự kiện cần gửi
DELETE/webhookTắt webhook
GET/webhook/secretXem khóa ký
POST/webhook/secret/rotateXoay vòng khóa ký; khóa cũ và mới cùng ký trong 24 giờ
POST/webhook/testGửi một sự kiện thử
GET/webhook/deliveriesLiệt kê các lần gửi gần đây

Liệt kê và đối soát đơn hàng

  • Đơn hàng được liệt kê từ mới đến cũ. Khi trang có nextCursor, hãy gửi lại nó dưới dạng cursor để lấy trang kế tiếp; phân trang bằng con trỏ không bỏ sót hay lặp lại đơn nào dù có đơn mới.
  • Lọc theo status và thời gian tạo (createdFrom, createdTo, mili giây UTC), hoặc tra cứu một đơn bằng clientOrderId.
  • updatedSince chỉ trả về các đơn có trạng thái thay đổi sau thời điểm đó, theo thứ tự thay đổi cũ nhất trước. Lấy dữ liệu định kỳ bằng tham số này để không mất trạng thái dù bỏ lỡ webhook.

Tải kết quả

  • Mỗi tệp trong danh sách kết quả đều có sha256. ETag khi tải về cũng là giá trị đó, hãy đối chiếu sau khi tải.
  • Yêu cầu Range giúp tải tiếp. Trước tiên hãy kiểm tra sha256 không đổi; nếu đã đổi nghĩa là tệp được tạo lại và cần tải lại toàn bộ.
  • Khi đã có tệp đầy đủ, hãy gửi If-None-Match: tệp không đổi sẽ trả về 304 không có nội dung.
  • Đơn lớn có giao theo đợt sẽ liệt kê các đợt đã xong khi vẫn đang chạy; tệp cuối cùng sau khi hoàn tất là bản chính thức.
  • Với các dịch vụ có ảnh đại diện (kiểm tra mở rộng hoặc kiểm tra giới tính và độ tuổi của Telegram và WhatsApp), cột avatar trong CSV kết quả chứa liên kết ảnh có chữ ký, có thể truy cập trực tiếp bằng GET trong thời gian lưu kết quả (không gửi kèm header Authorization; hỗ trợ If-None-Match).

Webhook

  • Khi trạng thái của đơn đặt qua API thay đổi, chúng tôi gửi một sự kiện bằng POST tới URL HTTPS của bạn. Cần quyền webhook:manage.
  • Mỗi sự kiện có header CheckIM-Signature (t=dấu thời gian,v1=chữ ký). Hãy xác minh bằng HMAC-SHA256 của "t.nội dung yêu cầu gốc" với khóa ký của bạn.
  • Mọi phản hồi 2xx được coi là đã nhận; nếu lỗi sẽ thử lại 9 lần trong khoảng 2 ngày. Bạn có thể nhận một sự kiện nhiều lần, hãy loại trùng theo id.
  • Yêu cầu đến từ IP đầu ra cố định 34.21.195.36, bạn có thể chỉ cho phép địa chỉ này.
Webhook
Sự kiệnGửi khi
order.completedĐơn đã quyết toán và có thể tải kết quả
order.cancelledĐơn đã hủy và được hoàn toàn bộ tiền
order.cancel_pendingĐơn đang hủy và sẽ quyết toán khi dừng thực thi
order.needs_attentionĐơn chuyển sang hậu mãi hoặc cần xử lý thủ công
order.partial_resultsCó đợt kết quả mới sẵn sàng để tải

Trạng thái đơn hàng

Trạng thái đơn hàng
Trạng tháiÝ nghĩa
inQueueĐang xếp hàng. Tiếp tục truy vấn
orderTakenĐã tiếp nhận. Tiếp tục truy vấn
executingĐang chạy. Đơn hàng lớn có giao theo đợt đã có thể tải các đợt đã hoàn tất
completedĐã xong. Tải kết quả và đối chiếu số lượng
waitAfterSaleYêu cầu hậu mãi đang được xử lý
pendingCancelĐang hủy. Tiếp tục truy vấn để biết trạng thái cuối cùng
cancelledĐã hủy. Hoàn toàn bộ tiền nếu còn đang xếp hàng, nếu không thì tính phí theo phần việc đã thực hiện

Giới hạn và lưu ý

  • Mặc định, tối đa 1.200 yêu cầu mỗi phút cho mỗi IP đầu ra, 240 cho mỗi tài khoản và 120 cho mỗi khóa. Các header RateLimit-Limit, RateLimit-Remaining và RateLimit-Reset cho biết còn bao nhiêu lượt trong phút này.
  • Báo giá và tải lên chạy chậm, nên mỗi tài khoản chỉ được chạy đồng thời tối đa 3 yêu cầu loại này. Vượt quá sẽ nhận 429 TOO_MANY_CONCURRENT_REQUESTS.
  • Khi nhận 429 hoặc 503, hãy chờ đủ số giây trong Retry-After rồi gửi lại đúng yêu cầu đó.
  • Không có môi trường thử nghiệm. Mọi đơn hàng đều bị tính phí thật.
  • Truy vấn bị quá thời gian chờ không có nghĩa là đặt đơn thất bại. Hãy tra cứu đơn hàng bằng orderId hoặc clientOrderId trước khi đặt lại.

Lỗi thường gặp

Lỗi gồm code, requestId, message và detail.field (tùy chọn). Hãy xử lý theo code; message trả về một trong 9 ngôn ngữ theo Accept-Language và chỉ để hiển thị.

Lỗi thường gặp
Mã lỗiHTTPCách xử lý
INVALID_REQUEST400Sửa tham số được nêu trong detail.field
INVALID_CURSOR400Con trỏ không hợp lệ; hãy bắt đầu lại từ trang đầu
INVALID_API_TOKEN401Kiểm tra khóa còn đầy đủ, chưa hết hạn và chưa bị thu hồi
PERMISSION_DENIED403Nhờ bộ phận hỗ trợ kiểm tra các dịch vụ và IP đầu ra của bạn
QUOTE_EXPIRED409Xác nhận chưa có đơn hàng nào được đặt, rồi báo giá lại
INSUFFICIENT_BALANCE409Nạp tiền, rồi báo giá và đặt đơn lại
ORDER_NOT_CANCELLABLE409Đơn đã bắt đầu chạy hoặc đã kết thúc nên không thể hủy
RETRY_SAME_REQUEST409Xung đột với thao tác khác; gửi lại đúng yêu cầu đó với thời gian chờ tăng dần
COMPLIANCE_ACCEPTANCE_REQUIRED422Đọc và chấp nhận tuyên bố sử dụng dữ liệu trước
RATE_LIMITED429Chờ theo Retry-After và gửi thưa hơn
TOO_MANY_CONCURRENT_REQUESTS429Chờ báo giá hoặc lượt tải lên trước đó hoàn tất
DATABASE_UNAVAILABLE503Tạm thời không khả dụng; thử lại sau Retry-After

Cần quyền truy cập API?

Gửi cho bộ phận hỗ trợ các dịch vụ bạn cần và IP đầu ra của bạn. Chúng tôi sẽ cấp khóa và tài liệu đầy đủ, kèm một client mẫu bằng Python.