API 开发文档
🧪 在线测试工具
📖 简介
Dumpipa API 提供了一套完整的 RESTful API,允许开发者通过程序化方式访问平台的所有功能。
✨ 主要特性
- 🔐 安全的 Token 认证机制
- 📱 完整的应用信息查询
- 🚀 自动化任务创建和管理
- 📊 实时任务进度跟踪
- ⚡ 高性能的 API 响应
- 🔄 稳定的版本管理
⚠️ 重要提示
- 请妥善保管您的 API Token,不要泄露给他人
- 所有 API 请求都需要携带有效的 Token
- API 有请求频率限制,请合理使用
- 建议在生产环境使用 HTTPS
🔐 认证方式
所有 API 请求都需要在请求头中携带 API Token 进行认证。
获取 API Token
在 API Token 管理 页面创建一个新的 Token。
⚠️ 重要:创建 Token 时,域名必须填写。该 Token 只能在指定域名下使用,提高安全性。
域名绑定
⚠️ 域名必须填写:创建 Token 时,必须绑定域名。绑定域名后,该 Token 只能在指定域名下使用,提高安全性。
⚠️ 域名验证说明
- 域名必须填写:创建 Token 时,域名是必填项,不能为空
- 浏览器请求:Token 绑定了域名,请求时必须从该域名发起,否则会返回 403 错误
- 服务器端调用:服务器端调用(如分站后端调用主站 API)没有 Origin/Referer 头,系统会根据 Token 绑定的域名进行验证
- 系统自动验证:系统会自动从请求头(Origin 或 Referer)中提取域名进行验证
- 分站系统配置:分站使用的是系统配置的 Token(`main_site_token`),需要绑定分站域名
认证方式
在每个 API 请求的 Header 中添加以下字段:
Authorization: Bearer YOUR_API_TOKEN认证示例
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://www.dumpipa.com/api/auth/me🚀 快速开始
1. 创建 API Token
访问 API Token 管理 页面,创建一个新的 Token。
2. 测试连接
使用以下命令测试 API 连接:
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://www.dumpipa.com/api/auth/me3. 查询应用信息
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
"https://www.dumpipa.com/api/apps/com.tencent.xin?country=cn&limit=5"4. 创建脱壳任务
curl -X POST \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"bundle_id": "com.tencent.xin",
"version": "12345678",
"country": "cn"
}' \
https://www.dumpipa.com/api/tasks📡 API 接口
以下是所有可用的 API 接口列表。
📱 应用接口
通过 Bundle ID 精确匹配获取应用详情
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
bundle_id | String | 是 | 应用的 Bundle ID,例如:com.tencent.xin |
country | String | 否 | 地区代码,默认:cn(支持:cn, us, tw, hk, jp 等) |
limit | Number | 否 | 返回版本数量,默认:5 |
响应示例
{
"ok": 1,
"msg": "操作成功",
"app": {
"trackId": 414478124,
"trackName": "微信",
"bundleId": "com.tencent.xin",
"artistName": "Tencent Technology (Shenzhen) Company Limited",
"artworkUrl100": "https://...",
"version": "8.0.46",
"price": "0.00",
"formattedPrice": "Free",
"fileSizeBytes": 369098752,
"minimumOsVersion": "12.0"
},
"versions": [
{
"version": "12345678",
"display_version": "8.0.46",
"isDumped": true,
"size": "350.23 MB",
"alist_url": "https://..."
}
]
}获取指定应用的详细信息和历史版本列表
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
bundleId | String | 是 | 应用的 Bundle ID,例如:com.tencent.xin |
country | String | 否 | 地区代码,默认:cn(支持:cn, us, tw, hk, jp 等) |
limit | Number | 否 | 返回版本数量,默认:5 |
响应示例
{
"ok": 1,
"msg": "操作成功",
"app": {
"trackId": 414478124,
"trackName": "微信",
"bundleId": "com.tencent.xin",
"artistName": "Tencent Technology (Shenzhen) Company Limited",
"artworkUrl100": "https://...",
"version": "8.0.46",
"price": "0.00",
"formattedPrice": "Free",
"fileSizeBytes": 369098752,
"minimumOsVersion": "12.0"
},
"versions": [
{
"version": "12345678",
"display_version": "8.0.46",
"isDumped": true,
"size": "350.23 MB",
"alist_url": "https://..."
}
]
}搜索应用
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
keyword | String | 是 | 搜索关键词 |
country | String | 否 | 地区代码,默认:cn |
limit | Number | 否 | 返回数量,默认:10,最大:50 |
响应示例
{
"ok": 1,
"msg": "操作成功",
"apps": [
{
"trackId": 414478124,
"trackName": "微信",
"bundleId": "com.tencent.xin",
"artistName": "Tencent Technology...",
"artworkUrl100": "https://...",
"version": "8.0.46"
}
],
"total": 1
}获取推荐应用列表(所有已脱壳版本,按最新完成时间排序)
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
page | Number | 否 | 页码,默认:1 |
page_size | Number | 否 | 每页数量,默认:20,最大:100 |
limit | Number | 否 | 每页数量(兼容参数,等同于 page_size),默认:20 |
响应示例
{
"ok": 1,
"msg": "操作成功",
"apps": [
{
"id": 12345,
"app_name": "微信",
"bundle_id": "com.tencent.xin",
"version": "12345678",
"real_version": "8.0.46",
"display_version": "8.0.46",
"size": 369098752,
"size_formatted": "352.00 MB",
"file_size": "352.00 MB",
"country": "cn",
"icon_url": "https://is1-ssl.mzstatic.com/image/thumb/...",
"last_dump": "2025-11-07 10:30:00"
}
],
"pagination": {
"page": 1,
"page_size": 20,
"total": 1000,
"total_pages": 50
}
}ℹ️ 说明:
- 返回所有已成功脱壳的应用版本
- 按最新完成时间倒序排列
- 每个版本都会显示,不进行去重
- 不包含下载链接字段(需要通过 /api/apps/download-url 接口获取)
获取已脱壳应用的下载链接(自动扣费)
⚠️ 域名验证:此接口需要 Token 绑定域名。分站调用此接口时,Token 必须绑定分站域名,否则会返回 403 错误。
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
bundle_id | String | 是 | 应用的 Bundle ID |
version | String | 是 | 版本号(App Store 发行号) |
country | String | 否 | 地区代码,默认:cn |
响应示例
{
"ok": 1,
"msg": "操作成功",
"download_url": "https://pan.example.com/ipa/xxx.ipa",
"size": "350.23 MB"
}错误响应示例
{
"ok": 0,
"msg": "IPA文件不存在,请先砸壳"
}{
"ok": 0,
"msg": "金币余额不足"
}✅ 自动扣费:
该接口已集成自动扣费功能。登录用户调用此接口时会自动扣除相应的金币,无需单独调用扣费接口。
如果金币不足或达到每日免费次数上限,接口会返回相应的错误信息。
💰 扣费接口(可选)
执行下载或脱壳操作的扣费(可选,现在创建任务和获取下载链接接口已集成自动扣费)
⚠️ 域名验证:此接口需要 Token 绑定域名。分站调用此接口时,Token 必须绑定分站域名,否则会返回 403 错误。
请求体
{
"action": "dump",
"bundle_id": "com.tencent.xin",
"version": "12345678",
"app_name": "微信",
"size_mb": 350.5
}参数说明
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
action | String | 是 | 操作类型:download(下载)或 dump(脱壳) |
bundle_id | String | 是 | 应用的 Bundle ID |
version | String | 是 | 版本号(App Store 发行号) |
app_name | String | 否 | 应用名称(用于记录) |
size_mb | Number | 否 | 应用大小(MB),用于计算金币消耗 |
响应示例(成功)
{
"ok": 1,
"msg": "操作成功",
"cost": 10.5,
"is_free": false,
"message": "砸壳成功,扣除 10.5 金币"
}错误响应示例(金币不足)
{
"ok": 0,
"msg": "金币余额不足"
}ℹ️ 说明:
- 现在推荐直接调用创建任务和获取下载链接接口,这些接口已集成自动扣费功能
- 此接口仍可单独使用,适用于需要先扣费后操作的场景
- 全站免费模式开启时,扣费接口仍可调用,但不会扣除金币
- VIP 用户可能有每日免费次数,超出后才需要扣除金币
🚀 任务接口
创建一个新的脱壳任务(自动扣费)
⚠️ 域名验证:此接口需要 Token 绑定域名。分站调用此接口时,Token 必须绑定分站域名,否则会返回 403 错误。
请求体
{
"bundle_id": "com.tencent.xin",
"app_name": "微信",
"version": "878165911",
"real_version": "8.0.46",
"country": "cn",
"icon_url": "https://is1-ssl.mzstatic.com/image/thumb/Purple112/v4/xxx/xxx.png"
// ⚠️ 注意:size_mb 不能由用户填写传递,系统会自动从缓存或 Apple API 获取
// ⭐ 注意:device_id 为可选参数,不传递时系统会自动分配可用设备
// ⭐ app_name 和 icon_url 为可选参数,如果不传递,系统会尝试从缓存自动获取
}⚠️ 重要提示:
size_mb参数是必填的,但不能由用户填写传递- 系统会自动从以下来源获取应用大小(按优先级):
- 从应用信息缓存中获取(如果之前查询过该应用)
- 从 Apple API 实时获取(如果缓存中没有)
- 如果缓存和 Apple API 都无法获取应用大小,接口将返回错误
- 请求体中不应包含
size_mb字段,系统会自动处理
参数说明
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
bundle_id | String | 是 | 应用的 Bundle ID |
version | String | 是 | 版本号(App Store 发行号) |
country | String | 否 | 地区代码,默认:cn |
app_name | String | 否 | 应用名称(用于记录)。如果不传递,系统会尝试从缓存自动获取 |
icon_url | String | 否 | 应用图标URL。如果不传递,系统会尝试从缓存自动获取 |
real_version | String | 否 | 真实版本号(如 8.0.46),如果已知可以传递 |
size_mb | Number | 是 | 应用大小(MB),用于计算金币消耗。⚠️ 注意:此参数不能由用户填写传递,系统会自动从缓存或 Apple API 获取。如果缓存和 Apple API 都无法获取,接口将返回错误。 |
device_id | Number | 否 | 指定设备 ID(可选)。建议不传递此参数,系统会自动分配可用的在线设备。只有在需要指定特定设备时才传递此参数。 |
响应示例
{
"ok": 1,
"msg": "任务创建成功",
"task_id": 12345,
"status": "queued"
}错误响应示例
{
"ok": 0,
"msg": "金币余额不足"
}✅ 自动扣费:
该接口已集成自动扣费功能。登录用户调用此接口时会自动扣除相应的金币,无需单独调用扣费接口。
如果金币不足或达到每日免费次数上限,接口会返回相应的错误信息。
🔧 自动分配设备:
该接口已集成设备自动分配功能。如果未传递 device_id 参数,系统会自动从可用的在线设备中选择一个设备来执行任务。
只有在需要指定特定设备时才需要传递 device_id 参数,一般情况下建议不传递此参数。
获取全站任务列表(需要认证:管理员可查看所有任务,普通用户只能查看自己的任务)
⚠️ 域名验证:此接口需要 Token 绑定域名。分站调用此接口时,Token 必须绑定分站域名,否则会返回 403 错误。
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
page | Number | 否 | 页码,默认:1 |
page_size | Number | 否 | 每页数量,默认:50,最大:100 |
limit | Number | 否 | 每页数量(兼容参数,等同于 page_size),默认:50 |
include_done | Boolean | 否 | 是否包含已完成的任务,默认:false(只返回 queued 和 running 状态的任务) |
only_mine | Boolean | 否 | 是否只返回当前用户的任务(管理员也适用),默认:false |
响应示例
{
"ok": 1,
"msg": "操作成功",
"tasks": [
{
"id": 12345,
"bundle_id": "com.tencent.xin",
"app_name": "微信",
"version": "12345678",
"real_version": "8.0.46",
"display_version": "8.0.46",
"status": "done",
"progress": 100,
"country": "cn",
"icon_url": "https://...",
"size": 369098752,
"size_formatted": "352.00 MB",
"file_size": "352.00 MB",
"created_at": "2025-11-07 10:30:00",
"updated_at": "2025-11-07 10:45:00"
}
],
"total": 1,
"page": 1,
"page_size": 50
}ℹ️ 说明:
- 管理员可以查看所有任务,普通用户只能查看自己的任务
- 当
include_done=false时,只返回queued和running状态的任务 - 当
include_done=true时,返回所有状态的任务 - 任务按状态优先级排序:running → done → queued → 其他
- ⚠️ 安全提示:为了安全考虑,全站任务列表接口不会返回下载链接(
alist_url字段)。如需获取下载链接,请使用任务详情接口GET /api/tasks/:id(仅限查看自己的任务)或下载链接接口GET /api/apps/download-url
获取当前用户的所有任务列表(需要认证)
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
page | Number | 否 | 页码,默认:1 |
page_size | Number | 否 | 每页数量,默认:10,最大:100 |
响应示例
{
"ok": 1,
"msg": "操作成功",
"tasks": [
{
"id": 12345,
"bundle_id": "com.tencent.xin",
"app_name": "微信",
"version": "12345678",
"real_version": "8.0.46",
"display_version": "8.0.46",
"status": "done",
"progress": 100,
"country": "cn",
"icon_url": "https://...",
"size": 369098752,
"size_formatted": "352.00 MB",
"file_size": "352.00 MB",
"alist_url": "https://...",
"created_at": "2025-11-07 10:30:00",
"updated_at": "2025-11-07 10:45:00"
}
],
"total": 1,
"page": 1,
"page_size": 10
}ℹ️ 说明:
- 此接口只返回当前登录用户创建的任务
- 包含所有状态的任务(queued、running、done、error)
- 任务按创建时间倒序排列(最新的在前)
- ✅ 注意:此接口会返回下载链接(
alist_url字段),因为用户有权查看自己任务的下载链接
获取指定任务的详细信息
请求参数
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
id | Number | 是 | 任务 ID |
响应示例
{
"ok": 1,
"msg": "操作成功",
"task": {
"id": 12345,
"bundle_id": "com.tencent.xin",
"app_name": "微信",
"version": "12345678",
"real_version": "8.0.46",
"country": "cn",
"status": "done",
"progress": 100,
"status_message": "任务完成",
"alist_url": "https://...",
"size": 369098752,
"device_id": 1,
"created_at": "2025-11-07 10:30:00",
"updated_at": "2025-11-07 10:45:00"
}
}👤 用户接口
获取当前用户信息
响应示例
{
"ok": 1,
"msg": "操作成功",
"user": {
"id": 1,
"username": "user123",
"email": "user@example.com",
"coins": 100.00,
"is_vip": true,
"vip_level": 1,
"vip_expires_at": "2025-12-31 23:59:59",
"is_admin": false,
"created_at": "2025-01-01 10:00:00"
}
}❌ 错误码
当 API 请求失败时,响应中会包含错误信息。
错误响应格式
{
"ok": 0,
"msg": "Token 无效或已过期"
}常见错误码
| HTTP 状态码 | 说明 | 解决方案 |
|---|---|---|
400 | 请求参数错误 | 检查请求参数是否正确 |
401 | 未认证或 Token 无效 | 检查 Token 是否正确,是否已过期 |
403 | 权限不足或未扣费 | 检查账户权限或先调用扣费接口 |
400 | 金币余额不足 | 充值金币后再试,或等待免费次数恢复 |
404 | 资源不存在 | 检查请求的资源 ID 是否正确,或先创建脱壳任务 |
429 | 请求过于频繁 | 降低请求频率,等待后重试 |
500 | 服务器内部错误 | 稍后重试,如持续出现请联系客服 |
⏱️ 限流说明
为保证服务稳定,API 实施了请求频率限制。
限流规则
- 普通用户:每分钟最多 60 次请求
- VIP 用户:每分钟最多 120 次请求
- 创建任务:每小时最多 50 次
响应头
每个 API 响应都会包含以下头部信息:
X-RateLimit-Limit: 60 # 每分钟请求限制
X-RateLimit-Remaining: 45 # 剩余请求次数
X-RateLimit-Reset: 1699999999 # 限制重置时间(Unix 时间戳)超过限流
当超过请求限制时,API 会返回 HTTP 429 状态码,并在响应头中包含 Retry-After 字段,表示多少秒后可以重试。
💻 示例代码
Python 示例
import requests
API_TOKEN = "YOUR_API_TOKEN"
BASE_URL = "https://www.dumpipa.com/api"
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
# 获取应用信息
def get_app_info(bundle_id, country="cn"):
url = f"{BASE_URL}/apps/{bundle_id}"
params = {"country": country, "limit": 5}
response = requests.get(url, headers=headers, params=params)
return response.json()
# 创建脱壳任务
def create_task(bundle_id, version, country="cn"):
url = f"{BASE_URL}/tasks"
data = {
"bundle_id": bundle_id,
"version": version,
"country": country
}
response = requests.post(url, headers=headers, json=data)
return response.json()
# 获取任务列表
def get_tasks(page=1, limit=10):
url = f"{BASE_URL}/tasks"
params = {"page": page, "limit": limit}
response = requests.get(url, headers=headers, params=params)
return response.json()
# 示例使用
if __name__ == "__main__":
# 获取微信信息
app_info = get_app_info("com.tencent.xin", "cn")
print(f"应用名称: {app_info['app']['trackName']}")
# 创建任务
task = create_task("com.tencent.xin", "12345678", "cn")
print(f"任务ID: {task['task_id']}")
# 获取任务列表
tasks = get_tasks()
print(f"任务数量: {tasks['total']}")JavaScript (Node.js) 示例
const axios = require('axios');
const API_TOKEN = 'YOUR_API_TOKEN';
const BASE_URL = 'https://www.dumpipa.com/api';
const apiClient = axios.create({
baseURL: BASE_URL,
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json'
}
});
// 获取应用信息
async function getAppInfo(bundleId, country = 'cn') {
try {
const response = await apiClient.get(`/apps/${bundleId}`, {
params: { country, limit: 5 }
});
return response.data;
} catch (error) {
console.error('获取应用信息失败:', error.response?.data || error.message);
throw error;
}
}
// 创建脱壳任务
async function createTask(bundleId, version, country = 'cn') {
try {
const response = await apiClient.post('/tasks', {
bundle_id: bundleId,
version: version,
country: country
});
return response.data;
} catch (error) {
console.error('创建任务失败:', error.response?.data || error.message);
throw error;
}
}
// 获取任务列表
async function getTasks(page = 1, limit = 10) {
try {
const response = await apiClient.get('/tasks', {
params: { page, limit }
});
return response.data;
} catch (error) {
console.error('获取任务列表失败:', error.response?.data || error.message);
throw error;
}
}
// 示例使用
(async () => {
try {
// 获取微信信息
const appInfo = await getAppInfo('com.tencent.xin', 'cn');
console.log('应用名称:', appInfo.app.trackName);
// 创建任务
const task = await createTask('com.tencent.xin', '12345678', 'cn');
console.log('任务ID:', task.task_id);
// 获取任务列表
const tasks = await getTasks();
console.log('任务数量:', tasks.total);
} catch (error) {
console.error('操作失败:', error);
}
})();cURL 示例
# 获取应用信息
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
"https://www.dumpipa.com/api/apps/com.tencent.xin?country=cn&limit=5"
# 创建脱壳任务
curl -X POST \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"bundle_id": "com.tencent.xin",
"version": "12345678",
"country": "cn"
}' \
https://www.dumpipa.com/api/tasks
# 获取任务列表
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
"https://www.dumpipa.com/api/tasks?page=1&limit=10"
# 获取任务详情
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
https://www.dumpipa.com/api/tasks/12345