Skip to main content
BShop Wholesale API v1

Robux Wholesale API & Developer Docs

High-throughput REST API for approved dealers, gaming marketplaces, and bots. Programmatically quote live Robux prices, place bulk orders, check Roblox payout eligibility, and manage wallet balance.

Production API
https://api.bshopmyanmar.com
Staging / Sandbox
https://staging-api.bshopmyanmar.com

1. Overview & Architecture

The BShop Wholesale API provides programmatic access to our instant automated delivery engine. Build automated gaming stores, Discord/Telegram bots, or bulk fulfillment pipelines with verified Roblox group security and pre-loaded wallet payments.

Pre-Loaded MMK Wallet

Zero slip verification latency. Pre-fund your MMK dealer wallet and dispatch orders programmatically with automated balance debits.

Live Tier-Based Quoting

Real-time MMK quote calculation reflecting your dealer volume tier. Know exact wholesale costs before submitting orders.

Roblox 15-Day Hold Pre-Check

Verify recipient group membership and hold cooldown status ahead of time to guarantee 100% order payout success.

Automated Payout Engine

Orders stream directly into BShop's 24/7 automated delivery orchestrator for zero-human-touch payouts.

2. Account Registration & Wholesale Access

Get started with zero friction. BShop uses instant Telegram-native registration with no forms, passwords, or SMS verification codes. Once approved as a wholesale dealer, you unlock dealer pricing tiers, automated wallet billing, and programmatic developer API access.

Partner Onboarding Guide

How to Register & Apply for Wholesale Dealer Access

Designed for gaming shops, independent sellers, community marketplaces, and automated bots.

1

1. Instant Account Registration

Launch @bshopautobot on Telegram or visit app.bshopmyanmar.com. Your BShop account is created automatically linked to your Telegram profile. No password or email verification required.

2

2. Submit Wholesale Dealer Application

Apply via any of the 3 channels below: send /reseller_apply [shop name] in the Telegram bot, or contact our team directly at @BshopByBlanky with your store details and expected monthly volume.

3

3. Fast Admin Review & Tier Activation

Our partner support team reviews applications promptly. Once approved, your account status is updated to Approved Dealer (reseller_status: approved) and assigned your wholesale tier.

4

4. Unlock Wholesale Mode & Get API Keys

Switch to Wholesale Mode via the top header toggle in BShop. Pre-fund your MMK balance via KBZPay, WavePay, or AYA Pay in the Wallet tab, and proceed to Section 3 to retrieve your API Key and Secret.

Telegram Bot Command
/reseller_apply [Shop Name] [Volume]

Type directly in @bshopautobot chat. Dispatched instantly to our admin management queue.

Direct Admin Chat
Telegram: @BshopByBlanky

1-on-1 onboarding assistance and custom high-volume tier setup with @BshopByBlanky.

MiniApp / Webapp In-App
app.bshopmyanmar.com

Submit in-app request via the Profile or Support screen inside BShop MiniApp.

3. Authentication & Security

All Wholesale endpoints authenticate requests via secret dealer credentials. Pass your API key in every request using either the X-Wholesale-Key custom header or the standard Authorization: Bearer <key> header. Sensitive mutating operations (such as automated balance deductions) require the X-Wholesale-Secret companion header.

Keep Your API Key & Secret Confidential

Your API credentials have direct authorization to debit your MMK wallet balance. Never expose them in client-side code, public repositories, or browser scripts. Only invoke the API from secure server environments.

MiniApp & Webapp Setup

How to Get Your API Credentials (MiniApp / Webapp)

Approved wholesale dealers can view, copy, and rotate developer credentials directly inside BShop without writing any code.

1

1. Open BShop MiniApp or Webapp

Launch @bshopautobot in Telegram or visit app.bshopmyanmar.com.

2

2. Switch to Wholesale Mode

Ensure Wholesale Shopping Mode is active. (Requires approved dealer status; see Section 2: Account & Wholesale Access if you have not applied yet). If you are in Consumer Mode, tap the mode toggle button at the top header.

3

