Tài liệu API · v1

API thuê sim nhận mã OTP

Kết quả trả về JSON, lỗi theo chuẩn problem+json. Mọi request cần token API trong trang tài khoản.

Cập nhật lần cuối: 28/09/2026Đặc tả OpenAPI (JSON)
Token của bạn · gửi kèm mọi request
Đăng nhập để xem token API của bạn
Đăng nhập

Bắt đầu nhanh

  1. Lấy token API trong trang tài khoản. Tài khoản cần được cấp quyền dùng API.
  2. Gọi GET /v1/services để lấy id dịch vụ và giá.
  3. Gọi POST /v1/rentals với serviceId để thuê số, giữ lại id.
  4. Cứ 5 giây gọi GET /v1/rentals/{id} một lần cho tới khi status khác 0. status 1 là đã có mã trong trường code, status 2 là đã chờ 4–7 phút mà không có mã và tiền đã được hoàn.
curl -X POST "https://api.otpvn.com/v1/rentals" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"serviceId":1}'

curl "https://api.otpvn.com/v1/rentals/1234122" -H "Authorization: Bearer YOUR_API_TOKEN"

Quy ước chung

Địa chỉ gốc
https://api.otpvn.com
Phương thức
Đọc dữ liệu dùng GET, thuê số dùng POST với thân request là JSON.
Xác thực
Gửi header Authorization: Bearer <token> trong mọi request, token 32 ký tự lấy trong trang tài khoản. Không đặt token trên URL.
Kết quả
Thành công trả HTTP 200 (201 khi thuê số) và dữ liệu JSON ngay trong thân. Lỗi trả HTTP 4xx hoặc 5xx dạng application/problem+json: trường code để rẽ nhánh, detail là lý do.
Ngôn ngữ
Thêm ?lang=en hoặc ?lang=zh vào URL, hoặc gửi header X-Lang: en, để detail của lỗi trả về bằng tiếng Anh hoặc tiếng Trung. Mặc định là tiếng Việt; code và dữ liệu không đổi.
Số điện thoại
phoneLocal không có số 0 và mã quốc gia ở đầu (vd 987654321), dùng để nhập vào app. phone là số đầy đủ, dùng khi thuê lại.
Tiền
Giá và số dư là số nguyên, đơn vị VND.
Thời gian
createdAt theo ISO 8601 kèm múi giờ Việt Nam (+07:00).
Giới hạn
Mỗi tài khoản gọi tối đa 100 request mỗi giây và thuê tối đa 15 lần liền nhau, mỗi lần cách lần trước dưới 3 giây; vượt quá nhận 429 too_many_requests. Mỗi tài khoản chỉ giữ được một số lượt chờ mã cùng lúc, vượt quá nhận 429 waiting_limit.
Làm mới
Lượt thuê đang chờ mã được cập nhật mỗi giây, số dư sau tối đa 2 giây, danh sách dịch vụ sau tối đa 30 giây; gọi dày hơn không nhận được dữ liệu mới hơn.
Zalo
Dịch vụ Zalo hiện chưa thuê được qua API.

Các endpoint

1

Lấy số dư tài khoản

Số dư hiện tại của tài khoản.

GEThttps://api.otpvn.com/v1/balance
Các trường trả về
balanceinteger
Số dư hiện tại, VND
Lỗi có thể gặp (HTTP · code)
401 · invalid_token
Thiếu token, token sai hoặc không còn dùng được
401 · api_disabled
Tài khoản chưa được cấp quyền dùng API
429 · too_many_requests
Gọi quá nhanh: vượt số request mỗi giây của tài khoản hoặc thuê liên tục quá nhiều lần; chờ theo Retry-After rồi thử lại
Ví dụ kết quả trả về (HTTP 200)
{
  "balance": 186500
}
2

Danh sách nhà mạng

Tên nhà mạng dùng cho trường carriers khi thuê số. Việt Nam: MOBIFONE, VINAPHONE, VIETTEL, VIETNAMOBILE, ITELECOM, WINTEL, GTEL. Lào: UNITEL, ETL, BEELINE, LAOTEL. Danh sách trả về còn có nhà mạng của thị trường khác, hiện chưa dùng.

