Tài liệu API
REST API (JSON) để tích hợp mua chứng chỉ Apple vào website, ứng dụng hoặc bot của bạn.
Base URL
https://certnew.com/api/v1Xác thực
Tạo token tại mục API Key và gửi kèm trong header Authorization của mọi request.
- • Mỗi tài khoản có 1 token. Tạo lại sẽ vô hiệu hoá token cũ ngay.
- • Chỉ gọi API từ máy chủ của bạn, không đặt token trong app hay mã phía trình duyệt.
- • Token chỉ truy cập được dữ liệu của chính tài khoản tạo ra nó.
Authorization: Bearer YOUR_API_TOKENLuồng mua chứng chỉ
- 1
GET /packages
Lấy danh sách gói đang bán, chọn gói cần mua và lấy id của gói (packageId).
- 2
POST /orders
Gửi UDID thiết bị và packageId để tạo đơn. Lưu lại id đơn trả về.
- 3
GET /orders/{id}
Xem trạng thái đơn. COMPLETED là đã cấp xong; FAILED là không cấp được, tiền tự hoàn về ví.
- 4
GET /orders/{id}/certificate
Khi đơn COMPLETED, tải chứng chỉ gồm file .p12, .mobileprovision và mật khẩu.
/api/v1/balanceXem số dư
Số dư ví hiện tại (balance, đơn vị VND) của tài khoản sở hữu token.
Ví dụ
$ curl "https://certnew.com/api/v1/balance" -H "Authorization: Bearer $CERTNEW_TOKEN"Trả về200 OK
{
"balance": 500000
}/api/v1/packagesDanh sách gói
Các gói đang bán, không cần token. price là giá (VND), days là thời hạn dùng, warranty là số ngày bảo hành (0 = không bảo hành). inStock = false nghĩa là đang hết hàng.
Ví dụ
$ curl "https://certnew.com/api/v1/packages"Trả về200 OK
{
"inStock": true,
"packages": [
{
"id": 1,
"name": "Gói Sale",
"price": 30000,
"days": 365,
"warranty": 0,
"note": "Chứng Chỉ iPhone / iPad Cá Nhân.",
"features": [
"Sử dụng 01 thiết bị duy nhất.",
"Hỗ trợ Unban xóa bỏ blacklist.",
"Chứng chỉ P12 và tệp MobileProvision.",
"Hỗ trợ cài đặt ứng dụng ESign."
]
}
]
}/api/v1/ordersTạo đơn hàng
Gửi UDID và gói là mua được: UDID chưa có trong tài khoản sẽ tự được thêm, đã có thì dùng lại. Trừ tiền ví ngay và bắt đầu cấp chứng chỉ (thường 1–5 phút). Đơn trả về ở trạng thái PENDING; theo dõi bằng GET /api/v1/orders/{id} tới khi COMPLETED hoặc FAILED. Nên gửi Idempotency-Key để gọi lại khi mất mạng không bị trừ tiền 2 lần.
Header
Idempotency-KeystringTuỳ chọnKhuyến nghị. 8-64 ký tự [A-Za-z0-9._:-]. Gửi lại cùng key trả về đúng đơn cũ, không trừ tiền lần 2.
Body (JSON)
udidstringBắt buộcUDID thiết bị cần cấp chứng chỉ, vd 00008110-001A2B3C4D5E6F70
packageIdintegerBắt buộcID gói (lấy từ GET /api/v1/packages)
Mã lỗi
- 400
INVALID_DATADữ liệu không hợp lệ, xem trường issues - 404
PACKAGE_NOT_FOUNDGói không tồn tại hoặc đã ngừng bán - 402
INSUFFICIENT_BALANCESố dư không đủ - 409
OUT_OF_STOCKHết hàng
Ví dụ
$ curl -X POST "https://certnew.com/api/v1/orders" -H "Authorization: Bearer $CERTNEW_TOKEN" -H "Idempotency-Key: order-20260925-0001" -H "Content-Type: application/json" -d '{"udid":"00008110-001A2B3C4D5E6F70","packageId":1}'Trả về201 Created
{
"order": {
"id": "5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10",
"status": "PENDING",
"price": 30000,
"source": "API",
"package": {
"id": 1,
"name": "Gói Sale",
"days": 365
},
"device": {
"id": 12,
"name": "iPhone 15 Pro",
"udid": "00008130-001A2B3C4D5E6F70"
},
"certificate": null,
"error": null,
"warrantyOf": null,
"warrantyUntil": null,
"reissuedBy": null,
"createdAt": "2026-09-25T08:00:00.000Z"
}
}/api/v1/orders/{id}Trạng thái đơn
Trạng thái đơn (PENDING → PROCESSING → COMPLETED | FAILED) và thông tin chứng chỉ. Hạn sử dụng chứng chỉ ở certificate.expireAt, hạn bảo hành ở warrantyUntil. Chứng chỉ bị thu hồi và được cấp lại theo bảo hành: đơn giữ nguyên mã, certificate là chứng chỉ mới; reissuedBy là đơn cấp lại mới nhất (id, status), null = chưa cấp lại.
Mã lỗi
- 404
ORDER_NOT_FOUNDĐơn không tồn tại hoặc không thuộc tài khoản
Ví dụ
$ curl "https://certnew.com/api/v1/orders/5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10" -H "Authorization: Bearer $CERTNEW_TOKEN"Trả về200 OK
{
"order": {
"id": "5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10",
"status": "COMPLETED",
"price": 30000,
"source": "API",
"package": {
"id": 1,
"name": "Gói Sale",
"days": 365
},
"device": {
"id": 12,
"name": "iPhone 15 Pro",
"udid": "00008130-001A2B3C4D5E6F70"
},
"certificate": {
"name": "Nguyen Van A",
"state": "valid",
"revokedAt": null,
"expireAt": "2027-09-25T00:00:00.000Z"
},
"error": null,
"warrantyOf": null,
"warrantyUntil": null,
"reissuedBy": null,
"createdAt": "2026-09-25T08:00:00.000Z"
}
}/api/v1/ordersDanh sách đơn
Các đơn của tài khoản, mới nhất trước, 10 đơn mỗi trang. Thêm ?udid=... để xem các đơn của một UDID.
Query
pageintegerTuỳ chọnTrang, mặc định 1
udidstringTuỳ chọnLọc theo UDID thiết bị
Ví dụ
$ curl "https://certnew.com/api/v1/orders" -H "Authorization: Bearer $CERTNEW_TOKEN"Trả về200 OK
{
"orders": [
{
"id": "5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10",
"status": "COMPLETED",
"price": 30000,
"source": "API",
"package": {
"id": 1,
"name": "Gói Sale",
"days": 365
},
"device": {
"id": 12,
"name": "iPhone 15 Pro",
"udid": "00008130-001A2B3C4D5E6F70"
},
"certificate": {
"name": "Nguyen Van A",
"state": "valid",
"revokedAt": null,
"expireAt": "2027-09-25T00:00:00.000Z"
},
"error": null,
"warrantyOf": null,
"warrantyUntil": null,
"reissuedBy": null,
"createdAt": "2026-09-25T08:00:00.000Z"
}
],
"page": 1,
"pageSize": 10,
"total": 1
}/api/v1/orders/{id}/certificateTải chứng chỉ
Chỉ dùng khi đơn đã COMPLETED. Mặc định trả JSON (file dạng base64 + mật khẩu p12). Thêm ?file=zip để tải 1 file zip gồm .p12, .mobileprovision và password.txt; ?file=p12 hoặc ?file=mobileprovision để tải từng file. Chứng chỉ không lưu trên máy chủ, mỗi lần gọi lấy bản mới. Đơn đã được cấp lại theo bảo hành thì trả chứng chỉ của lần cấp lại mới nhất, vẫn gọi bằng mã đơn gốc. Chứng chỉ đã bị thu hồi vẫn tải được, xem trường state (revoked) trước khi giao cho khách.
Query
file"zip" | "p12" | "mobileprovision"Tuỳ chọnTải file thay vì JSON
Mã lỗi
- 404
ORDER_NOT_FOUNDĐơn không tồn tại hoặc không thuộc tài khoản - 409
CERT_NOT_READYĐơn chưa COMPLETED - 400
INVALID_FILETham số file phải là zip, p12 hoặc mobileprovision - 502
UPSTREAM_UNAVAILABLENhà cung cấp chứng chỉ tạm lỗi, thử lại sau
Ví dụ
$ curl "https://certnew.com/api/v1/orders/5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10/certificate" -H "Authorization: Bearer $CERTNEW_TOKEN"Trả về200 OK
{
"p12": "MIIMaQIBAzCCDC8GCSqGSIb3…",
"mobileprovision": "MIIdvwYJKoZIhvcNAQcCoIId…",
"password": "1",
"name": "Nguyen Van A",
"state": "valid",
"revokedAt": null,
"expireAt": "2027-09-25T00:00:00.000Z"
}/api/v1/orders/{id}/warrantyYêu cầu bảo hành
Chứng chỉ của đơn bị Apple thu hồi khi còn hạn bảo hành (warrantyUntil) thì gọi để được cấp lại miễn phí, không giới hạn số lần. Hệ thống kiểm tra lại với Apple ngay lúc gọi; hợp lệ thì trả về đơn gốc với reissuedBy đang PENDING. Theo dõi bằng GET /api/v1/orders/{id} tới khi reissuedBy.status là COMPLETED (thường 1–5 phút), rồi tải chứng chỉ mới bằng GET /api/v1/orders/{id}/certificate với chính mã đơn gốc.
Mã lỗi
- 404
ORDER_NOT_FOUNDĐơn không tồn tại hoặc không thuộc tài khoản - 409
ORDER_NOT_COMPLETEDĐơn chưa được cấp chứng chỉ - 409
NO_WARRANTYGói của đơn không có bảo hành - 409
WARRANTY_EXPIREDĐơn đã hết hạn bảo hành - 409
NOT_REVOKEDChứng chỉ chưa bị Apple thu hồi, chưa cần bảo hành - 409
WARRANTY_IN_PROGRESSĐang cấp lại chứng chỉ cho đơn này, chờ hoàn tất - 409
SITE_ORDERĐơn của web con, liên hệ admin để bảo hành
Ví dụ
$ curl -X POST "https://certnew.com/api/v1/orders/5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10/warranty" -H "Authorization: Bearer $CERTNEW_TOKEN"Trả về201 Created
{
"order": {
"id": "5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10",
"status": "COMPLETED",
"price": 30000,
"source": "API",
"package": {
"id": 1,
"name": "Gói Sale",
"days": 365
},
"device": {
"id": 12,
"name": "iPhone 15 Pro",
"udid": "00008130-001A2B3C4D5E6F70"
},
"certificate": {
"name": "Nguyen Van A",
"state": "revoked",
"revokedAt": "2026-10-01T02:00:00.000Z",
"expireAt": "2027-09-25T00:00:00.000Z"
},
"error": null,
"warrantyOf": null,
"warrantyUntil": "2026-12-24T08:00:00.000Z",
"reissuedBy": {
"id": "9c2e4b1a-7d3f-4e8a-b5c6-1f0a2d3e4b5c",
"status": "PENDING",
"createdAt": "2026-10-01T03:00:00.000Z"
},
"createdAt": "2026-09-25T08:00:00.000Z"
}
}Lỗi chung
Khi có lỗi, API trả HTTP khác 2xx kèm JSON gồm error (mã lỗi, dùng để xử lý) và message (mô tả để hiển thị). Lỗi riêng của từng endpoint nằm ngay trong mục endpoint đó; dưới đây là các lỗi có thể gặp ở mọi endpoint.
Mã lỗi
- 401
UNAUTHORIZEDThiếu token / phiên đăng nhập - 401
INVALID_TOKENToken sai hoặc đã bị thay bằng token mới. Sai liên tục nhiều lần, IP sẽ bị chặn tạm thời - 403
IP_BLOCKEDIP đang bị chặn - 400
INVALID_JSONBody không phải JSON hợp lệ - 413
PAYLOAD_TOO_LARGEBody quá 16KB - 429
RATE_LIMITEDVượt giới hạn tần suất - 500
SYSTEM_ERRORLỗi hệ thống