3. Go to Wallet → Developer API Credentials

Navigate to the Wallet tab and locate the Developer API Credentials card.

4

4. Generate & 1-Click Copy Your Keys

Tap Generate API Credentials (if first time). Tap the eye icon to unmask, then tap the copy buttons for your API Key (bshop_ws_...) and API Secret (bshop_sec_...).

5

5. Rotate Credentials Anytime

Rotate credentials anytime using the Rotate Credentials button with instant confirmation. Your previous keys will stop working immediately for safety.

Wholesale API Key
X-Wholesale-Key: bshop_ws_...

Used for read queries, live Robux rates, quoting, stock checks, and Roblox group pre-checks.

Wholesale API Secret
X-Wholesale-Secret: bshop_sec_...

Required for sensitive operations: placing orders, debiting wallet balances, and automated batch payouts.

Quick Authentication Verification
curl -s -X GET "https://api.bshopmyanmar.com/api/wholesale/robux/rate" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY" \
  -H "Accept: application/json"

How to Get Your First Key vs. Programmatic Endpoints

API credentials cannot be generated anonymously via public cURL commands because issuing keys requires verified Telegram account authentication. To obtain your initial credentials, open the BShop MiniApp or WebApp and click Generate Credentials under Wallet > Wholesale API & Security as shown in the guide above. Once you hold an active key, you can use the endpoints below to inspect/verify key validity (GET /api/wholesale/key) or rotate keys programmatically (POST /api/wholesale/key/generate).

GET /api/wholesale/key
HTTP 200

Inspect & Verify API Credentials

Validate an active wholesale API key, inspect companion secret presence, and review allowed IP addresses. (Note: Initial key generation is performed in the MiniApp / WebApp Wallet UI).

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Existing dealer API key to verify (or active WebApp session)
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/key" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/key", headers=headers)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/key', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "user_id": 8599999,
    "has_key": true,
    "api_key": "bshop_ws_Qcq6P5kTGo80qeEbVNlv1T2JM2E1n2aYr3Ac2W1iw4c",
    "masked_key": "bshop_ws_Qcq...iw4c",
    "has_secret": true,
    "api_secret": "bshop_sec_9uV2mK8pL1xR4tN9wY1aZ5bC6dE3fG0hJ2kL4mP6qRs",
    "masked_secret": "bshop_sec_9uV...qRs"
  }
}
POST /api/wholesale/key/generate
HTTP 200

Rotate API Credentials

Programmatically rotate active wholesale credentials. Generates a new cryptographic key and companion secret, immediately invalidating old ones.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Current active dealer API key to rotate (or active WebApp session)
curl -X POST "https://api.bshopmyanmar.com/api/wholesale/key/generate" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}

response = requests.post("https://api.bshopmyanmar.com/api/wholesale/key/generate", headers=headers)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/key/generate', {
  method: 'POST',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "user_id": 8599999,
    "api_key": "bshop_ws_7xK8pLmQ2vR4tN9wY1aZ5bC6dE3fG0hJ",
    "api_secret": "bshop_sec_3kM8vP1xR4tN9wY1aZ5bC6dE3fG0hJ2kL4mP6qRsTuV",
    "action": "generated",
    "note": "Store this key and secret safely. You can pass X-Wholesale-Key or Authorization: Bearer  in requests."
  }
}

Robux Pricing & Quoting

Fetch the current wholesale rate in Myanmar Kyats (MMK) per Robux according to your dealer tier, or generate an exact quote before placing orders.

GET /api/wholesale/robux/rate
HTTP 200

Get Wholesale Robux Rate

Fetch the active wholesale unit rate in MMK per Robux according to your dealer tier.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/robux/rate" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/robux/rate", headers=headers)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/robux/rate', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "tier_id": 1,
    "tier_name": "Bronze",
    "unit_rate_mmk": 28.5,
    "currency": "MMK",
    "min_order_robux": 100
  }
}
POST /api/wholesale/robux/quote
HTTP 200

Calculate Robux Price Quote

