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
- Nhờ bộ phận hỗ trợ mở tài khoản cho bạn.
- 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ủ.
- 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ốc
https://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
- Lấy danh sách dịch vụ và kiểm tra số dư. Lưu lại productId bạn cần.
- Đọc tuyên bố sử dụng dữ liệu và chấp nhận nếu bạn chưa làm.
- Tải tệp số điện thoại lên và lưu lại fileId được trả về.
- Nhận báo giá bằng productId và fileId. Kiểm tra số lượng, đơn giá và tổng tiền.
- 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.
- 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.
- 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.
Đặ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"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"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"Đặ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"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"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ố
| Endpoint | Mụ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 | Chấp nhận phiên bản tuyên bố hiện tại |
GET/balance | Xem số dư tài khoản |
GET/products | Liệt kê các dịch vụ có thể đặt và đơn giá của bạn |
Tệp và báo giá
| Endpoint | Mục đích |
|---|---|
POST/files | Tải lên tệp số điện thoại (multipart, trường "file") |
POST/orders | Kiểm tra số và nhận báo giá, có hiệu lực trong 180 giây |
Đơn hàng
| Endpoint | Mục đích |
|---|---|
POST/orders | Đặt đơn theo báo giá; cần header Idempotency-Key |
GET/orders | Liệ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 | Xem trạng thái và số lượng của một đơn hàng |
POST/orders | Hủ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ả
| Endpoint | Mục đích |
|---|---|
GET/orders | Liệt kê các tệp kết quả, mỗi tệp kèm sha256 |
GET/orders | Tải về một tệp kết quả, hỗ trợ tải tiếp bằng Range và If-None-Match |
Webhook
| Endpoint | Mục đích |
|---|---|
GET/webhook | Xem 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/webhook | Tắt webhook |
GET/webhook | Xem khóa ký |
POST/webhook | Xoay vòng khóa ký; khóa cũ và mới cùng ký trong 24 giờ |
POST/webhook | Gửi một sự kiện thử |
GET/webhook | Liệ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.
| Sự kiện | Gử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_results | Có đợt kết quả mới sẵn sàng để tải |
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 |
waitAfterSale | Yê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ị.
| Mã lỗi | HTTP | Cách xử lý |
|---|---|---|
INVALID_REQUEST | 400 | Sửa tham số được nêu trong detail.field |
INVALID_CURSOR | 400 | Con trỏ không hợp lệ; hãy bắt đầu lại từ trang đầu |
INVALID_API_TOKEN | 401 | Kiểm tra khóa còn đầy đủ, chưa hết hạn và chưa bị thu hồi |
PERMISSION_DENIED | 403 | Nhờ bộ phận hỗ trợ kiểm tra các dịch vụ và IP đầu ra của bạn |
QUOTE_EXPIRED | 409 | Xác nhận chưa có đơn hàng nào được đặt, rồi báo giá lại |
INSUFFICIENT_BALANCE | 409 | Nạp tiền, rồi báo giá và đặt đơn lại |
ORDER_NOT_CANCELLABLE | 409 | Đơn đã bắt đầu chạy hoặc đã kết thúc nên không thể hủy |
RETRY_SAME_REQUEST | 409 | Xung độ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_REQUIRED | 422 | Đọc và chấp nhận tuyên bố sử dụng dữ liệu trước |
RATE_LIMITED | 429 | Chờ theo Retry-After và gửi thưa hơn |
TOO_MANY_CONCURRENT_REQUESTS | 429 | Chờ báo giá hoặc lượt tải lên trước đó hoàn tất |
DATABASE_UNAVAILABLE | 503 | Tạ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.