Tài liệu này mô tả chi tiết các Open API của hệ thống SerpUpdate dành cho khách hàng tích hợp. Bạn có thể sử dụng các API này để tạo task kiểm tra thứ hạng từ khóa, tra cứu mã địa lý, ngôn ngữ và tự động nhận kết quả qua Webhook.
Thông tin chung
- Base URL:
https://app.serpupdate.com - Phiên bản API: v1.2
1. Quy Trình Sử Dụng
- Gọi API Get Locations và Get Languages để lấy mã
locationCodevàlanguageCode. - Gọi API Create Task với thông tin từ khóa, location, language → nhận về
taskId. - Chờ hệ thống xử lý. Khi có kết quả, hệ thống sẽ gọi Ping Back (Webhook) về server của bạn. Hoặc bạn có thể chủ động gọi API Get Task Result với
taskIdđể lấy kết quả.
2. Xác Thực (Authentication)
Tất cả các request đều yêu cầu gửi kèm API Key trong header. Khách hàng tạo tài khoản trên app.serpupdate.com. API Key được cấp riêng cho từng tài khoản.
Header yêu cầu:
X-API-KEY: <your_api_key>Bảo mật
Tuyệt đối không chia sẻ API Key cho bên thứ ba. Liên hệ bộ phận hỗ trợ nếu cần cấp lại.
3. Cấu Trúc Response Chung
Tất cả các API đều trả về cùng một cấu trúc JSON bao ngoài:
| Trường | Kiểu | Mô tả |
|---|---|---|
isSuccess |
Boolean | Trạng thái tổng thể của request (true/false) |
errorCode |
String | null | Mã lỗi (null nếu thành công) |
message |
String | null | Thông báo chi tiết về lỗi (null nếu thành công) |
content |
Object | null | Dữ liệu trả về (khác nhau tùy API) |
Danh sách Mã Lỗi (Error Codes)
| HTTP | errorCode | Mô tả |
|---|---|---|
| 200 | null |
Thành công |
| 400 | BAD_REQUEST |
Dữ liệu request không hợp lệ (thiếu trường bắt buộc, sai định dạng) |
| 401 | UNAUTHORIZED |
API Key không hợp lệ hoặc không được cung cấp |
| 429 | RATE_LIMIT |
Vượt quá giới hạn số lượng request |
| 500 | INTERNAL_ERROR |
Lỗi hệ thống, vui lòng thử lại sau |
4. Danh Sách Endpoints
API #1: Create Task
Tạo tác vụ kiểm tra thứ hạng từ khóa trên công cụ tìm kiếm. Mỗi request có thể gửi nhiều từ khóa cùng lúc.
Endpoint: POST /api/v1/open-api/create-task
Request Body
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
deviceCode |
String | ✔ Có | Mã thiết bị. VD: desktop, mobile, tablet |
locationCode |
Number | ✔ Có | Mã vùng địa lý (lấy từ API Get Locations) |
languageCode |
String | ✔ Có | Mã ngôn ngữ (lấy từ API Get Languages). VD: vi, en |
searchEngineCode |
String | ✔ Có | Mã công cụ tìm kiếm. VD: GOOGLE, BING |
keywords |
Array | ✔ Có | Danh sách từ khóa cần kiểm tra (xem bảng Keyword Object) |
Keyword Object
| Tham số | Kiểu | Bắt buộc | Mô tả |
|---|---|---|---|
cstmKeywordId |
String | ✔ Có | Mã từ khóa do khách hàng tự định nghĩa (để đối chiếu kết quả) |
keyword |
String | ✔ Có | Từ khóa cần kiểm tra thứ hạng |
Response — content.tasks[]
| Trường | Kiểu | Mô tả |
|---|---|---|
taskId |
Number | ID của task (dùng cho API Get Task Result hoặc nhận qua Ping Back) |
cstmKeywordId |
String | Mã từ khóa do khách hàng gửi lên |
keyword |
String | Từ khóa đã gửi |
isSuccess |
Boolean | Trạng thái tạo task cho từ khóa này (true/false) |
Ví dụ cURL & Response
curl --location 'https://app.serpupdate.com/api/v1/open-api/create-task'
--header 'X-API-KEY: <your_api_key>'
--header 'Content-Type: application/json'
--data '{
"deviceCode": "desktop",
"locationCode": 2704,
"languageCode": "vi",
"searchEngineCode": "GOOGLE",
"keywords": [
{ "cstmKeywordId": "1", "keyword": "Dien thoai gia re" },
{ "cstmKeywordId": "2", "keyword": "Dien thoai dep" }
]
}'{
"errorCode": null,
"content": {
"tasks": [
{ "taskId": 4, "cstmKeywordId": "1", "keyword": "Dien thoai gia re", "isSuccess": true },
{ "taskId": 5, "cstmKeywordId": "2", "keyword": "Dien thoai dep", "isSuccess": true }
]
},
"message": null,
"isSuccess": true
}API #2: Get Locations
Tra cứu danh sách địa điểm (location) hỗ trợ bởi hệ thống. Kết quả có phân trang và hỗ trợ tìm kiếm mở theo tên.
Endpoint: POST /api/v1/open-api/locations
Request Body
| Tham số | Kiểu | Mô tả |
|---|---|---|
name |
String | Tùy chọn. Tên địa điểm cần tìm (VD: “Ho Chi” → “Ho Chi Minh,Vietnam”) |
page |
Number | Tùy chọn. Số trang (bắt đầu từ 0). Mặc định: 0 |
size |
Number | Tùy chọn. Số kết quả mỗi trang. Mặc định: 10 |
Response — content.content[] (Location Object)
| Trường | Kiểu | Mô tả |
|---|---|---|
locationCode |
Number | Mã địa điểm (dùng cho locationCode trong Create Task) |
locationName |
String | Tên địa điểm. VD: “Vietnam”, “An Giang,Vietnam” |
locationCodeParent |
Number | null | Mã địa điểm cha (null nếu là quốc gia) |
countryIsoCode |
String | Mã quốc gia ISO (VN, US, JP, …) |
locationType |
String | Loại: Country, Province, City, … |
Ví dụ Response
{
"errorCode": null,
"content": {
"content": [
{
"locationCode": 2704,
"locationName": "Vietnam",
"locationCodeParent": null,
"countryIsoCode": "VN",
"locationType": "Country"
}
],
"totalElements": 245,
"totalPages": 25,
"numberOfElements": 10
},
"message": null,
"isSuccess": true
}API #3: Get Languages
Lấy danh sách mã ngôn ngữ được hỗ trợ. Không cần truyền tham số.
Endpoint: POST /api/v1/open-api/languages
curl --location --request POST 'https://app.serpupdate.com/api/v1/open-api/languages'
--header 'X-API-KEY: <your_api_key>'
--header 'Content-Type: application/json'
--data ''API #4: Get Task Result
Lấy kết quả thứ hạng SERP của một task đã tạo thông qua taskId.
Endpoint: POST /api/v1/open-api/task-result
Request Body
Cần truyền vào tham số bắt buộc: { "taskId": 4 }
Response — content
| Trường | Kiểu | Mô tả |
|---|---|---|
taskId |
Number | ID của task |
serpItems |
Array | Danh sách kết quả SERP (SerpItem Object) |
aiOverview |
Object | null | Nội dung AI Overview từ Google (AiOverview Object). Null nếu không có. |
SerpItem Object (serpItems)
| Trường | Kiểu | Mô tả |
|---|---|---|
rank |
Number | Thứ hạng của kết quả trên trang SERP (1, 2, 3…) |
url |
String | URL đầy đủ của kết quả |
domain |
String | Tên miền. VD: “tiki.vn” |
title |
String | Tiêu đề của kết quả |
description |
String | Mô tả snippet của kết quả |
AiOverview Object
| Trường | Kiểu | Mô tả |
|---|---|---|
markdown |
String | Nội dung AI Overview dạng Markdown |
references |
Array | Danh sách nguồn tham chiếu (cùng cấu trúc SerpItem Object) |
Ví dụ Response
{
"errorCode": null,
"content": {
"taskId": 4,
"serpItems": [
{
"rank": 1,
"url": "https://www.thegioididong.com/dtdd",
"domain": "thegioididong.com",
"title": "Dien thoai gia re - The Gioi Di Dong",
"description": "Danh sach dien thoai gia re..."
}
],
"aiOverview": {
"markdown": "## Dien thoai gia re tot nhat...",
"references": [
{ "rank": 1, "url": "https://...", "domain": "...", "title": "...", "description": "..." }
]
}
},
"message": null,
"isSuccess": true
}Nếu task chưa hoàn thành, serpItems có thể rỗng. Hãy thử lại sau hoặc dùng Webhook Ping Back để nhận thông báo tự động.
API #5: Ping Back (Webhook)
Thay vì liên tục chủ động gọi Get Task Result, bạn có thể đăng ký một Endpoint (URL Callback) với đội ngũ SerpUpdate.
Ngay khi task hoàn thành, hệ thống sẽ tự động gọi HTTP POST truyền kết quả về Server của bạn.
Yêu cầu phía Server của bạn
- Cung cấp một endpoint HTTP POST có thể nhận JSON body.
- Endpoint phải trả về HTTP
200 OKđể xác nhận đã nhận dữ liệu. Nếu không, hệ thống có thể thử lại (retry).
Payload hệ thống gửi cho bạn
Dữ liệu JSON gửi trực tiếp đến bạn có cấu trúc chính xác như phần content của API Get Task Result.
POST https://your-server.com/your-callback-endpoint
Content-Type: application/json
{
"taskId": 4,
"serpItems": [
{
"rank": 1,
"url": "https://...",
"domain": "...",
"title": "...",
"description": "..."
}
],
"aiOverview": {
"markdown": "## ...",
"references": []
}
}Ví dụ xử lý (Java Spring Boot)
@PostMapping("/your-callback-endpoint")
public ResponseEntity receivePingBack(@RequestBody TaskOpenApiResponse payload) {
// Xử lý dữ liệu: payload.getTaskId(), payload.getSerpItems()...
log.info("Received task result: {}", payload);
// Trả về 200 OK để hệ thống ghi nhận thành công
return ResponseEntity.ok().build();
}