Calculate total MMK cost and verify if dealer wallet balance is sufficient for checkout.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key
Content-Type string Required application/json
curl -X POST "https://api.bshopmyanmar.com/api/wholesale/robux/quote" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "amount_robux": 1000,
  "recipients": [
    {
      "username": "Player1",
      "amount_robux": 500
    },
    {
      "username": "Player2",
      "amount_robux": 500
    }
  ]
}'
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}
payload = {
    "amount_robux": 1000,
    "recipients": [
        {
            "username": "Player1",
            "amount_robux": 500
        },
        {
            "username": "Player2",
            "amount_robux": 500
        }
    ]
}

response = requests.post("https://api.bshopmyanmar.com/api/wholesale/robux/quote", headers=headers, json=payload)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/robux/quote', {
  method: 'POST',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "amount_robux": 1000,
    "recipients": [
        {
            "username": "Player1",
            "amount_robux": 500
        },
        {
            "username": "Player2",
            "amount_robux": 500
        }
    ]
}),
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "total_robux": 1000,
    "unit_rate_mmk": 28.5,
    "total_amount_mmk": 28500.0,
    "dealer_balance_mmk": 500000.0,
    "can_pay_with_balance": true,
    "dealer_tier": "Bronze"
  }
}

Wholesale Robux Orders

Submit single or multi-recipient batch orders. When pay_with_balance is true, your pre-loaded MMK wallet balance is automatically debited, and order recipients are dispatched to the automated payout queue.

POST /api/wholesale/robux/order
HTTP 200

Place Wholesale Robux Order

Submit a single or multi-recipient batch order (up to 200 recipients). Strictly requires X-Wholesale-Secret. Supports X-Idempotency-Key for network retry deduplication.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Dealer API key
X-Wholesale-Secret string Required Companion secret required for mutating balance-debiting orders
X-Idempotency-Key string Optional Unique request UUID to prevent duplicate orders on connection timeouts
Content-Type string Required application/json
curl -X POST "https://api.bshopmyanmar.com/api/wholesale/robux/order" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY" \
  -H "X-Wholesale-Secret: bshop_sec_YOUR_SECRET" \
  -H "X-Idempotency-Key: idemp_unique_order_uuid_12345" \
  -H "Content-Type: application/json" \
  -d '{
  "recipients": [
    {
      "username": "PlayerAlpha",
      "amount_robux": 500
    },
    {
      "username": "PlayerBeta",
      "amount_robux": 1000
    }
  ],
  "pay_with_balance": true,
  "validate_eligibility": true,
  "notes": "Store Order #9021"
}'
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
API_SECRET = "bshop_sec_YOUR_SECRET"
IDEMPOTENCY_KEY = "idemp_unique_order_uuid_12345"
headers = {
    "X-Wholesale-Key": API_KEY,
    "X-Wholesale-Secret": API_SECRET,
    "X-Idempotency-Key": IDEMPOTENCY_KEY,
    "Content-Type": "application/json",
}
payload = {
    "recipients": [
        {
            "username": "PlayerAlpha",
            "amount_robux": 500
        },
        {
            "username": "PlayerBeta",
            "amount_robux": 1000
        }
    ],
    "pay_with_balance": true,
    "validate_eligibility": true,
    "notes": "Store Order #9021"
}

