Partner API documentation
v3 — connect your system directly to our service catalog

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

Online
POST /en/socialup/api/v3
Authentication — send the key in the request header (recommended) or the key field in the body http
1X-Api-Key: adp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2
3# or
4Authorization: Bearer adp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Never send the key in the query string — URLs are recorded in access logs at every layer; a key leaked that way is leaked for good, so the system deliberately never reads keys from the query string
Response format — decide based on ok and error.code only (message is for humans) json
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

ScopeLimitWhen exceeded
All actions combined (per key)120 / minReturns 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

Live example call curl
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

POST /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.

ParameterRequiredDescription
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
Example response json
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

POST /en/socialup/api/v3/balance

The wallet balance for the account that owns the key, read live from the database every time

Example response json
1{
2  "ok": true,
3  "data": { "balance": "1250.75", "currency": "THB" },
4  "request_id": "9f2c…"
5}

addOrder

POST /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.

ParameterRequiredDescription
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.
Example response json
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

POST /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.

ParameterRequiredDescription
order One of A single order ID
orders One of Multiple IDs separated by commas, up to 100 per request
Example response json
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

POST /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.

ParameterRequiredDescription
order / orders Required Order IDs, up to 100 per request
Example response json
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

POST /en/socialup/api/v3/refill

Available only for services where refill = true and orders already in the Completed or Partial status

ParameterRequiredDescription
order / orders Required Order IDs, up to 100 per request
Example response json
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

Live example call curl
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

POST /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

ParameterRequiredDescription
q Optional Search by name
limit / offset Optional Pagination (limit up to 500)
Example response json
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

POST /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

ParameterRequiredDescription
service Required Service ID from action=services
Example response json
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)

POST /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.

ParameterRequiredDescription
service Required Service ID
country Required Country code from action=countries
Example response json
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

POST /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.

ParameterRequiredDescription
order Required Rental order ID from buy
Example response json
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

POST /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.

ParameterRequiredDescription
order Required Rental order ID
Example response json
1{ "ok": true, "data": { "order": "OTP2026…", "refunded": true, "balance": "1000.00" }, "request_id": "…" }

ordersRental history

POST /en/otp/api/v3/orders

The latest items for the account that owns the key (SMS codes are shown only for successful items)

ParameterRequiredDescription
limit Optional Number of items, up to 200 (default 50)
Example response json
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

Live example call curl
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

POST /en/accounts/api/v3/categories

Categories on sale; use the category value to filter in products

Example response json
1{ "ok": true, "data": { "count": 1, "categories": [ { "category": 3, "name": "Facebook" } ] }, "request_id": "…" }

productsProducts + price + stock

POST /en/accounts/api/v3/products

Stock changes constantly; always check before ordering

ParameterRequiredDescription
q Optional Search by product name/ID
category Optional Filter by category
page Optional The page you want
Example response json
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)

POST /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.

ParameterRequiredDescription
product Required Product ID
qty Optional Quantity (default 1 — must be within min–max)
Example response json
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

POST /en/accounts/api/v3/orders

Orders for the account that owns the key (view each order credentials via action=order)

ParameterRequiredDescription
q Optional Search by product name/order ID
page Optional The page you want
Example response json
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

POST /en/accounts/api/v3/order

View accounts you have already bought, anytime — only orders that belong to the key are visible

ParameterRequiredDescription
order Required Order ID
Example response json
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

codeHTTPMeaning
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_ORDER and 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