Cert New

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/v1

Xá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ó.
Header
Authorization: Bearer YOUR_API_TOKEN

Luồng mua chứng chỉ

  1. 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. 2

    POST /orders

    Gửi UDID thiết bị và packageId để tạo đơn. Lưu lại id đơn trả về.

  3. 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. 4

    GET /orders/{id}/certificate

    Khi đơn COMPLETED, tải chứng chỉ gồm file .p12, .mobileprovision và mật khẩu.

GET/api/v1/balance

Xem 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ụ

Request
$ curl "https://certnew.com/api/v1/balance" -H "Authorization: Bearer $CERTNEW_TOKEN"

Trả về200 OK

Response
{
  "balance": 500000
}
GET/api/v1/packages

Danh 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ụ

Request
$ curl "https://certnew.com/api/v1/packages"

Trả về200 OK

Response
{
  "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."
      ]
    }
  ]
}
POST/api/v1/orders

Tạ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ọn

Khuyế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ộc

UDID thiết bị cần cấp chứng chỉ, vd 00008110-001A2B3C4D5E6F70

packageIdintegerBắt buộc

ID gói (lấy từ GET /api/v1/packages)

Mã lỗi

  • 400INVALID_DATADữ liệu không hợp lệ, xem trường issues
  • 404PACKAGE_NOT_FOUNDGói không tồn tại hoặc đã ngừng bán
  • 402INSUFFICIENT_BALANCESố dư không đủ
  • 409OUT_OF_STOCKHết hàng

Ví dụ

Request
$ 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

Response
{
  "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"
  }
}
GET/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

  • 404ORDER_NOT_FOUNDĐơn không tồn tại hoặc không thuộc tài khoản

Ví dụ

Request
$ curl "https://certnew.com/api/v1/orders/5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10" -H "Authorization: Bearer $CERTNEW_TOKEN"

Trả về200 OK

Response
{
  "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"
  }
}
GET/api/v1/orders

Danh 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ọn

Trang, mặc định 1

udidstringTuỳ chọn

Lọc theo UDID thiết bị

Ví dụ

Request
$ curl "https://certnew.com/api/v1/orders" -H "Authorization: Bearer $CERTNEW_TOKEN"

Trả về200 OK

Response
{
  "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
}
GET/api/v1/orders/{id}/certificate

Tả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ọn

Tải file thay vì JSON

Mã lỗi

  • 404ORDER_NOT_FOUNDĐơn không tồn tại hoặc không thuộc tài khoản
  • 409CERT_NOT_READYĐơn chưa COMPLETED
  • 400INVALID_FILETham số file phải là zip, p12 hoặc mobileprovision
  • 502UPSTREAM_UNAVAILABLENhà cung cấp chứng chỉ tạm lỗi, thử lại sau

Ví dụ

Request
$ curl "https://certnew.com/api/v1/orders/5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10/certificate" -H "Authorization: Bearer $CERTNEW_TOKEN"

Trả về200 OK

Response
{
  "p12": "MIIMaQIBAzCCDC8GCSqGSIb3…",
  "mobileprovision": "MIIdvwYJKoZIhvcNAQcCoIId…",
  "password": "1",
  "name": "Nguyen Van A",
  "state": "valid",
  "revokedAt": null,
  "expireAt": "2027-09-25T00:00:00.000Z"
}
POST/api/v1/orders/{id}/warranty

Yê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

  • 404ORDER_NOT_FOUNDĐơn không tồn tại hoặc không thuộc tài khoản
  • 409ORDER_NOT_COMPLETEDĐơn chưa được cấp chứng chỉ
  • 409NO_WARRANTYGói của đơn không có bảo hành
  • 409WARRANTY_EXPIREDĐơn đã hết hạn bảo hành
  • 409NOT_REVOKEDChứng chỉ chưa bị Apple thu hồi, chưa cần bảo hành
  • 409WARRANTY_IN_PROGRESSĐang cấp lại chứng chỉ cho đơn này, chờ hoàn tất
  • 409SITE_ORDERĐơn của web con, liên hệ admin để bảo hành

Ví dụ

Request
$ curl -X POST "https://certnew.com/api/v1/orders/5b1d7c5e-3a0f-4a8e-9e61-0c2f7b7c9d10/warranty" -H "Authorization: Bearer $CERTNEW_TOKEN"

Trả về201 Created

Response
{
  "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

  • 401UNAUTHORIZEDThiếu token / phiên đăng nhập
  • 401INVALID_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
  • 403IP_BLOCKEDIP đang bị chặn
  • 400INVALID_JSONBody không phải JSON hợp lệ
  • 413PAYLOAD_TOO_LARGEBody quá 16KB
  • 429RATE_LIMITEDVượt giới hạn tần suất
  • 500SYSTEM_ERRORLỗi hệ thống
Tài liệu API · Cert New