response = requests.post("https://api.bshopmyanmar.com/api/wholesale/robux/order", headers=headers, json=payload)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';
const API_SECRET = 'bshop_sec_YOUR_SECRET';
const IDEMPOTENCY_KEY = 'idemp_unique_order_uuid_12345';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/robux/order', {
  method: 'POST',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'X-Wholesale-Secret': API_SECRET,
    'X-Idempotency-Key': IDEMPOTENCY_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "recipients": [
        {
            "username": "PlayerAlpha",
            "amount_robux": 500
        },
        {
            "username": "PlayerBeta",
            "amount_robux": 1000
        }
    ],
    "pay_with_balance": true,
    "validate_eligibility": true,
    "notes": "Store Order #9021"
}),
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "order_number": "ORD-20260904-2DDF3DED",
    "order_id": 4901,
    "status": "processing",
    "total_robux": 1500,
    "total_amount_mmk": 42750.0,
    "unit_rate_mmk": 28.5,
    "payment_method": "Balance",
    "balance_deducted_mmk": 42750.0,
    "new_balance_mmk": 457250.0,
    "recipients_count": 2,
    "recipients": [
      {
        "id": 155,
        "recipient_username": "PlayerAlpha",
        "amount_robux": 500,
        "unit_price_mmk": 28.5,
        "line_total_mmk": 14250.0,
        "status": "pending"
      },
      {
        "id": 156,
        "recipient_username": "PlayerBeta",
        "amount_robux": 1000,
        "unit_price_mmk": 28.5,
        "line_total_mmk": 28500.0,
        "status": "pending"
      }
    ],
    "eligibility_summary": {
      "total": 2,
      "eligible": 2,
      "ineligible": 0
    }
  }
}
GET /api/wholesale/robux/orders
HTTP 200

List Wholesale Orders

Retrieve recent wholesale orders for this dealer account.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key

Query Parameters

Parameter Type Required Description
limit integer Optional Max orders (1-100, default: 50)
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/robux/orders" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/robux/orders", headers=headers)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/robux/orders', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "orders": [
      {
        "order_number": "ORD-20260904-2DDF3DED",
        "status": "processing",
        "total_amount_mmk": 42750.0,
        "balance_deducted_mmk": 42750.0,
        "payment_method": "Balance",
        "is_batch_split": true,
        "created_at": "2026-09-04 16:27:09.526216+00:00"
      }
    ]
  }
}
GET /api/wholesale/robux/orders/{order_number}
HTTP 200

Get Order & Recipient Details

Fetch order details and individual payout delivery progress for each recipient.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key

Query Parameters

Parameter Type Required Description
order_number string Required Order number (e.g. ORD-20260904-2DDF3DED)
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/robux/orders/{order_number}?order_number=example" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}
params = {
    "order_number": "Builderman",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/robux/orders/{order_number}", headers=headers, params=params)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/robux/orders/{order_number}?order_number=Builderman', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "order_number": "ORD-20260904-2DDF3DED",
    "status": "processing",
    "total_amount_mmk": 42750.0,
    "payment_method": "Balance",
    "created_at": "2026-09-04T16:27:09.526216+00:00",
    "is_batch_split": true,
    "recipients": [
      {
        "id": 155,
        "recipient_username": "PlayerAlpha",
        "roblox_user_id": 12345678,
        "amount_robux": 500,
        "unit_price_mmk": 28.5,
        "line_total_mmk": 14250.0,
        "status": "completed",
        "error_message": null
      }
    ]
  }
}

Roblox Payout Eligibility

Roblox requires recipients to be members of the payout group for at least 15 continuous days before payouts can be issued. Use these endpoints to verify recipient status in advance.

GET /api/wholesale/eligibility/check
HTTP 200

Check Single Roblox Account

Verify Roblox username existence, numeric User ID, group membership, and 15-day hold cooldown.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key

Query Parameters

Parameter Type Required Description
username string Required Roblox username
group_key string Optional Specific payout group key (optional)
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/eligibility/check?username=example" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}
params = {
    "username": "Builderman",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/eligibility/check", headers=headers, params=params)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/eligibility/check?username=Builderman', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "username": "builderman",
    "roblox_user_id": 156,
    "status": "eligible",
    "is_eligible": true,
    "is_member": true,
    "in_cooldown": false,
    "reason": "Account is eligible for instant Robux payout",
    "target_group": {
      "group_id": "12345678",
      "group_name": "BShop Alpha Vault",
      "join_url": "https://www.roblox.com/groups/12345678"
    }
  }
}
POST /api/wholesale/eligibility/batch
HTTP 200

Batch Check Multiple Accounts

