Partner API
Connect your system to every service line with a single key — every request is a POST (form-urlencoded or JSON), the response is always JSON, and the per-minute quota is shared across all lines
/en/socialup/api/v3
1X-Api-Key: adp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2
3# or
4Authorization: Bearer adp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
1// success
2{ "ok": true, "data": { … }, "request_id": "9f2c1a…" }
3
4// error
5{ "ok": false, "error": { "code": "INVALID_KEY", "message": "Invalid API key" }, "request_id": "9f2c1a…" }
You can call it REST-style by appending the action name to the URL instead of the action field, and action=balance (check balance) works on the endpoint of every service line
🔑 Create an API key — one key works across every service line
Every member can create keys for free (up to 5 per account, cancel one at a time) — log in first, then come back to create one here
Rate limits
Every response includes the X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset headers — use them to self-throttle without waiting to be rejected
| Scope | Limit | When exceeded |
|---|---|---|
| All actions combined (per key) | 120 / min | Returns 429 with RATE_LIMITED and a Retry-After header |
| Charging actions (orders/renewals, all lines combined) | 20 / min | |
| Full catalog fetch (per key) | 12 / min | |
| Failed authentication (per IP address) | 30 / min |
The ordering quota is intentionally lower than the others — if your system loops by mistake, the damage is capped at 20 orders per minute · The catalog should be fetched and cached (it changes only a few times a day). To check the price of a single service, send service=… as well and it will not count against this quota
Social media boosting
Boost followers, likes, views, and comments on every platform — the standard SMM action set that most tools can integrate with right away
1curl -X POST https://adsproth.com/en/socialup/api/v3 \
2 -H "X-Api-Key: adp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
3 -d "action=add" -d "service=12345" \
4 -d "link=https://www.instagram.com/p/abc123" \
5 -d "quantity=1000"
servicesService list & pricing
/en/socialup/api/v3/services
Fetch the list of active services with their real selling prices. You should cache it on your side rather than fetching it before every order.
| Parameter | Required | Description |
|---|---|---|
service |
Optional | Request only a single service by the given ID |
category |
Optional | Filter by category name (must match the whole string) |
limit / offset |
Optional | Pagination; the default returns everything |
1{
2 "ok": true,
3 "data": {
4 "count": 6468,
5 "services": [
6 {
7 "service": 12345,
8 "name": "Instagram Followers [fast]",
9 "category": "Instagram",
10 "type": "default",
11 "rate": "70.00", // selling price per 1,000 units, in THB
12 "currency": "THB",
13 "min": 10,
14 "max": 500000,
15 "dripfeed": true,
16 "refill": true,
17 "cancel": false,
18 "pricing": "quantity", // pricing basis: quantity | lines | package | per_post
19 "fields": ["link", "quantity"] // fields required for add
20 }
21 ]
22 },
23 "request_id": "9f2c…"
24}
balanceWallet balance
/en/socialup/api/v3/balance
The wallet balance for the account that owns the key, read live from the database every time
1{
2 "ok": true,
3 "data": { "balance": "1250.75", "currency": "THB" },
4 "request_id": "9f2c…"
5}
addOrder
/en/socialup/api/v3/add
Create a new order; the wallet is charged immediately on success. The required fields depend on the service type — see the fields value returned by services.
| Parameter | Required | Description |
|---|---|---|
service |
Required | Service ID |
link |
Depends on service type | Post/profile link; must start with http:// or https:// |
quantity |
Depends on service type | Desired amount (must be within the service min–max range) |
comments |
Depends on service type | One comment per line — the number of lines is the quantity charged |
runs / interval |
Optional | Drip-feed mode, available only for services where dripfeed = true (amount charged = quantity × runs) |
username, min, max, posts … |
Depends on service type | Fields specific to types like subscriptions / poll / seo, etc. |
1{
2 "ok": true,
3 "data": {
4 "order": 987654,
5 "service": 12345,
6 "quantity": 1000,
7 "charge": "70.00",
8 "currency": "THB",
9 "balance": "1180.75"
10 },
11 "request_id": "9f2c…"
12}
statusOrder status
/en/socialup/api/v3/status
Query the status of several IDs at once; the system answers only for orders that belong to the key. IDs that are not yours return ORDER_NOT_FOUND, just like IDs that do not exist.
| Parameter | Required | Description |
|---|---|---|
order |
One of | A single order ID |
orders |
One of | Multiple IDs separated by commas, up to 100 per request |
1{
2 "ok": true,
3 "data": {
4 "orders": [
5 {
6 "order": 987654,
7 "service": 12345,
8 "status": "In progress", // Pending|Processing|In progress|Completed|Partial|Canceled|Refunded
9 "status_th": "In progress",
10 "charge": "70.00",
11 "currency": "THB",
12 "quantity": 1000,
13 "start_count": "5230",
14 "remains": "420",
15 "refunded": "0.00",
16 "created_at": "2026-07-22 10:15:03"
17 },
18 { "order": 111, "error": "ORDER_NOT_FOUND" }
19 ]
20 },
21 "request_id": "9f2c…"
22}
cancelCancel an order
/en/socialup/api/v3/cancel
Send a cancellation request to the provider; available only for services where cancel = true and orders that are not finished yet. The refund to your wallet happens later via status tracking, not immediately when you call.
| Parameter | Required | Description |
|---|---|---|
order / orders |
Required | Order IDs, up to 100 per request |
1{
2 "ok": true,
3 "data": {
4 "orders": [
5 { "order": 987654, "accepted": true },
6 { "order": 987655, "error": "NOT_SUPPORTED", "message": "This service does not support cancellation" }
7 ],
8 "dry_run": false
9 },
10 "request_id": "9f2c…"
11}
refillRequest a refill
/en/socialup/api/v3/refill
Available only for services where refill = true and orders already in the Completed or Partial status
| Parameter | Required | Description |
|---|---|---|
order / orders |
Required | Order IDs, up to 100 per request |
1{
2 "ok": true,
3 "data": {
4 "orders": [ { "order": 987654, "accepted": true, "refill": 55231 } ],
5 "dry_run": false
6 },
7 "request_id": "9f2c…"
8}
Rent a number for SMS (OTP)
Rent a temporary number to receive an SMS code — flow: services to pick a platform → countries for pricing/availability → buy to rent → poll status until you get sms_code · can be canceled after the set time, and on timeout (20 minutes) it is refunded in full automatically
1# 1) Rent a number
2curl -X POST https://adsproth.com/en/otp/api/v3/buy -H "X-Api-Key: adp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
3 -d "service=fb" -d "country=52"
4
5# 2) Poll until you get the code (every ~5s)
6curl -X POST https://adsproth.com/en/otp/api/v3/status -H "X-Api-Key: adp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -d "order=OTP2026…"
servicesSupported platforms
/en/otp/api/v3/services
The list of services you can rent a number for (facebook, line, shopee, …); use the service value in the next step
| Parameter | Required | Description |
|---|---|---|
q |
Optional | Search by name |
limit / offset |
Optional | Pagination (limit up to 500) |
1{ "ok": true, "data": { "count": 2, "total": 214, "services": [
2 { "service": "fb", "name": "Facebook" },
3 { "service": "ig", "name": "Instagram" } ] }, "request_id": "…" }
countriesPricing + available numbers per country
/en/otp/api/v3/countries
Prices are read live from the provider (already the selling price) — the same number that will be charged at buy
| Parameter | Required | Description |
|---|---|---|
service |
Required | Service ID from action=services |
1{ "ok": true, "data": { "service": "fb", "count": 1, "countries": [
2 { "country": 52, "name": "Thailand", "iso": "th",
3 "price": "24.00", "currency": "THB", "qty": 1543 } ] }, "request_id": "…" }
buyRent a number (charged)
/en/otp/api/v3/buy
Charges and rents a number immediately; the number lasts 20 minutes — use it to sign up, then poll status until you get the code. If no number is available you get PROVIDER_UNAVAILABLE and are not charged.
| Parameter | Required | Description |
|---|---|---|
service |
Required | Service ID |
country |
Required | Country code from action=countries |
1{ "ok": true, "data": {
2 "order": "OTP20260730123456ABC123",
3 "phone": "66812345678",
4 "charge": "24.00", "currency": "THB",
5 "expired_at": "2026-07-30 12:54:56",
6 "cancel_available_at": "2026-07-30 12:36:56",
7 "balance": "976.00" }, "request_id": "…" }
statusStatus + SMS code
/en/otp/api/v3/status
Poll every ~5 seconds until the status is completed (you get sms_code) or canceled/expired — once it times out the system refunds you in full automatically, nothing more to do.
| Parameter | Required | Description |
|---|---|---|
order |
Required | Rental order ID from buy |
1{ "ok": true, "data": {
2 "order": "OTP20260730123456ABC123",
3 "status": "completed", // waiting | completed | canceled | expired
4 "sms_code": "382914", // null until the code arrives
5 "phone": "66812345678",
6 "expired_at": "2026-07-30 12:54:56",
7 "cancel_available_at": "2026-07-30 12:36:56",
8 "can_cancel": false,
9 "refunded": false }, "request_id": "…" }
cancelCancel + full refund
/en/otp/api/v3/cancel
Can be canceled after cancel_available_at (about 2 minutes after renting) and only if you have not received a code yet. On success, the full amount is refunded to your wallet immediately.
| Parameter | Required | Description |
|---|---|---|
order |
Required | Rental order ID |
1{ "ok": true, "data": { "order": "OTP2026…", "refunded": true, "balance": "1000.00" }, "request_id": "…" }
ordersRental history
/en/otp/api/v3/orders
The latest items for the account that owns the key (SMS codes are shown only for successful items)
| Parameter | Required | Description |
|---|---|---|
limit |
Optional | Number of items, up to 200 (default 50) |
1{ "ok": true, "data": { "count": 1, "orders": [
2 { "order": "OTP2026…", "service": "fb", "name": "Facebook", "country": "Thailand",
3 "phone": "66812345678", "status": "completed", "sms_code": "382914",
4 "charge": "24.00", "currency": "THB", "refunded": false,
5 "created_at": "2026-07-30 12:34:56" } ] }, "request_id": "…" }
Social account sales
Buy ready-made social accounts — pay and get the credentials back immediately in the buy response, and view them again anytime via order
1curl -X POST https://adsproth.com/en/accounts/api/v3/buy -H "X-Api-Key: adp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
2 -d "product=17" -d "qty=2"
categoriesProduct categories
/en/accounts/api/v3/categories
Categories on sale; use the category value to filter in products
1{ "ok": true, "data": { "count": 1, "categories": [ { "category": 3, "name": "Facebook" } ] }, "request_id": "…" }
productsProducts + price + stock
/en/accounts/api/v3/products
Stock changes constantly; always check before ordering
| Parameter | Required | Description |
|---|---|---|
q |
Optional | Search by product name/ID |
category |
Optional | Filter by category |
page |
Optional | The page you want |
1{ "ok": true, "data": { "count": 1, "total": 42, "page": 1, "pages": 2, "products": [
2 { "product": 17, "name": "Facebook 1yr+", "category": "Facebook",
3 "price": "35.00", "currency": "THB", "stock": 120, "min": 1, "max": 50 } ] }, "request_id": "…" }
buyBuy accounts (charged)
/en/accounts/api/v3/buy
Once paid, you get the credentials back immediately in the response — save them right away and view them again via action=order. If the source is out of stock, the system refunds automatically.
| Parameter | Required | Description |
|---|---|---|
product |
Required | Product ID |
qty |
Optional | Quantity (default 1 — must be within min–max) |
1{ "ok": true, "data": {
2 "order": 5011, "count": 2, "charge": "70.00", "currency": "THB",
3 "accounts": [ "[email protected]:pass1:token…", "[email protected]:pass2:token…" ],
4 "balance": "930.00" }, "request_id": "…" }
ordersOrder history
/en/accounts/api/v3/orders
Orders for the account that owns the key (view each order credentials via action=order)
| Parameter | Required | Description |
|---|---|---|
q |
Optional | Search by product name/order ID |
page |
Optional | The page you want |
1{ "ok": true, "data": { "count": 1, "total": 8, "page": 1, "pages": 1, "orders": [
2 { "order": 5011, "product": 17, "name": "Facebook 1yr+", "quantity": 2,
3 "charge": "70.00", "currency": "THB", "status": "completed",
4 "accounts": 2, "created_at": "2026-07-30 12:00:00" } ] }, "request_id": "…" }
orderView credentials of a past order
/en/accounts/api/v3/order
View accounts you have already bought, anytime — only orders that belong to the key are visible
| Parameter | Required | Description |
|---|---|---|
order |
Required | Order ID |
1{ "ok": true, "data": {
2 "order": 5011, "name": "Facebook 1yr+", "quantity": 2,
3 "charge": "70.00", "currency": "THB", "status": "completed",
4 "accounts": [ "[email protected]:pass1:token…" ],
5 "created_at": "2026-07-30 12:00:00" }, "request_id": "…" }
Error codes
This list is generated directly from code constants, so it always matches real behavior — VALIDATION_ERROR includes per-field error.fields · INSUFFICIENT_FUNDS includes charge / balance / short so you can calculate the top-up amount right away
| code | HTTP | Meaning |
|---|---|---|
METHOD_NOT_ALLOWED |
405 | ต้องเรียกด้วยวิธี POST เท่านั้น |
INVALID_BODY |
400 | อ่านเนื้อคำขอไม่ได้ (ต้องเป็น form-urlencoded หรือ JSON) |
MISSING_KEY |
401 | ไม่ได้ส่ง API key มา |
INVALID_KEY |
401 | API key ไม่ถูกต้อง |
KEY_REVOKED |
401 | API key ถูกยกเลิกแล้ว |
KEY_EXPIRED |
401 | API key หมดอายุแล้ว |
ACCOUNT_BLOCKED |
403 | บัญชีถูกระงับการใช้งาน |
API_DISABLED |
503 | ระบบ API ปิดให้บริการชั่วคราว |
UNKNOWN_ACTION |
404 | ไม่รู้จัก action นี้ |
RATE_LIMITED |
429 | เรียกถี่เกินกำหนด กรุณารอแล้วลองใหม่ |
VALIDATION_ERROR |
422 | ข้อมูลที่ส่งมาไม่ถูกต้อง |
SERVICE_NOT_FOUND |
404 | ไม่พบบริการนี้ หรือบริการถูกปิดไปแล้ว |
INSUFFICIENT_FUNDS |
402 | ยอดเงินในกระเป๋าไม่พอ |
DUPLICATE_ORDER |
409 | รายการนี้เพิ่งถูกสั่งไปแล้ว ระบบไม่ได้สั่งซ้ำให้ |
ORDER_NOT_FOUND |
404 | ไม่พบคำสั่งซื้อนี้ในบัญชีของคุณ |
TOO_MANY_IDS |
400 | ส่งเลขคำสั่งซื้อมามากเกินกำหนดต่อหนึ่งคำขอ |
NOT_SUPPORTED |
400 | บริการนี้ไม่รองรับคำสั่งดังกล่าว |
ORDER_DISABLED |
503 | ระบบสั่งซื้อปิดอยู่ชั่วคราว |
FEATURE_DISABLED |
503 | ระบบยกเลิก/ขอเติมยอดยังไม่เปิดใช้งาน |
PROVIDER_ERROR |
502 | ผู้ให้บริการปฏิเสธคำขอ |
PROVIDER_UNAVAILABLE |
503 | ติดต่อผู้ให้บริการไม่ได้ชั่วคราว |
INTERNAL |
500 | ระบบขัดข้อง กรุณาลองใหม่หรือแจ้งแอดมิน |
Rules to know before you integrate
- Automatic duplicate protection — an identical request within 60 seconds returns
DUPLICATE_ORDERand is not charged again - Failed order = automatic refund — if you are charged but the provider rejects it, the system refunds your wallet and logs the history
- Up to 5 keys per account — use a separate key per integration so a leak only needs that one revoked
- Only a fingerprint of the key is stored — if you lose it, it cannot be recovered; revoke it and create a new one
- Every request is logged, both successful and rejected — review them on the My API keys page