# AmznSelectObjectTask
Source: https://docs.omocaptcha.com/vi/api/amzn-captcha/amzn-select-object-task
Giải captcha chọn đối tượng của Amazon (lưới 3x3)
Chọn đối tượng là một loại hình ảnh xác thực phổ biến của Amazon. Người dùng cần chọn tất cả các ô ảnh khớp với chủ đề trong câu hỏi từ một lưới 3x3.
## 1. Tạo yêu cầu
**Request**
```text theme={null}
POST https://api.omocaptcha.com/v2/createTask
```
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | ------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Hình ảnh lưới 3x3 được mã hóa base64
|
| `task.other` | `String` | ✅ | Văn bản câu hỏi captcha
|
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "AmznSelectObjectTask",
"imageBase64": "BASE64_BODY_HERE",
"other": "the bags"
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const { data } = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'AmznSelectObjectTask',
imageBase64: 'BASE64_BODY_HERE',
other: 'the bags'
}
});
console.log(data);
```
```python Python theme={null}
import requests
res = requests.post('https://api.omocaptcha.com/v2/createTask', json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'AmznSelectObjectTask',
'imageBase64': 'BASE64_BODY_HERE',
'other': 'the bags'
}
})
print(res.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'AmznSelectObjectTask',
'imageBase64' => 'BASE64_BODY_HERE',
'other' => 'the bags'
]
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ sẽ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ sẽ trả về `errorId = 1` cùng với `errorCode` mã lỗi tương ứng.
## 2. Nhận kết quả yêu cầu
**Request**
```text theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"objects": [0, 1, 2, 3]
}
}
```
Máy chủ sẽ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong `solution`.
Mảng `objects` chứa chỉ số các ô ảnh cần chọn trong lưới 3x3, đánh số từ **0 đến 8**, theo thứ tự từ **trái sang phải, trên xuống dưới**:
```text theme={null}
0 | 1 | 2
3 | 4 | 5
6 | 7 | 8
```
Sau khi click các ô tương ứng, nhấn nút **Confirm** để hoàn tất xác thực.
Đang xử lý:
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ sẽ trả về `errorId = 0` và `status = processing`, yêu cầu đang được xử lý. Vui lòng chờ 2 giây rồi yêu cầu lại.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ sẽ trả về `errorId = 1` khi yêu cầu thất bại.
# Bảng mã lỗi
Source: https://docs.omocaptcha.com/vi/api/bang-ma-loi
Toàn bộ errorCode có thể nhận được từ API V2
Tất cả endpoint V2 trả về **HTTP 200** với body chứa `errorId`, `errorCode`, `errorDescription`. Dưới đây là toàn bộ `errorCode` có thể nhận được.
## Xác thực & API key
| `errorCode` | Khi nào | Cách khắc phục |
| -------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------- |
| `ERROR_KEY_DOES_NOT_EXIST` | API key rỗng / sai / không tồn tại / quá ngắn (\< 10 ký tự) / quá dài (> 80 ký tự) | Kiểm tra lại API key trên dashboard |
## Gói (package)
| `errorCode` | Khi nào | Cách khắc phục |
| --------------------------- | ---------------------------------- | ---------------------------------- |
| `ERROR_PACKAGE_NOT_FOUND` | `PKG_` token trỏ tới gói đã bị xóa | Mua gói mới |
| `ERROR_PACKAGE_EXPIRED` | Gói đã hết hạn (quá `dateEnd`) | Mua gói mới |
| `ERROR_PACKAGE_EXHAUSTED` | Gói đã hết lượt (`quantity = 0`) | Mua gói mới hoặc nạp thêm lượt |
| `ERROR_PACKAGE_NOT_SUPPORT` | Loại captcha không thuộc gói này | Đổi loại captcha hoặc nâng cấp gói |
## Số dư (balance)
| `errorCode` | Khi nào | Cách khắc phục |
| ---------------------------- | ---------------------------------------------- | --------------------------------- |
| `ERROR_ZERO_BALANCE` | Cả `balance` và `voucherBalance` đều = 0 | Nạp tiền |
| `ERROR_INSUFFICIENT_BALANCE` | Có tiền nhưng nhỏ hơn giá của loại captcha này | Nạp thêm hoặc chọn captcha rẻ hơn |
## Đầu vào & hệ thống
| `errorCode` | Khi nào | Cách khắc phục |
| --------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------ |
| `ERROR_TYPE_JOB_REQUIRED` | Body thiếu `task.type` | Sửa request |
| `ERROR_TASK_NOT_SUPPORTED` | `task.type` không tồn tại hoặc sai chính tả | Tham khảo [danh sách dịch vụ](/vi/api/lay-danh-sach-dich-vu) |
| `ERROR_TASK_IS_MAINTENANCE` | Loại captcha đang tạm bảo trì | Thử lại sau vài phút |
| `ERROR_SERVICE_UNAVAILABLE` | Hệ thống tạm thời busy | Thử lại với exponential backoff |
| `ERROR_REDIS_UNAVAILABLE` | Hệ thống tạm lỗi sau khi đã trừ tiền — tiền đã tự động hoàn | Thử lại ngay; tiền không mất |
## Kết quả (result)
| `errorCode` | Khi nào | Cách khắc phục |
| ------------------------- | ------------------------------------------------------------------- | ---------------------------------- |
| `ERROR_TASK_NOT_FOUND` | `taskId` sai hoặc đã hết TTL | Tạo task mới |
| `ERROR_TASK_KEY_MISMATCH` | Client dùng API key khác với key đã tạo task | Dùng đúng key đã tạo task |
| `ERROR_REDIS_JOB_DATA` | Lỗi đọc dữ liệu task (hiếm gặp) | Thử lại 1 lần, sau đó tạo task mới |
| `ERROR_JOB_STATUS` | Job đã fail (solver giải sai / timeout) — tiền đã được hoàn tự động | Tạo task mới hoặc chấp nhận |
## Quy tắc xử lý phía client
```javascript theme={null}
const resp = await fetch('https://api.omocaptcha.com/v2/createTask', {...});
const body = await resp.json();
if (body.errorId !== 0) {
switch (body.errorCode) {
case 'ERROR_ZERO_BALANCE':
case 'ERROR_INSUFFICIENT_BALANCE':
// Stop. Báo người dùng nạp thêm tiền.
return notifyTopUp();
case 'ERROR_PACKAGE_EXHAUSTED':
case 'ERROR_PACKAGE_EXPIRED':
// Stop. Báo người dùng mua gói mới.
return notifyBuyPackage();
case 'ERROR_KEY_DOES_NOT_EXIST':
case 'ERROR_TASK_KEY_MISMATCH':
// Stop. Sai key.
return notifyInvalidKey();
case 'ERROR_TASK_IS_MAINTENANCE':
case 'ERROR_SERVICE_UNAVAILABLE':
case 'ERROR_REDIS_UNAVAILABLE':
// Thử lại với exponential backoff
return retryWithBackoff();
default:
// Log + báo lỗi cho người dùng
console.error(body);
}
}
```
## Lưu ý quan trọng
**HTTP status luôn là 200** với lỗi nghiệp vụ. Chỉ thử lại trên **HTTP 5xx** (lỗi hạ tầng).
`errorDescription` là chuỗi mô tả cho người đọc và có thể thay đổi. Dùng `errorCode` để switch logic.
API OMOCaptcha tương thích với hầu hết SDK solver mã nguồn mở phổ biến có sẵn.
# Danh sách gói của tôi
Source: https://docs.omocaptcha.com/vi/api/danh-sach-goi-cua-toi
Danh sách gói đã mua của tài khoản
Lấy danh sách các gói (package) tài khoản đã mua, kèm trạng thái hoạt động và số lượt giải còn lại.
## Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getMyPackages
Content-Type: application/json
```
### Body Parameters
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ----------- | -------- | :------: | --------------------- |
| `clientKey` | `String` | ✅ | API key của tài khoản |
```json theme={null}
{
"clientKey": "OMO_API_KEY"
}
```
## Response
```json Thành công theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"packages": [
{
"packageId": 1,
"packageName": "Combo Funcaptcha",
"tokenPackage": "PKG_R2MXPRMQWKXKETKT54MFJOWITOII...",
"remaining": 1006190,
"dateStart": "2024-12-11 14:50:11",
"dateEnd": "2028-02-09 00:19:30",
"isActive": true,
"services": [
{ "type": "FuncaptchaImageTask", "name": "FunCaptcha Image" }
]
},
{
"packageId": 2,
"packageName": "Combo TikTok",
"tokenPackage": "PKG_OTHER_TOKEN...",
"remaining": 0,
"dateStart": "2024-12-01 10:00:00",
"dateEnd": "2025-12-01 10:00:00",
"isActive": false,
"services": [
{ "type": "TiktokSelectObjectWebTask", "name": "Tiktok (Chọn đối tượng - Web)" },
{ "type": "TiktokSliderWebTask", "name": "TikTok (Kéo thả - Web)" }
]
}
]
}
```
```json Chưa có gói theme={null}
```
```json Thất bại theme={null}
```
### Giải thích các trường
| Trường | Kiểu | Mô tả |
| -------------- | --------- | ----------------------------------------------------------------------------------------------- |
| `packageId` | integer | ID gói (tham chiếu với `getServicePrice` `type=package`) |
| `packageName` | `String` | Tên gói |
| `tokenPackage` | `String` | Token đặc biệt dạng `PKG_...` — dùng thay cho `clientKey` để trừ trực tiếp vào gói khi tạo task |
| `remaining` | integer | Số lượt giải còn lại |
| `dateStart` | `String` | Ngày bắt đầu hiệu lực |
| `dateEnd` | `String` | Ngày hết hạn |
| `isActive` | `Boolean` | `true` nếu gói chưa hết hạn, còn lượt giải, và đang hoạt động |
| `services` | `Array` | Danh sách captcha type được cover bởi gói. Mỗi phần tử: `{type, name}` |
Tài khoản chưa mua gói nào sẽ nhận mảng `packages: []`. Xem [danh sách gói có sẵn](/vi/api/lay-thong-tin-goi-dich-vu) để mua.
## Cách dùng `tokenPackage` để tạo task bằng gói
Khi tạo captcha task, dùng `tokenPackage` thay cho `clientKey` thông thường — hệ thống sẽ tự trừ vào gói:
```json POST /v2/createTask theme={null}
{
"clientKey": "PKG_R2MXPRMQWKXKETKT54MFJ...",
"task": {
"type": "FuncaptchaImageTask",
"imageBase64": "...",
"other": "..."
}
}
```
Khi đó hệ thống trừ trực tiếp vào `remaining` của gói, **không** trừ vào `balance`.
## Khi nào gói hết lượt?
Nếu `remaining = 0` hoặc `isActive = false`, gọi `createTask` với token gói đó sẽ trả về `ERROR_PACKAGE_EXHAUSTED` hoặc `ERROR_PACKAGE_EXPIRED`.
**Cách xử lý:** mua gói mới — gói cũ sẽ tự động ngưng hoạt động.
## Ví dụ sử dụng
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/getMyPackages \
-H "Content-Type: application/json" \
-d '{"clientKey": "OMO_API_KEY"}'
```
```javascript Node.js theme={null}
```
```python Python theme={null}
```
# FuncaptchaImageTask
Source: https://docs.omocaptcha.com/vi/api/funcaptcha/overview
Giải FunCaptcha (Arkose Labs) dạng hình ảnh
FunCaptcha là một loại hình ảnh xác thực phổ biến.
## 1. Tạo yêu cầu
### Request
```http theme={null}
POST https://api.omocaptcha.com/v2/createTask
Content-Type: application/json
```
#### Body Parameters
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | ---------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải (`FuncaptchaImageTask`) |
| `task.imageBase64` | `String` | ✅ | Hình ảnh được mã hóa base64 (không phải ảnh chụp màn hình) |
| `task.other` | `String` | ✅ | Văn bản câu hỏi captcha |
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "FuncaptchaImageTask",
"imageBase64": "BASE64_BODY_HERE",
"other": "Use the arrows to pick the image where all the darts add up to the number in the left image"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "FuncaptchaImageTask",
imageBase64: "BASE64_BODY_HERE",
other: "Use the arrows to pick the image where all the darts add up to the number in the left image"
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/createTask",
json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "FuncaptchaImageTask",
"imageBase64": "BASE64_BODY_HERE",
"other": "Use the arrows to pick the image where all the darts add up to the number in the left image"
}
}
)
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "FuncaptchaImageTask",
"imageBase64" => "BASE64_BODY_HERE",
"other" => "Use the arrows to pick the image where all the darts add up to the number in the left image"
]
]));
echo curl_exec($ch);
```
### Response
```json Thành công theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
```json Thất bại theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
* `errorId = 0` và `taskId` → thành công
* `errorId = 1` và `errorCode` → thất bại (tra [Bảng mã lỗi](/vi/api/bang-ma-loi))
## 2. Nhận kết quả yêu cầu
### Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
Content-Type: application/json
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
```json Thành công theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"index": 1
}
}
```
```json Đang xử lý theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
```json Thất bại theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
* `errorId = 0` và `status = "ready"` → đọc kết quả trong `solution.index`.
* `errorId = 0` và `status = "processing"` → yêu cầu đang xử lý, chờ **2 giây** rồi gọi lại.
* `errorId = 1` → thất bại (tra [Bảng mã lỗi](/vi/api/bang-ma-loi)).
Server trả về **vị trí của ảnh đúng** trong dãy. Khi click nút mũi tên phải trên web, bạn phải **trừ đi 1** vì ảnh captcha đang ở vị trí thứ nhất.
Ví dụ: server trả về `index = 5` → click nút mũi tên phải **4 lần**.
# GeetestGobangWebTask
Source: https://docs.omocaptcha.com/vi/api/geetest/geetest-gobang-web-task
Giải captcha gobang Geetest trên web
Captcha gobang là một loại hình ảnh xác thực phổ biến, yêu cầu người dùng **hoán đổi vị trí của hai viên bi** trong lưới 5×5 sao cho có được 5 viên cùng màu thẳng hàng (ngang, dọc hoặc chéo).
## 1. Tạo yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | ----------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Ảnh lưới bi 5×5 được mã hóa base64
|
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestGobangWebTask",
"imageBase64": "BASE64_BODY_HERE"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "GeetestGobangWebTask",
imageBase64: "BASE64_BODY_HERE"
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post("https://api.omocaptcha.com/v2/createTask", json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestGobangWebTask",
"imageBase64": "BASE64_BODY_HERE"
}
})
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "GeetestGobangWebTask",
"imageBase64" => "BASE64_BODY_HERE"
]
]));
echo curl_exec($ch);
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` cùng `errorCode` là mã lỗi tương ứng.
## 2. Nhận kết quả yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"status": "ready",
"solution": {
"swap_positions": [2, 21]
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong trường `solution`.
`solution.swap_positions` là mảng gồm **2 chỉ số ô cần hoán đổi vị trí** trong lưới 5×5. Các ô được đánh số từ **0 đến 24**, tính từ trái sang phải và từ trên xuống dưới (ô đầu hàng 1 là `0`, ô cuối hàng 1 là `4`, ô đầu hàng 2 là `5`, ..., ô cuối hàng 5 là `24`). Kéo viên bi ở ô thứ nhất sang ô thứ hai (hoặc ngược lại) để hoàn thành captcha.
**Đang xử lý:**
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing`, vui lòng chờ 2 giây rồi yêu cầu lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1` khi tác vụ thất bại.
# GeetestIconCrushWebTask
Source: https://docs.omocaptcha.com/vi/api/geetest/geetest-icon-crush-web-task
Giải captcha icon crush Geetest trên web
Captcha icon crush là một loại hình ảnh xác thực phổ biến, yêu cầu người dùng **hoán đổi vị trí hai icon** trong lưới 3×3 sao cho có được 3 icon giống nhau thẳng hàng (ngang, dọc hoặc chéo).
## 1. Tạo yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | ------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Ảnh lưới icon 3×3 được mã hóa base64
|
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestIconCrushWebTask",
"imageBase64": "BASE64_BODY_HERE"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "GeetestIconCrushWebTask",
imageBase64: "BASE64_BODY_HERE"
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post("https://api.omocaptcha.com/v2/createTask", json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestIconCrushWebTask",
"imageBase64": "BASE64_BODY_HERE"
}
})
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "GeetestIconCrushWebTask",
"imageBase64" => "BASE64_BODY_HERE"
]
]));
echo curl_exec($ch);
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` cùng `errorCode` là mã lỗi tương ứng.
## 2. Nhận kết quả yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"status": "ready",
"solution": {
"swap_positions": [4, 7]
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong trường `solution`.
`solution.swap_positions` là mảng gồm **2 chỉ số ô cần hoán đổi vị trí** trong lưới 3×3. Các ô được đánh số từ **0 đến 8**, tính từ trái sang phải và từ trên xuống dưới (hàng 1: `0, 1, 2` – hàng 2: `3, 4, 5` – hàng 3: `6, 7, 8`). Click hoặc kéo icon ở ô thứ nhất sang ô thứ hai (hoặc ngược lại) để hoàn thành captcha.
**Đang xử lý:**
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing`, vui lòng chờ 2 giây rồi yêu cầu lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1` khi tác vụ thất bại.
# GeetestIconWebTask
Source: https://docs.omocaptcha.com/vi/api/geetest/geetest-icon-web-task
Giải captcha click icon Geetest trên web
Captcha click icon trên web là một loại hình ảnh xác thực phổ biến.
## 1. Tạo yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------------- | ----------------- | :------: | --------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Hảnh nền được mã hóa base64
|
| `task.anchorImageBase64s` | `Array of String` | ✅ | Mảng 3 ảnh icon mẫu được mã hóa base64
|
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestIconWebTask",
"imageBase64": "BASE64_BODY_HERE",
"anchorImageBase64s": [
"BASE64_ICON_1",
"BASE64_ICON_2",
"BASE64_ICON_3"
]
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "GeetestIconWebTask",
imageBase64: "BASE64_BODY_HERE",
anchorImageBase64s: [
"BASE64_ICON_1",
"BASE64_ICON_2",
"BASE64_ICON_3"
]
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post("https://api.omocaptcha.com/v2/createTask", json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestIconWebTask",
"imageBase64": "BASE64_BODY_HERE",
"anchorImageBase64s": [
"BASE64_ICON_1",
"BASE64_ICON_2",
"BASE64_ICON_3"
]
}
})
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "GeetestIconWebTask",
"imageBase64" => "BASE64_BODY_HERE",
"anchorImageBase64s" => [
"BASE64_ICON_1",
"BASE64_ICON_2",
"BASE64_ICON_3"
]
]
]));
echo curl_exec($ch);
```
`anchorImageBase64s` phải là mảng gồm **3 ảnh riêng biệt** đã được cắt tách, sắp xếp đúng thứ tự từ trái sang phải như hiển thị trên captcha. Thứ tự này quyết định thứ tự của các điểm trả về trong `solution.points`.
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` cùng `errorCode` là mã lỗi tương ứng.
## 2. Nhận kết quả yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"status": "ready",
"solution": {
"points": [
{ "x": 40, "y": 96 },
{ "x": 32, "y": 29 },
{ "x": 127, "y": 40 }
]
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong trường `solution`.
`solution.points` chứa toạ độ (theo pixel của `imageBase64`) của **3 icon cần click**, sắp xếp đúng thứ tự tương ứng với `anchorImageBase64s` đã gửi lên. Click lần lượt từng điểm theo thứ tự trong mảng.
**Đang xử lý:**
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing`, vui lòng chờ 2 giây rồi yêu cầu lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1` khi tác vụ thất bại.
# GeetestSelectObjectTask
Source: https://docs.omocaptcha.com/vi/api/geetest/geetest-select-object-task
Giải Geetest Select Object captcha - chọn các hình ảnh trùng khớp với anchor
Captcha select object là một loại hình ảnh xác thực phổ biến. Người dùng cần chọn các ô hình ảnh trùng khớp với chủ đề được yêu cầu (anchor).
## 1. Tạo yêu cầu
**Request**
```text theme={null}
POST https://api.omocaptcha.com/v2/createTask
```
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | --------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | `GeetestSelectObjectTask` |
| `task.imageBase64` | `String` | ✅ | Hình ảnh lưới 3×3 được mã hóa base64
|
| `task.question` | `String` | ✅ | Câu hỏi của captcha
(ví dụ: `Select 3 images with`) |
| `task.anchor` | `String` | ✅ | Ảnh anchor
|
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestSelectObjectTask",
"imageBase64": "BASE64_BODY_HERE",
"question": "Select 3 images with",
"anchor": "BASE64_ICON_HERE"
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const { data } = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'GeetestSelectObjectTask',
imageBase64: 'BASE64_BODY_HERE',
question: 'Select 3 images with',
anchor: 'BASE64_ICON_HERE'
}
});
console.log(data);
```
```python Python theme={null}
import requests
res = requests.post('https://api.omocaptcha.com/v2/createTask', json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'GeetestSelectObjectTask',
'imageBase64': 'BASE64_BODY_HERE',
'question': 'Select 3 images with',
'anchor': 'BASE64_ICON_HERE'
}
})
print(res.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'GeetestSelectObjectTask',
'imageBase64' => 'BASE64_BODY_HERE',
'question' => 'Select 3 images with',
'anchor' => 'BASE64_ICON_HERE'
]
]));
echo curl_exec($ch);
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ sẽ trả về `errorId = 0` và `taskId` thành công.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ sẽ trả về `errorId = 1` và `errorCode` mã lỗi.
## 2. Nhận kết quả yêu cầu
**Request**
```text theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"status": "ready",
"solution": {
"objects": [0, 1, 6]
}
}
```
Máy chủ sẽ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong `solution.objects`.
`objects` là mảng chỉ số các ô hình trùng khớp (0–8), đếm từ trái sang phải, trên xuống dưới:
* Hàng 1: `0`, `1`, `2`
* Hàng 2: `3`, `4`, `5`
* Hàng 3: `6`, `7`, `8`
Đang xử lý:
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ sẽ trả về `errorId = 0` và `status = processing`, yêu cầu đang được xử lý, xin vui lòng chờ 2 giây rồi yêu cầu lại.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ sẽ trả về `errorId = 1`.
# GeetestSliderWebTask
Source: https://docs.omocaptcha.com/vi/api/geetest/geetest-slider-web-task
Giải captcha kéo thả Geetest trên web
Kéo thả trên web là một loại hình ảnh xác thực phổ biến.
## 1. Tạo yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | ---------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Hình ảnh được mã hóa base64 |
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestSliderWebTask",
"imageBase64": "BASE64_BODY_HERE"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "GeetestSliderWebTask",
imageBase64: "BASE64_BODY_HERE"
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post("https://api.omocaptcha.com/v2/createTask", json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "GeetestSliderWebTask",
"imageBase64": "BASE64_BODY_HERE"
}
})
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "GeetestSliderWebTask",
"imageBase64" => "BASE64_BODY_HERE"
]
]));
echo curl_exec($ch);
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` cùng `errorCode` là mã lỗi tương ứng.
## 2. Nhận kết quả yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"end": {
"x": 150,
"y": 42
}
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong trường `solution`.
`solution.end` là toạ độ điểm cuối cần kéo thanh trượt đến (tính theo pixel của ảnh gốc). Tính khoảng cách kéo bằng `end.x` trừ đi vị trí ban đầu của núm trượt.
**Đang xử lý:**
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing`, vui lòng chờ 2 giây rồi yêu cầu lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1` khi tác vụ thất bại.
# ImageToTextTask
Source: https://docs.omocaptcha.com/vi/api/image-to-text-task
Giải captcha dạng hình ảnh chuyển thành văn bản
Captcha thông thường là một hình ảnh có chứa văn bản bị bóp méo nhưng con người có thể đọc được. Để giải quyết hình ảnh xác thực, người dùng phải nhập văn bản từ hình ảnh.
## 1. Tạo yêu cầu
### Request
```http theme={null}
POST https://api.omocaptcha.com/v2/createTask
Content-Type: application/json
```
#### Body Parameters
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | ------------------------------------------ |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Hình ảnh được mã hóa base64 - size: 280x70 |
| `task.module` | `String` | ❌ | Tên loại captcha (không bắt buộc) |
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "ImageToTextTask",
"imageBase64": "BASE64_BODY_HERE",
"module": "module_1"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "ImageToTextTask",
imageBase64: "BASE64_BODY_HERE",
module: "module_1"
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/createTask",
json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "ImageToTextTask",
"imageBase64": "BASE64_BODY_HERE",
"module": "module_1"
}
}
)
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "ImageToTextTask",
"imageBase64" => "BASE64_BODY_HERE",
"module" => "module_1"
]
]));
$response = curl_exec($ch);
echo $response;
```
### Response
```json Thành công theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
```json Thất bại theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
* Máy chủ trả về `errorId = 0` và `taskId` → thành công
* Máy chủ trả về `errorId = 1` và `errorCode` → thất bại (tra [Bảng mã lỗi](/vi/api/bang-ma-loi))
## 2. Nhận kết quả yêu cầu
### Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
Content-Type: application/json
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
```json Thành công theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"text": "ABC"
}
}
```
```json Đang xử lý theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
```json Thất bại theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
* `errorId = 0` & `status = "ready"` → đọc kết quả trong `solution.text`
* `errorId = 0` & `status = "processing"` → yêu cầu đang được xử lý, **chờ 2 giây** rồi yêu cầu lại
* `errorId = 1` → thất bại, tra `errorCode` trong [Bảng mã lỗi](/vi/api/bang-ma-loi)
# Kiểm tra số dư
Source: https://docs.omocaptcha.com/vi/api/kiem-tra-so-du
Kiểm tra số dư tài khoản hiện tại
Lấy nhanh số dư hiện tại của tài khoản, gồm cả số dư khuyến mại.
## Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getBalance
Content-Type: application/json
```
### Body Parameters
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ----------- | -------- | :------: | --------------------- |
| `clientKey` | `String` | ✅ | API key của tài khoản |
```json theme={null}
{
"clientKey": "OMO_API_KEY"
}
```
## Response
```json Thành công theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"balance": "50.00000",
"voucherBalance": "40.60000"
}
```
```json Thành công (tokenPackage) theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"balance": "50.00000",
"voucherBalance": "40.60000",
"quantity": "1006190"
}
```
```json Thất bại theme={null}
{
"errorId": 1,
"errorCode": "ERROR_KEY_DOES_NOT_EXIST",
"errorDescription": "API key does not exist"
}
```
### Giải thích các trường
| Trường | Kiểu | Mô tả |
| ------------------ | -------- | ----------------------------------------------------------------------------------------------- |
| `errorId` | integer | `0` = thành công, `1` = lỗi nghiệp vụ |
| `errorCode` | `String` | Mã lỗi (rỗng nếu thành công) |
| `errorDescription` | `String` | Mô tả chi tiết lỗi |
| `balance` | `String` | Số dư chính (USD, kiểu chuỗi để giữ độ chính xác thập phân) |
| `voucherBalance` | `String` | Số dư khuyến mại. Khi `balance` không đủ, hệ thống sẽ tự động dùng số dư này |
| `quantity` | `String` | **Chỉ xuất hiện khi `clientKey` là tokenPackage dạng `PKG_...`** — số lượt giải còn lại của gói |
Xem **Bảng mã lỗi** để biết danh sách đầy đủ các `errorCode`.
## Ví dụ sử dụng
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/getBalance \
-H "Content-Type: application/json" \
-d '{"clientKey": "OMO_API_KEY"}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/getBalance", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: "OMO_API_KEY" })
});
const data = await res.json();
console.log(data);
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/getBalance",
json={"clientKey": "OMO_API_KEY"}
)
print(res.json())
```
# Lấy danh sách dịch vụ
Source: https://docs.omocaptcha.com/vi/api/lay-danh-sach-dich-vu
Lấy danh sách các dịch vụ có sẵn
Lấy danh sách tất cả loại captcha đang hỗ trợ kèm giá bán lẻ tính theo lượt.
Endpoint này dùng chung URL `/v2/getServicePrice` với [Lấy thông tin gói dịch vụ](/vi/api/lay-thong-tin-goi-dich-vu). Truyền `"type": "service"` để lấy captcha bán lẻ; truyền `"type": "package"` để lấy gói combo.
## Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getServicePrice
Content-Type: application/json
```
### Body Parameters
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------- | -------- | :------: | -------------------------------------------------------------------- |
| `type` | `String` | ❌ | Mặc định `"service"`. Truyền `"package"` để lấy danh sách gói combo. |
```json theme={null}
{
"type": "service"
}
```
Hoặc body rỗng `{}` cũng được — mặc định trả về `services`.
## Response
```json Thành công theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"services": [
{
"type": "RecaptchaV2ImageTask",
"name": "reCAPTCHA v2 image",
"price": "0.00027",
"avgSuccess": "99%",
"avgTime": "1s",
"image": "recaptcha.svg",
"description": "Google Inc",
"requireFields": ["imageBase64"]
},
{
"type": "FuncaptchaImageTask",
"name": "FunCaptcha Image",
"price": "0.00027",
"avgSuccess": "99%",
"avgTime": "1s",
"image": "funcaptcha.svg",
"description": "Arkose Labs",
"requireFields": ["imageBase64", "other"]
}
]
}
```
### Giải thích các trường
| Trường | Kiểu | Mô tả |
| --------------- | -------- | ------------------------------------------------------------------------------------------- |
| `type` | `String` | Tên kỹ thuật — dùng trong `createTask.task.type` |
| `name` | `String` | Tên hiển thị cho UI |
| `price` | `String` | Giá tính theo lượt (USD, kiểu chuỗi để giữ độ chính xác thập phân) |
| `avgSuccess` | `String` | Tỷ lệ thành công trung bình |
| `avgTime` | `String` | Thời gian giải trung bình |
| `image` | `String` | Tên file icon (đường dẫn đầy đủ: `https://omocaptcha.com/storage/captcha-types/{filename}`) |
| `description` | `String` | Mô tả ngắn |
| `requireFields` | `Array` | Các trường bắt buộc phải truyền trong `task` khi gọi `createTask` |
## Endpoint public
Endpoint này **không yêu cầu xác thực**.
## Cache
Response được **cache 60 giây** phía máy chủ — nếu cần dữ liệu mới nhất, hãy đợi qua chu kỳ cache.
## Ví dụ sử dụng
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/getServicePrice \
-H "Content-Type: application/json" \
-d '{"type": "service"}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/getServicePrice", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ type: "service" })
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/getServicePrice",
json={"type": "service"}
)
print(res.json())
```
# Lấy thông tin gói dịch vụ
Source: https://docs.omocaptcha.com/vi/api/lay-thong-tin-goi-dich-vu
Lấy danh sách gói dịch vụ và giá tương ứng
Lấy danh sách gói (combo) đang bán, kèm các loại captcha được cover trong mỗi gói.
## Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getServicePrice
Content-Type: application/json
```
### Body Parameters
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------- | -------- | :------: | -------------------------------------------------------------- |
| `type` | `String` | ❌ | Mặc định `"service"`. Truyền `"package"` để lấy danh sách gói. |
```json theme={null}
{
"type": "package"
}
```
## Response
```json Thành công theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"packages": [
{
"name": "Combo Funcaptcha",
"price": "0.15",
"durationMonths": 1,
"services": [
{ "type": "FuncaptchaImageTask", "name": "FunCaptcha Image" }
]
},
{
"name": "Combo TikTok",
"price": "0.45",
"durationMonths": 1,
"services": [
{ "type": "TiktokSelectObjectWebTask", "name": "Tiktok (Chọn đối tượng - Web)" },
{ "type": "TiktokSliderWebTask", "name": "TikTok (Kéo thả - Web)" }
]
}
]
}
```
### Giải thích các trường
| Trường | Kiểu | Mô tả |
| ---------------- | -------- | -------------------------------------------------------------- |
| `name` | `String` | Tên gói |
| `price` | `String` | Giá tháng (USD, kiểu chuỗi để giữ độ chính xác thập phân) |
| `durationMonths` | integer | Số tháng gói có hiệu lực |
| `services` | `Array` | Danh sách captcha type được cover. Mỗi phần tử: `{type, name}` |
## Endpoint public
Endpoint này **không yêu cầu xác thực** — bất kỳ ai cũng truy vấn được để xem giá.
## Ví dụ sử dụng
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/getServicePrice \
-H "Content-Type: application/json" \
-d '{"type": "package"}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/getServicePrice", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ type: "package" })
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/getServicePrice",
json={"type": "package"}
)
print(res.json())
```
# Lấy thông tin tài khoản
Source: https://docs.omocaptcha.com/vi/api/lay-thong-tin-tai-khoan
Thông tin tài khoản chi tiết: tên, email, hạng, số dư, tổng đã nạp/chi, ngày tạo
Trả về thông tin tài khoản chi tiết hơn so với `getBalance`: tên đăng nhập, email, hạng, số dư, số dư khuyến mại, tổng đã nạp, tổng đã chi, ngày tạo tài khoản.
## Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getAccountInfo
Content-Type: application/json
```
### Body Parameters
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ----------- | -------- | :------: | --------------------- |
| `clientKey` | `String` | ✅ | API key của tài khoản |
```json theme={null}
{
"clientKey": "OMO_API_KEY"
}
```
## Response
```json Thành công theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"username": "myusername",
"email": "me@example.com",
"level": "1",
"balance": "50.00000",
"voucherBalance": "40.60000",
"totalCharged": "2127.00000",
"totalSpent": "0.00000",
"isDeveloper": false,
"createdAt": "2025-12-01 10:00:00"
}
```
```json Thất bại theme={null}
{
"errorId": 1,
"errorCode": "ERROR_KEY_DOES_NOT_EXIST",
"errorDescription": "API key does not exist"
}
```
### Giải thích các trường
| Trường | Kiểu | Mô tả |
| ------------------ | --------- | ----------------------------------------------------------------------------------------------------------- |
| `errorId` | integer | `0` = thành công, `1` = lỗi nghiệp vụ |
| `errorCode` | `String` | Mã lỗi (rỗng nếu thành công) |
| `errorDescription` | `String` | Mô tả chi tiết lỗi |
| `username` | `String` | Tên đăng nhập |
| `email` | `String` | Email tài khoản |
| `level` | `String` | Hạng tài khoản (`1` = bình thường) |
| `balance` | `String` | Số dư chính (USD, kiểu chuỗi để giữ độ chính xác thập phân) |
| `voucherBalance` | `String` | Số dư khuyến mại — khi `balance` không đủ, hệ thống sẽ tự động dùng số dư này |
| `totalCharged` | `String` | Tổng số tiền đã nạp lũy kế |
| `totalSpent` | `String` | Tổng số tiền đã chi cho các job |
| `isDeveloper` | `Boolean` | `true` nếu tài khoản đã đăng ký chương trình developer (tham gia affiliate, được hưởng hoa hồng giới thiệu) |
| `createdAt` | `String` | Thời điểm tạo tài khoản |
Xem **Bảng mã lỗi** để biết danh sách đầy đủ các `errorCode`.
## Lưu ý
**Yêu cầu xác thực**: phải có API key hợp lệ trong `clientKey`.
Khi tạo task captcha mà `balance` không đủ, hệ thống tự động trừ tiền từ `voucherBalance` nếu còn đủ.
## Ví dụ sử dụng
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/getAccountInfo \
-H "Content-Type: application/json" \
-d '{"clientKey": "OMO_API_KEY"}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/getAccountInfo", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: "OMO_API_KEY" })
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/getAccountInfo",
json={"clientKey": "OMO_API_KEY"}
)
print(res.json())
```
# RecaptchaV2ImageTask
Source: https://docs.omocaptcha.com/vi/api/recaptcha/recaptcha-v2-image-task
Giải reCAPTCHA v2 dạng hình ảnh (image challenge)
reCAPTCHA-v2 còn được gọi là captcha **TÔI KHÔNG PHẢI ROBOT**, reCAPTCHA là một loại hình ảnh xác thực rất phổ biến.
## 1. Tạo yêu cầu
### Request
```http theme={null}
POST https://api.omocaptcha.com/v2/createTask
Content-Type: application/json
```
#### Body Parameters
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | ----------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải (`RecaptchaV2ImageTask`) |
| `task.imageBase64` | `String` | ✅ | Hình ảnh captcha được mã hoá thành base64. |
| `task.question` | `String` | ✅ | Câu hỏi của thử thách captcha. |
Hình ảnh phải được thu nhỏ theo kích thước **chuẩn** (`100x100`, `300x300`, `450x450`) để dịch vụ có thể xác định loại hình ảnh.
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "RecaptchaV2ImageTask",
"imageBase64": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDc.",
"question": "traffic lights"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "RecaptchaV2ImageTask",
imageBase64: "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDc.",
question: "traffic lights"
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/createTask",
json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "RecaptchaV2ImageTask",
"imageBase64": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDc.",
"question": "traffic lights"
}
}
)
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "RecaptchaV2ImageTask",
"imageBase64" => "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDc.",
"question" => "traffic lights"
]
]));
echo curl_exec($ch);
```
### Response
```json Thành công theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
```json Thất bại theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
* `errorId = 0` và `taskId` → thành công
* `errorId = 1` và `errorCode` → thất bại (tra [Bảng mã lỗi](/vi/api/bang-ma-loi))
## 2. Nhận kết quả yêu cầu
### Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
Content-Type: application/json
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
```json Thành công theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"objects": [1, 5, 8],
"type": "multi"
}
}
```
```json Đang xử lý theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
```json Thất bại theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
* `errorId = 0` & `status = "ready"` → đọc kết quả trong `solution.objects` (vị trí các ô cần nhấp vào)
* `errorId = 0` & `status = "processing"` → đang xử lý, **chờ 2 giây** rồi thử lại
* `errorId = 1` → thất bại, tra `errorCode` trong [Bảng mã lỗi](/vi/api/bang-ma-loi)
# ShopeeSliderWebTask
Source: https://docs.omocaptcha.com/vi/api/shopee/shopee-slider-web-task
Giải captcha kéo thả (slider) của Shopee trên web.
Captcha Shopee là một loại hình ảnh xác thực phổ biến. Người dùng cần kéo mảnh ghép nhỏ vào đúng vị trí trên ảnh nền để hoàn thành xác minh.
`ShopeeSliderWebTask` hỗ trợ **hai dạng**:
* **Dạng thường** — kéo mảnh ghép theo trục ngang (trả về toạ độ `end`).
* **Dạng có quỹ đạo không xác định** (`typeCaptcha = "rotate"`) — kéo mảnh ghép theo quỹ đạo bất kỳ (trả về `point`).
## 1a. Tạo yêu cầu — Dạng kéo thả thường
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------- | ----------------- | :------: | -------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa API tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64s` | `Array of String` | ✅ | Mảng gồm 2 chuỗi base64
|
### Code mẫu
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "ShopeeSliderWebTask",
"imageBase64s": [
"BASE64_MASK_BODY_HERE",
"BASE64_BACKGROUND_BODY_HERE"
]
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const { data } = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'ShopeeSliderWebTask',
imageBase64s: [
'BASE64_MASK_BODY_HERE',
'BASE64_BACKGROUND_BODY_HERE',
],
},
});
console.log(data);
```
```python Python theme={null}
import requests
resp = requests.post('https://api.omocaptcha.com/v2/createTask', json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'ShopeeSliderWebTask',
'imageBase64s': [
'BASE64_MASK_BODY_HERE',
'BASE64_BACKGROUND_BODY_HERE',
],
},
})
print(resp.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'ShopeeSliderWebTask',
'imageBase64s' => [
'BASE64_MASK_BODY_HERE',
'BASE64_BACKGROUND_BODY_HERE',
],
],
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
## 1b. Tạo yêu cầu — Dạng có quỹ đạo không xác định
Dùng khi captcha yêu cầu kéo mảnh ghép theo **quỹ đạo bất kỳ** (không cố định theo trục ngang). Truyền thêm `typeCaptcha = "rotate"`.
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------- | ----------------- | :------: | --------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa API tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.typeCaptcha` | `String` | ✅ | Tên loại captcha, giá trị |
| `task.imageBase64s` | `Array of String` | ✅ | Mảng gồm 2 chuỗi base64
|
### Code mẫu
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "ShopeeSliderWebTask",
"typeCaptcha": "rotate",
"imageBase64s": [
"BASE64_MASK_BODY_HERE",
"BASE64_BACKGROUND_BODY_HERE"
]
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const { data } = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'ShopeeSliderWebTask',
typeCaptcha: 'rotate',
imageBase64s: [
'BASE64_MASK_BODY_HERE',
'BASE64_BACKGROUND_BODY_HERE',
],
},
});
console.log(data);
```
```python Python theme={null}
import requests
resp = requests.post('https://api.omocaptcha.com/v2/createTask', json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'ShopeeSliderWebTask',
'typeCaptcha': 'rotate',
'imageBase64s': [
'BASE64_MASK_BODY_HERE',
'BASE64_BACKGROUND_BODY_HERE',
],
},
})
print(resp.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'ShopeeSliderWebTask',
'typeCaptcha' => 'rotate',
'imageBase64s' => [
'BASE64_MASK_BODY_HERE',
'BASE64_BACKGROUND_BODY_HERE',
],
],
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` và `errorCode` tương ứng. Xem danh sách [Mã lỗi](/vi/api/bang-ma-loi).
## 2a. Nhận kết quả — Dạng thường
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"end": {
"x": 150,
"y": 42
}
}
}
```
| Trường | Kiểu | Mô tả |
| ---------------- | ------ | -------------------------------------------- |
| `solution.end.x` | Number | Tọa độ **X** đích cần kéo mảnh ghép đến (px) |
| `solution.end.y` | Number | Tọa độ **Y** đích cần kéo mảnh ghép đến (px) |
## 2b. Nhận kết quả — Dạng có quỹ đạo không xác định
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"point": {
"x": 153,
"y": 78
}
}
}
```
| Trường | Kiểu | Mô tả |
| ------------------ | ------ | ------------------------------------------------- |
| `solution.point.x` | Number | Tọa độ **X** điểm đích cần đưa mảnh ghép tới (px) |
| `solution.point.y` | Number | Tọa độ **Y** điểm đích cần đưa mảnh ghép tới (px) |
Toạ độ được tính theo hệ pixel của ảnh nền gửi lên. Kết hợp vị trí ban đầu của mảnh ghép và toạ độ trả về để tính quãng đường, sau đó mô phỏng thao tác kéo (mousedown → mousemove → mouseup) với quỹ đạo tự nhiên.
**Đang xử lý:**
```json theme={null}
{
"errorId": 0,
"status": "processing",
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing`. Vui lòng chờ **2 giây** rồi yêu cầu lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1`. Xem chi tiết tại [Mã lỗi](/vi/api/bang-ma-loi).
# SliderAllWebTask
Source: https://docs.omocaptcha.com/vi/api/slider-all/slider-all-web-task
Giải captcha kéo thả (slider) chung trên web — trả về toạ độ mảnh ghép cần đặt vào.
Kéo thả trên web là một loại hình ảnh xác thực phổ biến. `SliderAllWebTask` là bộ giải chung cho các captcha dạng ghép mảnh: bạn cung cấp ảnh nền (đã có lỗ ghép) cùng kích thước hiển thị, hệ thống trả về toạ độ vị trí cần thả mảnh ghép.
## 1. Tạo yêu cầu
**Request**
```http theme={null}
POST https://api.omocaptcha.com/v2/createTask
```
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | --------------------------------------------- |
| `clientKey` | `String` | ✅ | Khoá tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha: `SliderAllWebTask` |
| `task.imageBase64` | `String` | ✅ | Ảnh nền (đã có lỗ ghép) mã hoá Base64 |
| `task.widthView` | `Number` | ✅ | Chiều rộng ảnh hiển thị trên web (px) |
| `task.heightView` | `Number` | ❌ | Chiều cao ảnh hiển thị trên web (px) |
`widthView` / `heightView` phải là kích thước **hiển thị thực tế** trên trình duyệt, không phải kích thước gốc của ảnh. Toạ độ trả về sẽ dựa trên hệ trục này.
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "SliderAllWebTask",
"imageBase64": "BASE64_BODY_HERE",
"widthView": 300,
"heightView": 150
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "SliderAllWebTask",
imageBase64: "BASE64_BODY_HERE",
widthView: 300,
heightView: 150,
},
}),
});
const data = await res.json();
console.log(data);
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/createTask",
json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "SliderAllWebTask",
"imageBase64": "BASE64_BODY_HERE",
"widthView": 300,
"heightView": 150,
},
},
)
print(res.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'SliderAllWebTask',
'imageBase64' => 'BASE64_BODY_HERE',
'widthView' => 300,
'heightView' => 150,
],
];
$ch = curl_init('https://api.omocaptcha.com/v2/createTask');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` cùng `errorCode` là mã lỗi tương ứng.
## 2. Nhận kết quả
**Request**
```http theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"errorCode": "",
"errorDescription": "",
"status": "ready",
"solution": {
"rects": [
{ "x": 237, "y": 70, "w": 53, "h": 47 }
]
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong `solution.rects`:
| Trường | Kiểu | Mô tả |
| ------ | -------- | -------------------------------------------------------- |
| `x` | `Number` | Toạ độ X (px) của góc trên-trái vị trí cần thả mảnh ghép |
| `y` | `Number` | Toạ độ Y (px) của góc trên-trái vị trí cần thả mảnh ghép |
| `w` | `Number` | Chiều rộng vùng đích (px) |
| `h` | `Number` | Chiều cao vùng đích (px) |
Toạ độ được tính theo hệ `widthView` × `heightView` bạn đã gửi. Nếu web hiển thị ảnh ở kích thước khác, hãy quy đổi tương ứng trước khi mô phỏng thao tác kéo.
Đang xử lý:
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `status = processing` — yêu cầu đang được xử lý, hãy chờ \~2 giây rồi gọi lại.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1` khi giải thất bại.
# Tencent Slider
Source: https://docs.omocaptcha.com/vi/api/slider-all/tencent-slider-web-task
Giải Tencent slider captcha (global.captcha.gtimg.com) bằng SliderAllWebTask — bộ giải kéo-thả chung.
Tencent slider được giải qua **`SliderAllWebTask`** — bộ giải kéo-thả chung cho mọi nhà cung cấp. Xem trang [SliderAllWebTask](/vi/api/slider-all/overview) để biết chi tiết đầy đủ. Trang này giữ lại cho mục đích tham khảo với `domain` thực tế của Tencent.
## 1. Tạo yêu cầu
**Endpoint:** `POST https://api.omocaptcha.com/v2/createTask`
### Tham số
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | --------------------------------------------------- |
| `clientKey` | `String` | ✅ | API key trong tài khoản của bạn. |
| `task.type` | `String` | ✅ | `SliderAllWebTask` |
| `task.imageBase64` | `String` | ✅ | Ảnh nền (background) đã mã hoá Base64.
|
| `task.puzzle` | `String` | ✅ | Hình ảnh được mã hóa base64.
|
| `task.domain` | `String` | ✅ | Domain của iframe chứa captcha |
| `task.widthView` | `Number` | ✅ | Width thực tế hiển thị của ảnh captcha |
| `task.heightView` | `Number` | ✅ | Height thực tế hiển thị của ảnh captcha |
### Ví dụ request
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "SliderAllWebTask",
"imageBase64": "BASE64_BACKGROUND",
"puzzle": "BASE64_PUZZLE",
"domain": "global.captcha.gtimg.com",
"widthView": 340,
"heightView": 243
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "YOUR_API_KEY",
task: {
type: "SliderAllWebTask",
imageBase64: "BASE64_BACKGROUND",
puzzle: "BASE64_PUZZLE",
domain: "global.captcha.gtimg.com",
widthView: 340,
heightView: 243
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post("https://api.omocaptcha.com/v2/createTask", json={
"clientKey": "YOUR_API_KEY",
"task": {
"type": "SliderAllWebTask",
"imageBase64": "BASE64_BACKGROUND",
"puzzle": "BASE64_PUZZLE",
"domain": "global.captcha.gtimg.com",
"widthView": 340,
"heightView": 243
}
})
print(res.json())
```
```php PHP theme={null}
"YOUR_API_KEY",
"task" => [
"type" => "SliderAllWebTask",
"imageBase64" => "BASE64_BACKGROUND",
"puzzle" => "BASE64_PUZZLE",
"domain" => "global.captcha.gtimg.com",
"widthView" => 340,
"heightView" => 243
]
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
```
### Ví dụ phản hồi
```json theme={null}
{
"errorId": 0,
"taskId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
```
## 2. Lấy kết quả
**Endpoint:** `POST https://api.omocaptcha.com/v2/getTaskResult`
### Ví dụ phản hồi
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"end": { "x": 150, "y": 42 }
}
}
```
`solution.end` là toạ độ điểm thả mảnh ghép trong hệ toạ độ của ảnh nền.
# TencentSelectObjectTask
Source: https://docs.omocaptcha.com/vi/api/tencent/select-object-task
Giải Tencent captcha chọn đối tượng (select object) bằng TencentSelectObjectTask.
Captcha select object là một loại hình ảnh xác thực phổ biến — người dùng cần chọn các đối tượng phù hợp với câu hỏi (hoặc ảnh anchor) trong lưới ảnh.
## 1. Tạo yêu cầu
**Endpoint:** `POST https://api.omocaptcha.com/v2/createTask`
### Tham số
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | -------------------------------------------------- |
| `clientKey` | `String` | ✅ | API key trong tài khoản của bạn. |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Hình ảnh captcha đã mã hoá Base64.
|
| `task.question` | `String` | ✅ | Câu hỏi của captcha |
| `task.anchor` | `String` | ❌ | Ảnh anchor (nếu có) ngay sau câu hỏi.
|
### Ví dụ request
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "YOUR_API_KEY",
"task": {
"type": "TencentSelectObjectTask",
"imageBase64": "BASE64_IMAGE",
"question": "choose the most alike",
"anchor": "BASE64_ANCHOR"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "YOUR_API_KEY",
task: {
type: "TencentSelectObjectTask",
imageBase64: "BASE64_IMAGE",
question: "choose the most alike",
anchor: "BASE64_ANCHOR"
}
})
});
console.log(await res.json());
```
```python Python theme={null}
import requests
res = requests.post("https://api.omocaptcha.com/v2/createTask", json={
"clientKey": "YOUR_API_KEY",
"task": {
"type": "TencentSelectObjectTask",
"imageBase64": "BASE64_IMAGE",
"question": "choose the most alike",
"anchor": "BASE64_ANCHOR"
}
})
print(res.json())
```
```php PHP theme={null}
"YOUR_API_KEY",
"task" => [
"type" => "TencentSelectObjectTask",
"imageBase64" => "BASE64_IMAGE",
"question" => "choose the most alike",
"anchor" => "BASE64_ANCHOR"
]
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($ch);
```
### Ví dụ phản hồi
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
## 2. Lấy kết quả
**Endpoint:** `POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "YOUR_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Ví dụ phản hồi
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"objects": [4, 5]
}
}
```
`solution.objects` là danh sách chỉ số (bắt đầu từ `0`) của các ô ảnh cần chọn trong lưới, đọc từ trái sang phải, trên xuống dưới.
# TiktokSelectObjectWebTask
Source: https://docs.omocaptcha.com/vi/api/tiktok/overview
Chọn 2 đối tượng có hình dạng giống nhau trên web TikTok
Chọn 2 đối tượng trên web là một loại hình ảnh xác thực phổ biến của TikTok.
## 1. Tạo yêu cầu
### Request
```http theme={null}
POST https://api.omocaptcha.com/v2/createTask
```
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | ------ | :------: | ------------------------------------------------------------------------ |
| `clientKey` | String | ✅ | Khóa tài khoản khách hàng |
| `task.type` | String | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | String | ✅ | Hình ảnh được mã hóa base64
|
| `task.widthView` | Number | ✅ | Chiều rộng ảnh hiển thị trên web (px)
|
| `task.heightView` | Number | ✅ | Chiều cao ảnh hiển thị trên web (px)
|
| `task.question` | String | ✅ | Câu hỏi của captcha (ví dụ: `Which of these objects are used in hoops?`) |
`widthView` và `heightView` là kích thước ảnh **đang hiển thị trên web** (khác với kích thước gốc của ảnh). Bạn có thể click chuột phải vào ảnh → *Kiểm tra phần tử* để lấy đúng giá trị.
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "TiktokSelectObjectWebTask",
"imageBase64": "BASE64_BODY_HERE",
"widthView": 340,
"heightView": 212,
"question": "Which of these objects.?"
}
}'
```
```javascript Node.js theme={null}
const axios = require("axios");
const { data } = await axios.post("https://api.omocaptcha.com/v2/createTask", {
clientKey: "OMO_API_KEY",
task: {
type: "TiktokSelectObjectWebTask",
imageBase64: "BASE64_BODY_HERE",
widthView: 340,
heightView: 212,
question: "Which of these objects.?",
},
});
console.log(data);
```
```python Python theme={null}
import requests
resp = requests.post(
"https://api.omocaptcha.com/v2/createTask",
json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "TiktokSelectObjectWebTask",
"imageBase64": "BASE64_BODY_HERE",
"widthView": 340,
"heightView": 212,
"question": "Which of these objects.?"
},
},
)
print(resp.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "TiktokSelectObjectWebTask",
"imageBase64" => "BASE64_BODY_HERE",
"widthView" => 340,
"heightView" => 212,
"question" => "Which of these objects.?"
],
];
$ch = curl_init("https://api.omocaptcha.com/v2/createTask");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
echo curl_exec($ch);
curl_close($ch);
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` kèm `errorCode` là mã lỗi tương ứng.
## 2. Nhận kết quả
### Request
```http theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"pointA": { "x": 50, "y": 30 },
"pointB": { "x": 100, "y": 70 }
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc tọa độ 2 đối tượng cần click trong `solution.pointA` và `solution.pointB`.
Tọa độ `x`, `y` tính theo hệ trục của ảnh đã hiển thị trên web (dựa trên `widthView` × `heightView`). Click đúng 2 điểm này rồi bấm **Xác nhận**.
**Đang xử lý:**
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing`. Vui lòng đợi 2 giây rồi gọi lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1`, tham khảo [Bảng mã lỗi](/vi/api/bang-ma-loi) để xử lý.
# Tiktok3DSelectObjectPhoneTask
Source: https://docs.omocaptcha.com/vi/api/tiktok/tiktok-3d-select-object-phone-task
Giải captcha chọn 2 đối tượng 3D cùng loại trên phiên bản mobile (phone) của TikTok.
## 1. Tạo yêu cầu
**Endpoint**
```http theme={null}
POST https://api.omocaptcha.com/v2/createTask
```
### Tham số
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | ------ | :------: | ----------------------------------------- |
| `clientKey` | String | ✅ | Khóa tài khoản khách hàng |
| `task.type` | String | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | String | ✅ | Hình ảnh chụp màn hình được mã hóa base64 |
Ảnh gửi lên nên là **ảnh crop** đúng vùng challenge (như hình minh họa ở trên), không bao gồm phần header/footer của modal.
### Ví dụ request
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "Tiktok3DSelectObjectPhoneTask",
"imageBase64": "BASE64_BODY_HERE"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "Tiktok3DSelectObjectPhoneTask",
imageBase64: "BASE64_BODY_HERE",
},
}),
});
const data = await res.json();
console.log(data);
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/createTask",
json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "Tiktok3DSelectObjectPhoneTask",
"imageBase64": "BASE64_BODY_HERE",
},
},
)
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "Tiktok3DSelectObjectPhoneTask",
"imageBase64" => "BASE64_BODY_HERE",
],
];
$ch = curl_init("https://api.omocaptcha.com/v2/createTask");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
### Response
**Thành công**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo task thành công.
**Thất bại**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` kèm mã lỗi trong `errorCode`.
## 2. Nhận kết quả
**Endpoint**
```http theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
```
### Request
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"pointA": { "x": 50, "y": 30 },
"pointB": { "x": 100, "y": 70 }
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong `solution`:
* `pointA` — tọa độ đối tượng thứ nhất (x, y).
* `pointB` — tọa độ đối tượng thứ hai (x, y).
Hai điểm này ứng với 2 vật thể có cùng hình dạng trong ảnh challenge.
**Đang xử lý**
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing` — yêu cầu đang được xử lý, vui lòng chờ **2 giây** rồi gọi lại.
**Thất bại**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1` khi giải thất bại.
# Tiktok3DSelectObjectWebTask
Source: https://docs.omocaptcha.com/vi/api/tiktok/tiktok-3d-select-object-web-task
Giải captcha chọn 2 đối tượng 3D giống nhau trên web của Tiktok.
Chọn 2 đối tượng 3D trên web là một loại hình ảnh xác thực phổ biến. Người dùng cần chọn 2 đối tượng 3D có cùng hình dạng trong một ảnh nền.
## 1. Tạo yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | ------ | :------: | ------------------------------------------------------------------- |
| `clientKey` | String | ✅ | Khóa tài khoản khách hàng |
| `task.type` | String | ✅ | `Tiktok3DSelectObjectWebTask` |
| `task.imageBase64` | String | ✅ | Hình ảnh captcha được mã hóa base64
|
| `task.widthView` | Number | ✅ | Chiều rộng ảnh hiển thị trên web |
| `task.heightView` | Number | ✅ | Chiều cao ảnh hiển thị trên web |
| `task.question` | String | ✅ | Câu hỏi của captcha |
`widthView` và `heightView` là kích thước ảnh **đang hiển thị** trên trang web, không phải kích thước gốc của ảnh. Dùng công cụ Inspect element của trình duyệt để lấy giá trị chính xác.
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "Tiktok3DSelectObjectWebTask",
"imageBase64": "BASE64_BODY_HERE",
"widthView": 340,
"heightView": 212,
"question": "Which of these objects are used in hoops?"
}
}'
```
```javascript Node.js theme={null}
const res = await fetch("https://api.omocaptcha.com/v2/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
clientKey: "OMO_API_KEY",
task: {
type: "Tiktok3DSelectObjectWebTask",
imageBase64: "BASE64_BODY_HERE",
widthView: 340,
heightView: 212,
question: "Which of these objects are used in hoops?",
},
}),
});
const data = await res.json();
console.log(data);
```
```python Python theme={null}
import requests
res = requests.post(
"https://api.omocaptcha.com/v2/createTask",
json={
"clientKey": "OMO_API_KEY",
"task": {
"type": "Tiktok3DSelectObjectWebTask",
"imageBase64": "BASE64_BODY_HERE",
"widthView": 340,
"heightView": 212,
"question": "Which of these objects are used in hoops?",
},
},
)
print(res.json())
```
```php PHP theme={null}
"OMO_API_KEY",
"task" => [
"type" => "Tiktok3DSelectObjectWebTask",
"imageBase64" => "BASE64_BODY_HERE",
"widthView" => 340,
"heightView" => 212,
"question" => "Which of these objects are used in hoops?",
],
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` kèm `errorCode`. Xem [Mã lỗi](/vi/api/bang-ma-loi) để biết chi tiết.
## 2. Nhận kết quả
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"pointA": { "x": 50, "y": 30 },
"pointB": { "x": 100, "y": 70 }
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong `solution`:
* `pointA` — tọa độ đối tượng thứ nhất (x, y) tính theo `widthView`/`heightView` đã gửi.
* `pointB` — tọa độ đối tượng thứ hai.
Click lần lượt vào 2 điểm này trên ảnh để hoàn thành captcha.
**Đang xử lý:**
```json theme={null}
{
"errorId": 0,
"status": "processing",
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `status = processing`. Hãy chờ \~2 giây rồi gọi lại `getTaskResult`.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1` và `status = fail`.
# TiktokRotateWebTask
Source: https://docs.omocaptcha.com/vi/api/tiktok/tiktok-rotate-web-task
Giải captcha xoay ảnh (rotate) của Tiktok trên web.
Xoay trên web là một loại hình ảnh xác thực phổ biến của Tiktok. Người dùng cần xoay ảnh bên trong sao cho khớp với ảnh bên ngoài.
## 1. Tạo yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------- | --------------- | :------: | --------------------------------------------------------- |
| `clientKey` | String | ✅ | Khóa API tài khoản khách hàng |
| `task.type` | String | ✅ | Tên class dịch vụ captcha cần giải: `TiktokRotateWebTask` |
| `task.imageBase64s` | Array of String | ✅ | Mảng 2 chuỗi base64: `[ảnh bên trong, ảnh bên ngoài]` |
`imageBase64s` phải là mảng **2 phần tử theo đúng thứ tự**: phần tử đầu là ảnh **bên trong** (image inside), phần tử thứ hai là ảnh **bên ngoài** (image outside). Không kèm tiền tố `data:image/...;base64,`.
### Loại ảnh
| Loại ảnh | Image |
| ------------------------------------------- | ------- |
| **Image inside** — ảnh bên trong (cần xoay) |
|
| **Image outside** — ảnh bên ngoài (cố định) |
|
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "TiktokRotateWebTask",
"imageBase64s": [
"BASE64_INSIDE_BODY_HERE",
"BASE64_OUTSIDE_BODY_HERE"
]
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const res = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'TiktokRotateWebTask',
imageBase64s: [
'BASE64_INSIDE_BODY_HERE',
'BASE64_OUTSIDE_BODY_HERE'
]
}
});
console.log(res.data);
```
```python Python theme={null}
import requests
res = requests.post('https://api.omocaptcha.com/v2/createTask', json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'TiktokRotateWebTask',
'imageBase64s': [
'BASE64_INSIDE_BODY_HERE',
'BASE64_OUTSIDE_BODY_HERE'
]
}
})
print(res.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'TiktokRotateWebTask',
'imageBase64s' => [
'BASE64_INSIDE_BODY_HERE',
'BASE64_OUTSIDE_BODY_HERE'
]
]
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` cùng `errorCode` mô tả lỗi.
## 2. Nhận kết quả
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"rotate": 0.76
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong trường `solution`.
### Cách tính vị trí kéo Slider CAPTCHA
Nút kéo chỉ có thể di chuyển trong phạm vi bằng **chiều dài thanh trượt trừ đi chiều dài của nút kéo**. Hệ thống CAPTCHA không trả về giá trị pixel trực tiếp mà trả về một giá trị tỷ lệ gọi là `solution`, nằm trong khoảng **từ 0 đến 1**, biểu thị vị trí đúng của nút trên thanh trượt.
Để chuyển giá trị tỷ lệ này sang vị trí thực tế theo pixel, sử dụng công thức:
```text theme={null}
targetX = (chiều dài thanh trượt − chiều dài nút kéo) × (1 − solution)
```
Kết quả của công thức là **tọa độ X mục tiêu** mà nút kéo cần đạt tới trên thanh trượt, không phải là quãng đường cần kéo thêm.
Ví dụ: nếu thanh trượt dài **300px**, nút kéo dài **40px** thì quãng đường tối đa là **260px**. Khi `solution = 0.76`, vị trí cần đạt tới là `260 × (1 − 0.76) = 62.4px`. Điều này có nghĩa là nút kéo cần nằm tại vị trí khoảng **62px** trên thanh trượt để xác minh thành công.
Tóm lại, hệ thống sử dụng giá trị tỷ lệ để đảm bảo tính linh hoạt trên mọi kích thước giao diện, và việc chuyển đổi sang pixel giúp xác định chính xác vị trí kéo của nút.
```javascript Mã mẫu tính vị trí kéo theme={null}
// ===============================
// MÃ MẪU TÍNH VỊ TRÍ KÉO SLIDER CAPTCHA
// ===============================
// Lấy nút kéo của slider
const button = document.querySelector('.slider-button');
if (!button) {
console.error('Không tìm thấy nút kéo');
return;
}
// Lấy thanh trượt (phần tử cha trực tiếp của nút)
const track = button.parentElement;
if (!track) {
console.error('Không tìm thấy thanh trượt');
return;
}
// Chiều dài thanh trượt và nút kéo (px)
const trackWidth = track.clientWidth;
const buttonWidth = button.clientWidth;
// Quãng đường tối đa nút kéo có thể di chuyển
const maxTranslateX = trackWidth - buttonWidth;
// Giá trị solution do hệ thống CAPTCHA trả về (tỷ lệ 0 → 1)
const solution = 0.76;
// Chuyển tỷ lệ solution sang pixel
// Công thức: (chiều dài thanh trượt − chiều dài nút) × (1 − solution)
const targetX = maxTranslateX * (1 - solution);
// Đặt nút kéo tại vị trí cần xác minh
button.style.transform = `translateX(${targetX}px)`;
// ===============================
// GHI CHÚ:
// - solution: tỷ lệ vị trí đúng
// - targetX: tọa độ X mục tiêu của nút kéo
// - Không phải quãng đường kéo thêm
// ===============================
```
**Đang xử lý:**
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing` — yêu cầu đang được xử lý, vui lòng chờ **2 giây** rồi gọi lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1` cùng `errorCode` mô tả lỗi.
# TiktokSliderPhoneTask
Source: https://docs.omocaptcha.com/vi/api/tiktok/tiktok-slider-phone-task
Giải captcha kéo thả (slider) của Tiktok trên phiên bản phone.
Kéo thả trên phone là một loại hình ảnh xác thực phổ biến. Người dùng cần kéo mảnh ghép nhỏ vào đúng vị trí trên ảnh nền.
## 1. Tạo yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | -------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa API tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Ảnh chụp màn hình được mã hóa base64
|
### Code mẫu
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "TiktokSliderPhoneTask",
"imageBase64": "BASE64_BODY_HERE"
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const { data } = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'TiktokSliderPhoneTask',
imageBase64: 'BASE64_BODY_HERE',
},
});
console.log(data);
```
```python Python theme={null}
import requests
resp = requests.post('https://api.omocaptcha.com/v2/createTask', json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'TiktokSliderPhoneTask',
'imageBase64': 'BASE64_BODY_HERE',
},
})
print(resp.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'TiktokSliderPhoneTask',
'imageBase64' => 'BASE64_BODY_HERE',
],
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` và `errorCode` là mã lỗi tương ứng. Xem danh sách [Mã lỗi](/vi/api/bang-ma-loi).
## 2. Nhận kết quả yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"start": {
"x": 50,
"y": 30
},
"end": {
"x": 100,
"y": 70
},
"end2": {
"x": 100,
"y": 70
}
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong trường `solution`.
| Trường | Kiểu | Mô tả |
| ------------------ | ------ | ---------------------------------------------- |
| `solution.start.x` | Number | Tọa độ **X** vị trí bắt đầu của mảnh ghép (px) |
| `solution.start.y` | Number | Tọa độ **Y** vị trí bắt đầu của mảnh ghép (px) |
| `solution.end.x` | Number | Tọa độ **X** đích cần kéo mảnh ghép đến (px) |
| `solution.end.y` | Number | Tọa độ **Y** đích cần kéo mảnh ghép đến (px) |
| `solution.end2.x` | Number | Tọa độ **X** đích thay thế (px) |
| `solution.end2.y` | Number | Tọa độ **Y** đích thay thế (px) |
Toạ độ được tính theo hệ pixel của ảnh gốc gửi lên. Kết hợp `start` và `end` để tính quãng đường kéo, sau đó mô phỏng thao tác chạm và kéo (touchstart → touchmove → touchend) trên phone với quỹ đạo tự nhiên.
**Đang xử lý:**
```json theme={null}
{
"errorId": 0,
"status": "processing",
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing`. Vui lòng chờ **2 giây** rồi yêu cầu lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1`. Xem chi tiết tại [Mã lỗi](/vi/api/bang-ma-loi).
# TiktokSliderWebTask
Source: https://docs.omocaptcha.com/vi/api/tiktok/tiktok-slider-web-task
Giải captcha kéo thả (slider) của Tiktok trên web.
Kéo thả trên web là một loại hình ảnh xác thực phổ biến. Người dùng cần kéo mảnh ghép nhỏ vào đúng vị trí trên ảnh nền.
## 1. Tạo yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/createTask`
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | -------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa API tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Ảnh chụp màn hình được mã hóa base64
|
| `task.widthView` | `Number` | ✅ | Chiều rộng ảnh hiển thị trên web (px).
|
### Code mẫu
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "TiktokSliderWebTask",
"imageBase64": "BASE64_BODY_HERE",
"widthView": 340
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const { data } = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'TiktokSliderWebTask',
imageBase64: 'BASE64_BODY_HERE',
widthView: 340,
},
});
console.log(data);
```
```python Python theme={null}
import requests
resp = requests.post('https://api.omocaptcha.com/v2/createTask', json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'TiktokSliderWebTask',
'imageBase64': 'BASE64_BODY_HERE',
'widthView': 340,
},
})
print(resp.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'TiktokSliderWebTask',
'imageBase64' => 'BASE64_BODY_HERE',
'widthView' => 340,
],
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 1` và `errorCode` là mã lỗi tương ứng. Xem danh sách [Mã lỗi](/vi/api/bang-ma-loi).
## 2. Nhận kết quả yêu cầu
### Request
`POST https://api.omocaptcha.com/v2/getTaskResult`
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
### Response
**Thành công:**
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"end": {
"x": 150,
"y": 42
}
}
}
```
Máy chủ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong trường `solution`.
| Trường | Kiểu | Mô tả |
| ---------------- | ------ | ----------------------------------------------------------------- |
| `solution.end.x` | Number | Tọa độ **X** đích cần kéo mảnh ghép đến (px, theo hệ `widthView`) |
| `solution.end.y` | Number | Tọa độ **Y** đích cần kéo mảnh ghép đến (px) |
Toạ độ `end` là **vị trí đích** của mảnh ghép trên ảnh (theo tỉ lệ `widthView`). Kết hợp với vị trí gốc của nút kéo để tính quãng đường di chuyển, sau đó mô phỏng thao tác kéo chuột (mousedown → mousemove → mouseup) với quỹ đạo tự nhiên.
**Đang xử lý:**
```json theme={null}
{
"errorId": 0,
"status": "processing",
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ trả về `errorId = 0` và `status = processing`. Vui lòng chờ **2 giây** rồi yêu cầu lại.
**Thất bại:**
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ trả về `errorId = 1`. Xem chi tiết tại [Mã lỗi](/vi/api/bang-ma-loi).
# ZaloSelectObjectTask
Source: https://docs.omocaptcha.com/vi/api/zalo/zalo-select-object-task
Giải captcha chọn đối tượng của Zalo
Chọn đối tượng là một loại hình ảnh xác thực phổ biến.
## 1. Tạo yêu cầu
**Request**
```http theme={null}
POST https://api.omocaptcha.com/v2/createTask
```
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | -------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải |
| `task.imageBase64` | `String` | ✅ | Hình ảnh lưới 3x3 được mã hóa base64
|
| `task.other` | `String` | ✅ | Văn bản câu hỏi captcha
|
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "ZaloSelectObjectTask",
"imageBase64": "BASE64_BODY_HERE",
"other": "Chọn tất cả ảnh có: biển báo giao thông"
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const response = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'ZaloSelectObjectTask',
imageBase64: 'BASE64_BODY_HERE',
other: 'Chọn tất cả ảnh có: biển báo giao thông'
}
});
console.log(response.data);
```
```python Python theme={null}
import requests
response = requests.post(
'https://api.omocaptcha.com/v2/createTask',
json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'ZaloSelectObjectTask',
'imageBase64': 'BASE64_BODY_HERE',
'other': 'Chọn tất cả ảnh có: biển báo giao thông'
}
}
)
print(response.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'ZaloSelectObjectTask',
'imageBase64' => 'BASE64_BODY_HERE',
'other' => 'Chọn tất cả ảnh có: biển báo giao thông'
]
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ sẽ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ sẽ trả về `errorId = 1` cùng với `errorCode` là mã lỗi.
## 2. Nhận kết quả yêu cầu
**Request**
```http theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"objects": [0, 1, 2, 3]
}
}
```
Máy chủ sẽ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong `solution`.
| Trường | Kiểu | Mô tả |
| ------------------ | --------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `solution.objects` | `Array` | Danh sách chỉ số (index) các ô cần chọn trong lưới 3x3, đánh số từ `0` đến `8` theo thứ tự trái sang phải, trên xuống dưới |
Lưới 3x3 được đánh chỉ số như sau: hàng trên `0, 1, 2`, hàng giữa `3, 4, 5`, hàng dưới `6, 7, 8`. Click chọn tất cả các ô có index nằm trong `solution.objects`, sau đó bấm nút **Xác thực**.
Đang xử lý:
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ sẽ trả về `errorId = 0` và `status = processing` khi yêu cầu đang được xử lý. Vui lòng chờ 2 giây rồi yêu cầu lại.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ sẽ trả về `errorId = 1` khi xử lý thất bại.
# ZaloSliderPhoneTask
Source: https://docs.omocaptcha.com/vi/api/zalo/zalo-slider-phone-task
Giải captcha kéo thả mảnh ghép trên app Zalo
Kéo thả trên app là một loại hình ảnh xác thực phổ biến.
## 1. Tạo yêu cầu
**Request**
```http theme={null}
POST https://api.omocaptcha.com/v2/createTask
```
| Tham số | Kiểu | Bắt buộc | Mô tả |
| ------------------ | -------- | :------: | ------------------------------------------------------------- |
| `clientKey` | `String` | ✅ | Khóa tài khoản khách hàng |
| `task.type` | `String` | ✅ | Tên class dịch vụ captcha cần giải: `ZaloSliderPhoneTask` |
| `task.imageBase64` | `String` | ✅ | Hình ảnh chụp màn hình được mã hóa base64
|
```bash cURL theme={null}
curl -X POST https://api.omocaptcha.com/v2/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "OMO_API_KEY",
"task": {
"type": "ZaloSliderPhoneTask",
"imageBase64": "BASE64_BODY_HERE"
}
}'
```
```javascript Node.js theme={null}
const axios = require('axios');
const response = await axios.post('https://api.omocaptcha.com/v2/createTask', {
clientKey: 'OMO_API_KEY',
task: {
type: 'ZaloSliderPhoneTask',
imageBase64: 'BASE64_BODY_HERE'
}
});
console.log(response.data);
```
```python Python theme={null}
import requests
response = requests.post(
'https://api.omocaptcha.com/v2/createTask',
json={
'clientKey': 'OMO_API_KEY',
'task': {
'type': 'ZaloSliderPhoneTask',
'imageBase64': 'BASE64_BODY_HERE'
}
}
)
print(response.json())
```
```php PHP theme={null}
'OMO_API_KEY',
'task' => [
'type' => 'ZaloSliderPhoneTask',
'imageBase64' => 'BASE64_BODY_HERE'
]
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
Máy chủ sẽ trả về `errorId = 0` và `taskId` khi tạo yêu cầu thành công.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ sẽ trả về `errorId = 1` cùng với `errorCode` là mã lỗi.
## 2. Nhận kết quả yêu cầu
**Request**
```http theme={null}
POST https://api.omocaptcha.com/v2/getTaskResult
```
```json theme={null}
{
"clientKey": "OMO_API_KEY",
"taskId": "49f9f60a-c809-4af0-93c0-0409b72e67e0"
}
```
**Response**
Thành công:
```json theme={null}
{
"errorId": 0,
"status": "ready",
"solution": {
"start": {
"x": 100,
"y": 250
},
"end": {
"x": 300,
"y": 250
}
}
}
```
Máy chủ sẽ trả về `errorId = 0` và `status = ready`. Đọc kết quả trong `solution`.
| Trường | Kiểu | Mô tả |
| ------------------ | -------- | ------------------------------------- |
| `solution.start.x` | `Number` | Tọa độ X điểm bắt đầu kéo (mảnh ghép) |
| `solution.start.y` | `Number` | Tọa độ Y điểm bắt đầu kéo (mảnh ghép) |
| `solution.end.x` | `Number` | Tọa độ X điểm thả (vị trí đích) |
| `solution.end.y` | `Number` | Tọa độ Y điểm thả (vị trí đích) |
Mô phỏng thao tác chạm trên app: `touchstart` tại `start` → `touchmove` theo quỹ đạo tự nhiên đến `end` → `touchend`. Tránh di chuyển thẳng tuyến tính quá nhanh để giảm khả năng bị phát hiện là bot.
Đang xử lý:
```json theme={null}
{
"status": "processing",
"errorId": 0,
"errorCode": "",
"errorDescription": ""
}
```
Máy chủ sẽ trả về `errorId = 0` và `status = processing` khi yêu cầu đang được xử lý. Vui lòng chờ 2 giây rồi yêu cầu lại.
Thất bại:
```json theme={null}
{
"errorId": 1,
"errorCode": "ERROR_JOB_STATUS",
"errorDescription": "Job failed",
"status": "fail",
"solution": {}
}
```
Máy chủ sẽ trả về `errorId = 1` khi xử lý thất bại.
# Cài extension từ file zip
Source: https://docs.omocaptcha.com/vi/huong-dan/cai-extension-tu-file-zip
Hướng dẫn cài đặt extension OMOCaptcha từ file .zip
## 1. Tải extension
Bấm vào [đây](https://drive.google.com/drive/folders/1) để đến thư mục chứa các extension.
Sau khi truy cập thành công, hãy chọn trình duyệt bạn muốn cài. Ví dụ nếu muốn cài extension cho Chrome, hãy truy cập thư mục **Chrome**.
Trong thư mục sẽ chứa các file nén như sau. Ở đây có một file zip, file này là extension **phiên bản mới nhất**. Chúng tôi khuyên bạn nên tải bản mới nhất.
## 2. Giải nén extension
Sau khi tải thành công ở bước 1, chúng ta sẽ có file zip như sau:
Tiếp tục giải nén file zip này. Nếu trong quá trình giải nén hiện thông báo nhập mật khẩu, hãy nhập mật khẩu là `12345`.
Sau khi giải nén thành công, chúng ta sẽ được thư mục như sau:
## 3. Cài extension vào Chrome
Mở Chrome lên rồi truy cập vào URL `chrome://extensions/`. Sau khi truy cập thành công, giao diện sẽ như sau:
Hãy để ý ở góc bên phải có nút **"Chế độ dành cho nhà phát triển"**. Nếu đang tắt thì hãy bật lên:
Tiếp tục bấm vào nút **"Tải tiện ích đã giải nén"**:
Sẽ hiện lên tab chọn thư mục. Bây giờ hãy tìm đến thư mục extension đã giải nén ở bước 2, rồi bấm vào nút **"Select Folder"** để chọn thư mục:
Sau khi chọn xong, trong trình duyệt sẽ hiện như sau — nghĩa là chúng ta đã cài extension thành công:
Sau khi cài xong, bạn hãy [thiết lập API key cho extension](/vi/huong-dan/set-api-key-cho-extension) để bắt đầu sử dụng.
Nếu extension không hoạt động, hãy tắt/bật lại công tắc của extension hoặc khởi động lại trình duyệt.
# Set API KEY cho extension
Source: https://docs.omocaptcha.com/vi/huong-dan/set-api-key-cho-extension
Cấu hình API Key cho extension OMOCaptcha
Sau khi đã cài extension vào trình duyệt (xem [Cài extension từ file zip](/vi/huong-dan/cai-extension-tu-file-zip)), bạn có **3 cách** để thiết lập API Key cho extension:
Nhập trực tiếp vào extension
Chỉnh sửa file `configs.json`
Dùng URL trên trình duyệt
## Cách 1. Nhập trực tiếp vào extension
Sau khi cài extension, bạn nhấp vào biểu tượng **tiện ích (extension icon)** trên thanh công cụ của trình duyệt để mở popup của extension.
Trong popup vừa mở, hãy dán **API Key** của bạn vào ô **Your client key** rồi bấm ra ngoài để lưu.
Nếu chưa có API Key, hãy đăng nhập tại [omocaptcha.com](https://omocaptcha.com) và lấy API Key trong mục quản lý tài khoản.
## Cách 2. Nhập trực tiếp vào file trong extension
Bấm vào [đây](https://drive.google.com/drive/folders/1) để đến thư mục chứa các extension. Mật khẩu giải nén là `12345`.
Sau khi tải về và giải nén, ta tìm đến file **`configs.json`** trong thư mục extension.
Mở file lên bằng trình soạn thảo văn bản trên máy tính (Notepad, VS Code, Sublime Text…) và tìm tới dòng có văn bản **`YOUR_CLIEN_KEY`**. Thay API Key của bạn vào đó rồi lưu file lại.
Ví dụ trước khi sửa:
```json configs.json theme={null}
{
"api_key": "YOUR_CLIEN_KEY",
"power_on": true,
...
}
```
Sau khi sửa:
```json configs.json theme={null}
{
"api_key": "abc123-your-real-api-key-xyz",
"power_on": true,
...
}
```
Sau khi sửa file `configs.json`, hãy vào `chrome://extensions/` và nhấn nút **tải lại (reload)** ở extension OMOCaptcha để áp dụng thay đổi.
## Cách 3. Nhập qua URL trên trình duyệt
Sau khi cài extension vào trình duyệt, bạn chỉ cần truy cập URL với định dạng như sau — extension sẽ **tự động** nhận và lưu API Key:
```text theme={null}
https://omocaptcha.com/set-key?api_key=YOUR_API_KEY
```
Thay `YOUR_API_KEY` bằng API Key thật của bạn rồi dán vào thanh địa chỉ của trình duyệt.
Khi trang hiển thị **SET KEY OMOCAPTCHA** là bạn đã thiết lập thành công.
Không chia sẻ API Key của bạn cho người khác. Nếu bị lộ, hãy tạo lại API Key mới trong trang quản lý tài khoản.