Bulk pre-flight scan for multiple recipient usernames via JSON list or multi-line text.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key
Content-Type string Required application/json
curl -X POST "https://api.bshopmyanmar.com/api/wholesale/eligibility/batch" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "recipients": [
    {
      "username": "Builderman",
      "amount_robux": 500
    },
    {
      "username": "RobloxPlayer",
      "amount_robux": 1000
    }
  ],
  "text": null
}'
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}
payload = {
    "recipients": [
        {
            "username": "Builderman",
            "amount_robux": 500
        },
        {
            "username": "RobloxPlayer",
            "amount_robux": 1000
        }
    ],
    "text": null
}

response = requests.post("https://api.bshopmyanmar.com/api/wholesale/eligibility/batch", headers=headers, json=payload)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/eligibility/batch', {
  method: 'POST',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "recipients": [
        {
            "username": "Builderman",
            "amount_robux": 500
        },
        {
            "username": "RobloxPlayer",
            "amount_robux": 1000
        }
    ],
    "text": null
}),
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "all_eligible": true,
    "summary": {
      "total": 2,
      "eligible": 2,
      "ineligible": 0
    },
    "results": [
      {
        "username": "builderman",
        "amount_robux": 500,
        "roblox_user_id": 156,
        "status": "eligible",
        "reason": null
      },
      {
        "username": "robloxplayer",
        "amount_robux": 1000,
        "roblox_user_id": 98765432,
        "status": "eligible",
        "reason": null
      }
    ],
    "excluded_clipboard_text": ""
  }
}

Payout Groups & Requirements

Retrieve active Roblox payout groups, join links, current group stock, and policy instructions for your customers.

GET /api/wholesale/group-requirements
HTTP 200

Get Active Payout Groups

List active payout groups, direct join URLs, and policy guidelines.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/group-requirements" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/group-requirements", headers=headers)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/group-requirements', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "requirements": {
      "min_membership_days": 15,
      "policy": "Roblox requires accounts to remain in the group for 15 continuous days before group funds can be paid out.",
      "instructions": [
        "1. Click the group join URL and join the Roblox group.",
        "2. Maintain group membership for at least 15 days.",
        "3. Once 15 days elapse, accounts become permanently eligible for instant Robux payouts."
      ]
    },
    "groups": [
      {
        "group_key": "1",
        "group_id": "34567890",
        "group_name": "BShop Primary Vault",
        "join_url": "https://www.roblox.com/groups/34567890",
        "min_holding_days": 15,
        "balance_robux": 150000
      }
    ]
  }
}

Wallet Balance & Ledger

Check your spendable wallet balance, view shop Robux inventory, and inspect your immutable top-up and debit transaction ledger.

GET /api/wholesale/balance
HTTP 200

Get Wallet Balance & Shop Stock

Check dealer's spendable MMK balance and shop's total available Robux stock across all groups.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/balance" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/balance", headers=headers)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/balance', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "dealer": {
      "user_id": 8599999,
      "username": "dealer_8599999",
      "tier_id": 1,
      "tier_name": "Bronze",
      "unit_rate_mmk": 28.5,
      "balance_mmk": 500000.0,
      "locked_balance_mmk": 0.0,
      "lifetime_deposited_mmk": 1000000.0,
      "lifetime_spent_mmk": 500000.0,
      "updated_at": "2026-09-04 16:21:30+00:00"
    },
    "stock": {
      "total_available_robux": 1382062,
      "groups": [
        {
          "key": "1",
          "name": "BShop Primary Vault",
          "balance_robux": 150000,
          "sellable_robux": 149999
        }
      ]
    }
  }
}
GET /api/wholesale/balance/transactions
HTTP 200

Get Balance Transaction Ledger

Inspect immutable ledger entries for top-ups, order deductions, and auto-refunds.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Secret dealer API key

Query Parameters