GEThttps://api.otpvn.com/v1/carriers
Mỗi phần tử trong mảng trả về
idinteger
Id nhà mạng
namestring
Tên nhà mạng, dùng cho trường carriers
Lỗi có thể gặp (HTTP · code)
401 · invalid_token
Thiếu token, token sai hoặc không còn dùng được
401 · api_disabled
Tài khoản chưa được cấp quyền dùng API
429 · too_many_requests
Gọi quá nhanh: vượt số request mỗi giây của tài khoản hoặc thuê liên tục quá nhiều lần; chờ theo Retry-After rồi thử lại
Ví dụ kết quả trả về (HTTP 200)
[
  {
    "id": 1,
    "name": "MOBIFONE"
  },
  {
    "id": 2,
    "name": "VINAPHONE"
  },
  {
    "id": 3,
    "name": "VIETTEL"
  },
  {
    "id": 4,
    "name": "VIETNAMOBILE"
  },
  {
    "id": 5,
    "name": "ITELECOM"
  },
  {
    "id": 6,
    "name": "VODAFONE_RO"
  },
  {
    "id": 7,
    "name": "WINTEL"
  },
  {
    "id": 8,
    "name": "METFONE"
  },
  {
    "id": 9,
    "name": "UNITEL"
  },
  {
    "id": 10,
    "name": "ETL"
  },
  {
    "id": 11,
    "name": "BEELINE"
  },
  {
    "id": 12,
    "name": "LAOTEL"
  },
  {
    "id": 13,
    "name": "GTEL"
  }
]
3

Danh sách dịch vụ

Id, tên và giá của các dịch vụ mở cho API. Giá có thể thay đổi, nên lấy lại danh sách định kỳ.

GEThttps://api.otpvn.com/v1/services?country=vn
Tham số
countryquery · string
vn: Việt Nam (mặc định) · la: Lào
Mỗi phần tử trong mảng trả về
idinteger
Id dịch vụ, dùng cho serviceId
namestring
Tên dịch vụ
priceinteger
Giá một lượt thuê, VND
Lỗi có thể gặp (HTTP · code)
401 · invalid_token
Thiếu token, token sai hoặc không còn dùng được
401 · api_disabled
Tài khoản chưa được cấp quyền dùng API
429 · too_many_requests
Gọi quá nhanh: vượt số request mỗi giây của tài khoản hoặc thuê liên tục quá nhiều lần; chờ theo Retry-After rồi thử lại
Ví dụ kết quả trả về (HTTP 200)
[
  {
    "id": 7,
    "name": "Facebook",
    "price": 800
  },
  {
    "id": 1,
    "name": "Momo",
    "price": 350
  }
]
4

Thuê số

Thuê một số mới cho dịch vụ. Tiền bị trừ ngay, sau 4–7 phút không có mã thì tự hoàn lại.