Parameter Type Required Description
limit integer Optional Max records (1-100, default: 50)
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/balance/transactions" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/balance/transactions", headers=headers)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/balance/transactions', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "transactions": [
      {
        "id": 169,
        "amount_mmk": 42750.0,
        "balance_before_mmk": 500000.0,
        "balance_after_mmk": 457250.0,
        "type": "order_debit",
        "reference_id": "ORD-20260904-2DDF3DED",
        "notes": "Wholesale Robux Order #ORD-20260904-2DDF3DED (1,500 R$)",
        "created_at": "2026-09-04 16:27:09+00:00"
      },
      {
        "id": 168,
        "amount_mmk": 500000.0,
        "balance_before_mmk": 0.0,
        "balance_after_mmk": 500000.0,
        "type": "topup",
        "reference_id": "TOP-10294",
        "notes": "Dealer Wallet Top-Up (KBZPay)",
        "created_at": "2026-09-04 16:19:47+00:00"
      }
    ]
  }
}

Security, Rate Limits & IP Whitelist

Strict financial privilege separation with X-Wholesale-Secret, sliding-window rate limiting (10 req/min for orders, 30 req/min for eligibility, 60 req/min for quotes), timing attack protection, and dealer IP allowlisting. Configure your trusted server IPs easily via MiniApp UI (Wallet -> Wholesale API & Security) or programmatically via REST API, with built-in mobile session safeguards and CLI testing support.

IP Whitelist & Security Guide

How to Configure IP Whitelist & Rate Limits

Protect your pre-loaded wallet and automated ordering endpoints against credential leakage by restricting API access to trusted server IPs.

Method 1: In-App MiniApp / WebApp UI

Open BShop MiniApp or WebApp and navigate to Wallet > Wholesale API & Security. In the Allowed IP Whitelist field, enter your server IP or CIDR addresses (e.g. 198.51.100.42, 203.0.113.0/24) and click Save Allowed IPs. Updates take effect immediately.

Wallet > Wholesale API > Allowed IP Whitelist
Method 2: Programmatic REST API

Send a POST /api/wholesale/security/allowed-ips request passing headers X-Wholesale-Key and X-Wholesale-Secret with body {"allowed_ips": ["198.51.100.42"]}. To allow all IPs again, send an empty array {"allowed_ips": []}.

POST /api/wholesale/security/allowed-ips

Mobile Session Safeguard — Zero Lockout Guarantee

When managing your wallet or inspecting orders from your mobile phone (Telegram MiniApp or WebApp), your dynamic cellular IP will NEVER be locked out. IP allowlists are strictly enforced only on server-to-server bot requests authenticating via API Key and Secret.

Official Partner CLI Testing Tool

Test your integration instantly using our zero-dependency Python script scripts/test_wholesale_client.py. Use Option 11 to inspect detected public IP and active allowlists, or Option 12 to interactively update allowed IPs. Run with python3 scripts/test_wholesale_client.py --all to execute the full automated test suite, or download the standalone file directly below.

Quick Download & Run (Terminal cURL)
curl -sSL https://staging-api.bshopmyanmar.com/scripts/test_wholesale_client.py -o test_wholesale_client.py
python3 test_wholesale_client.py --all
GET /api/wholesale/security/status
HTTP 200

Get Security Posture & Rate Limits

Inspect active security settings, dealer allowed IP whitelist, client IP, and rate limit quotas.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Dealer API key
curl -X GET "https://api.bshopmyanmar.com/api/wholesale/security/status" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY"
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
headers = {
    "X-Wholesale-Key": API_KEY,
    "Content-Type": "application/json",
}

response = requests.get("https://api.bshopmyanmar.com/api/wholesale/security/status", headers=headers)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/security/status', {
  method: 'GET',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'Content-Type': 'application/json',
  },
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "user_id": 8599999,
    "has_key": true,
    "has_secret": true,
    "allowed_ips": [
      "198.51.100.42",
      "203.0.113.0/24"
    ],
    "client_ip": "198.51.100.42",
    "auth_type": "key",
    "rate_limits": {
      "orders": "10 req / 60s",
      "eligibility": "30 req / 60s",
      "quotes": "60 req / 60s",
      "general": "120 req / 60s"
    }
  }
}
POST /api/wholesale/security/allowed-ips
HTTP 200

Update Allowed IP Whitelist