POSThttps://api.otpvn.com/v1/rentals
Tham số
serviceIdbody · integer · bắt buộc
Id dịch vụ, lấy từ danh sách dịch vụ
countrybody · string
la để thuê sim Lào · bỏ qua để thuê sim Việt Nam
carriersbody · array
Nhà mạng muốn lấy. Bỏ qua để lấy mọi nhà mạng của quốc gia đó.
includePrefixesbody · array
Đầu số muốn lấy, có số 0 ở đầu (vd 096). Bỏ qua để lấy mọi đầu số.
excludePrefixesbody · array
Đầu số không muốn lấy, có số 0 ở đầu (vd 097).
Các trường trả về
idinteger
Mã lượt thuê, dùng để lấy mã OTP
phonestring
Số đầy đủ như hệ thống lưu, dùng cho trường phone khi thuê lại
phoneLocalstring
Số để nhập vào app, không có số 0 và mã quốc gia ở đầu
countryIsostring
Mã quốc gia: VN hoặc LA
countryCodestring
Mã vùng quốc tế: 84 hoặc 856
balanceinteger
Số dư còn lại sau khi trừ tiền, VND
Lỗi có thể gặp (HTTP · code)
400 · invalid_body
Thân request không phải JSON hợp lệ hoặc thiếu trường bắt buộc
400 · invalid_carrier
Nhà mạng không thuộc quốc gia đã chọn
400 · invalid_prefix
Đầu số không thuộc các nhà mạng đã chọn
401 · invalid_token
Thiếu token, token sai hoặc không còn dùng được
401 · api_disabled
Tài khoản chưa được cấp quyền dùng API
429 · too_many_requests
Gọi quá nhanh: vượt số request mỗi giây của tài khoản hoặc thuê liên tục quá nhiều lần; chờ theo Retry-After rồi thử lại
422 · api_not_supported
Dịch vụ không mở cho API
422 · insufficient_balance
Số dư không đủ
422 · out_of_stock
Không có sẵn số phù hợp, thử lại sau
422 · service_closed
Dịch vụ đang tạm đóng
429 · waiting_limit
Đã đủ số lượt đang chờ mã cùng lúc, detail ghi rõ giới hạn
503 · maintenance
Hệ thống đang bảo trì ngắn, thử lại sau vài phút
503 · busy
Hệ thống bận, thử lại sau
Ví dụ thân request
{
  "serviceId": 1,
  "carriers": [
    "VINAPHONE",
    "VIETTEL"
  ],
  "includePrefixes": [
    "096",
    "097",
    "098"
  ]
}
Ví dụ kết quả trả về (HTTP 201)
{
  "id": 1234122,
  "phone": "0987654321",
  "phoneLocal": "987654321",
  "countryIso": "VN",
  "countryCode": "84",
  "balance": 185300
}
5

Thuê lại số cũ

Thuê lại đúng số đã dùng cho cùng dịch vụ, ví dụ khi app đòi xác minh lần nữa. Chỉ được trong khoảng 15–30 phút sau lượt thuê trước và khi sim còn trên hệ thống.

POSThttps://api.otpvn.com/v1/rentals/rerent
Tham số
serviceIdbody · integer · bắt buộc
Id dịch vụ, lấy từ danh sách dịch vụ
phonebody · string · bắt buộc
Trường phone của lượt thuê trước
Các trường trả về
idinteger
Mã lượt thuê, dùng để lấy mã OTP
phonestring
Số đầy đủ như hệ thống lưu, dùng cho trường phone khi thuê lại
phoneLocalstring
Số để nhập vào app, không có số 0 và mã quốc gia ở đầu
countryIsostring
Mã quốc gia: VN hoặc LA
countryCodestring
Mã vùng quốc tế: 84 hoặc 856
balanceinteger
Số dư còn lại sau khi trừ tiền, VND
Lỗi có thể gặp (HTTP · code)
400 · invalid_body
Thân request không phải JSON hợp lệ hoặc thiếu trường bắt buộc
401 · invalid_token
Thiếu token, token sai hoặc không còn dùng được
401 · api_disabled
Tài khoản chưa được cấp quyền dùng API
429 · too_many_requests
Gọi quá nhanh: vượt số request mỗi giây của tài khoản hoặc thuê liên tục quá nhiều lần; chờ theo Retry-After rồi thử lại
422 · api_not_supported
Dịch vụ không mở cho API
422 · insufficient_balance
Số dư không đủ
422 · service_closed
Dịch vụ đang tạm đóng
422 · service_unavailable
Dịch vụ chưa sẵn sàng để thuê lại, liên hệ hỗ trợ
422 · rerent_unavailable
Số muốn thuê lại hiện chưa sẵn sàng
422 · rerent_forbidden
Không thuê lại được: đã quá 15–30 phút sau lượt thuê trước hoặc sim không còn trên hệ thống
422 · rerent_taken
Số đang có người khác thuê
422 · out_of_stock
Không có sẵn số phù hợp, thử lại sau
429 · waiting_limit
Đã đủ số lượt đang chờ mã cùng lúc, detail ghi rõ giới hạn
503 · maintenance
Hệ thống đang bảo trì ngắn, thử lại sau vài phút
503 · busy
Hệ thống bận, thử lại sau
Ví dụ thân request
{
  "serviceId": 1,
  "phone": "0987654321"
}
Ví dụ kết quả trả về (HTTP 201)
{
  "id": 1234190,
  "phone": "0987654321",
  "phoneLocal": "987654321",
  "countryIso": "VN",
  "countryCode": "84",
  "balance": 184700
}
6