Configure trusted IPv4/IPv6 addresses or CIDR subnets allowed to access wholesale endpoints. Strictly requires X-Wholesale-Secret.

Request Headers

Header Type Required Description
X-Wholesale-Key string Required Dealer API key
X-Wholesale-Secret string Required Secret required to modify IP whitelist
Content-Type string Required application/json
curl -X POST "https://api.bshopmyanmar.com/api/wholesale/security/allowed-ips" \
  -H "X-Wholesale-Key: bshop_ws_YOUR_SECRET_KEY" \
  -H "X-Wholesale-Secret: bshop_sec_YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
  "allowed_ips": [
    "198.51.100.42",
    "203.0.113.0/24"
  ]
}'
import requests

API_KEY = "bshop_ws_YOUR_SECRET_KEY"
API_SECRET = "bshop_sec_YOUR_SECRET"
headers = {
    "X-Wholesale-Key": API_KEY,
    "X-Wholesale-Secret": API_SECRET,
    "Content-Type": "application/json",
}
payload = {
    "allowed_ips": [
        "198.51.100.42",
        "203.0.113.0/24"
    ]
}

response = requests.post("https://api.bshopmyanmar.com/api/wholesale/security/allowed-ips", headers=headers, json=payload)
data = response.json()
print("Status:", response.status_code)
print("Response:", data)
const API_KEY = 'bshop_ws_YOUR_SECRET_KEY';
const API_SECRET = 'bshop_sec_YOUR_SECRET';

const response = await fetch('https://api.bshopmyanmar.com/api/wholesale/security/allowed-ips', {
  method: 'POST',
  headers: {
    'X-Wholesale-Key': API_KEY,
    'X-Wholesale-Secret': API_SECRET,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "allowed_ips": [
        "198.51.100.42",
        "203.0.113.0/24"
    ]
}),
});

const result = await response.json();
console.log('Status:', response.status);
console.log('Result:', result);
Response Example 200 OK
{
  "ok": true,
  "data": {
    "user_id": 8599999,
    "allowed_ips": [
      "198.51.100.42",
      "203.0.113.0/24"
    ],
    "message": "IP allowlist updated successfully"
  }
}

Error Codes Reference

When a request cannot be fulfilled, the Wholesale API responds with a standard error payload containing a machine-readable detail or error code alongside an explanatory message.

HTTP Status Error Code Meaning & Resolution
400 INSUFFICIENT_DEALER_BALANCE The dealer's pre-loaded MMK balance is less than the required order total.
400 RECIPIENTS_REQUIRED No recipient username or Robux amount was provided in the request.
400 RECIPIENTS_INELIGIBLE One or more recipients failed pre-flight eligibility (not in group or in 15-day hold cooldown).
400 BATCH_SIZE_EXCEEDED Batch recipient list exceeds the maximum limit of 200 items per order.
401 UNAUTHORIZED Missing wholesale API key or session token.
401 INVALID_WHOLESALE_API_KEY The provided API key does not match any registered dealer.
401 WHOLESALE_SECRET_REQUIRED Mutating order or security configuration endpoint requires X-Wholesale-Secret.
401 INVALID_WHOLESALE_SECRET The provided X-Wholesale-Secret does not match the dealer's secret.
403 WHOLESALE_DEALER_NOT_APPROVED The account is registered but reseller application is pending or rejected.
403 IP_NOT_ALLOWED The caller's client IP address is not included in the dealer's allowed IP whitelist.
404 ORDER_NOT_FOUND The requested order number does not exist or does not belong to this dealer.
409 IDEMPOTENCY_KEY_COLLISION The supplied X-Idempotency-Key has already been used with a different request payload.
429 RATE_LIMIT_EXCEEDED Request rate limit exceeded. Inspect the Retry-After response header.
503 MAINTENANCE The system is currently undergoing scheduled maintenance.

Become an Official BShop Dealer

Are you running a gaming storefront, Discord bot, or wholesale re-distribution business? Apply for an approved BShop Dealer account to unlock tiered volume discounts, instant balance top-ups, and automated delivery scaling.