Lấy mã OTP của lượt thuê

Trạng thái và mã OTP của một lượt thuê. Gọi lại mỗi 5 giây cho tới khi status khác 0.

GEThttps://api.otpvn.com/v1/rentals/1234122
Tham số
idpath · integer · bắt buộc
id trả về khi thuê số
Các trường trả về
idinteger
Mã lượt thuê
serviceIdinteger
Id dịch vụ
serviceNamestring
Tên dịch vụ
priceinteger
Giá một lượt thuê, VND
statusinteger
0: đợi tin nhắn · 1: hoàn thành · 2: hết hạn, đã hoàn tiền
contentstring
Nội dung tin nhắn. Mã gọi thoại thì là link file ghi âm. Chưa có tin nhắn thì không có trường này
codestring
Mã OTP đã tách sẵn. Chưa có mã thì không có trường này
isAudioboolean
true nếu mã đến qua cuộc gọi
phonestring
Số đầy đủ như hệ thống lưu, dùng cho trường phone khi thuê lại
phoneLocalstring
Số để nhập vào app, không có số 0 và mã quốc gia ở đầu
countryIsostring
Mã quốc gia: VN hoặc LA
countryCodestring
Mã vùng quốc tế: 84 hoặc 856
createdAtstring
Thời điểm thuê, ISO 8601 kèm múi giờ Việt Nam (+07:00)
Lỗi có thể gặp (HTTP · code)
401 · invalid_token
Thiếu token, token sai hoặc không còn dùng được
401 · api_disabled
Tài khoản chưa được cấp quyền dùng API
429 · too_many_requests
Gọi quá nhanh: vượt số request mỗi giây của tài khoản hoặc thuê liên tục quá nhiều lần; chờ theo Retry-After rồi thử lại
404 · rental_not_found
Tài khoản không có lượt thuê này
Ví dụ kết quả trả về (HTTP 200)
{
  "id": 1234122,
  "serviceId": 1,
  "serviceName": "Momo",
  "price": 600,
  "status": 1,
  "content": "486460 la ma xac thuc Momo cua ban",
  "code": "486460",
  "isAudio": false,
  "phone": "0987654321",
  "phoneLocal": "987654321",
  "countryIso": "VN",
  "countryCode": "84",
  "createdAt": "2026-09-27T10:15:24.88+07:00"
}
7

Lịch sử thuê số

Các lượt thuê lọc theo dịch vụ, trạng thái và khoảng ngày, mới nhất trước. Cả 5 tham số đều bắt buộc.

GEThttps://api.otpvn.com/v1/rentals?serviceId=1&status=1&limit=100&from=2026-09-01&to=2026-09-27
Tham số
serviceIdquery · integer · bắt buộc
Id dịch vụ
statusquery · integer · bắt buộc
0: đợi tin nhắn · 1: hoàn thành · 2: hết hạn
limitquery · integer · bắt buộc
Số bản ghi tối đa trả về
fromquery · string · bắt buộc
Từ ngày, định dạng yyyy-MM-dd
toquery · string · bắt buộc
Đến ngày, định dạng yyyy-MM-dd
Mỗi phần tử trong mảng trả về
idinteger
Mã lượt thuê
serviceIdinteger
Id dịch vụ
serviceNamestring
Tên dịch vụ
priceinteger
Giá một lượt thuê, VND
statusinteger
0: đợi tin nhắn · 1: hoàn thành · 2: hết hạn, đã hoàn tiền
contentstring
Nội dung tin nhắn. Mã gọi thoại thì là link file ghi âm. Chưa có tin nhắn thì không có trường này
codestring
Mã OTP đã tách sẵn. Chưa có mã thì không có trường này
isAudioboolean
true nếu mã đến qua cuộc gọi
phonestring
Số đầy đủ như hệ thống lưu, dùng cho trường phone khi thuê lại
phoneLocalstring
Số để nhập vào app, không có số 0 và mã quốc gia ở đầu
countryIsostring
Mã quốc gia: VN hoặc LA
countryCodestring
Mã vùng quốc tế: 84 hoặc 856
createdAtstring
Thời điểm thuê, ISO 8601 kèm múi giờ Việt Nam (+07:00)
Lỗi có thể gặp (HTTP · code)
400 · invalid_query
Tham số trên URL sai hoặc thiếu
401 · invalid_token
Thiếu token, token sai hoặc không còn dùng được
401 · api_disabled
Tài khoản chưa được cấp quyền dùng API
429 · too_many_requests
Gọi quá nhanh: vượt số request mỗi giây của tài khoản hoặc thuê liên tục quá nhiều lần; chờ theo Retry-After rồi thử lại
Ví dụ kết quả trả về (HTTP 200)
[
  {
    "id": 1234101,
    "serviceId": 1,
    "serviceName": "Momo",
    "price": 600,
    "status": 1,
    "content": "https://audio.otpvn.com/20260927101215_7f3c2a.wav",
    "code": "731905",
    "isAudio": true,
    "phone": "0987654321",
    "phoneLocal": "987654321",
    "countryIso": "VN",
    "countryCode": "84",
    "createdAt": "2026-09-27T10:12:03.51+07:00"
  }
]

Mã lỗi

400 · invalid_body
Thân request không phải JSON hợp lệ hoặc thiếu trường bắt buộc
400 · invalid_query
Tham số trên URL sai hoặc thiếu
400 · invalid_carrier
Nhà mạng không thuộc quốc gia đã chọn
400 · invalid_prefix
Đầu số không thuộc các nhà mạng đã chọn
401 · invalid_token
Thiếu token, token sai hoặc không còn dùng được
401 · api_disabled
Tài khoản chưa được cấp quyền dùng API
404 · rental_not_found
Tài khoản không có lượt thuê này
422 · api_not_supported
Dịch vụ không mở cho API
422 · insufficient_balance
Số dư không đủ
422 · out_of_stock
Không có sẵn số phù hợp, thử lại sau
422 · service_closed
Dịch vụ đang tạm đóng
422 · service_unavailable
Dịch vụ chưa sẵn sàng để thuê lại, liên hệ hỗ trợ
422 · rerent_unavailable
Số muốn thuê lại hiện chưa sẵn sàng
422 · rerent_forbidden
Không thuê lại được: đã quá 15–30 phút sau lượt thuê trước hoặc sim không còn trên hệ thống
422 · rerent_taken
Số đang có người khác thuê
429 · waiting_limit
Đã đủ số lượt đang chờ mã cùng lúc, detail ghi rõ giới hạn
429 · too_many_requests
Gọi quá nhanh: vượt số request mỗi giây của tài khoản hoặc thuê liên tục quá nhiều lần; chờ theo Retry-After rồi thử lại
503 · maintenance
Hệ thống đang bảo trì ngắn, thử lại sau vài phút
503 · busy
Hệ thống bận, thử lại sau
500 · internal
Lỗi hệ thống, thử lại sau
Trạng thái lượt thuê (status)
0
Đợi tin nhắn
1
Hoàn thành
2
Hết hạn, tiền đã được hoàn
Ví dụ lỗi
{
  "type": "https://otpvn.com/errors/insufficient_balance",
  "title": "Unprocessable Entity",
  "status": 422,
  "code": "insufficient_balance",
  "detail": "Số dư quý khách không đủ !"
}