WatShop API Docs
Reseller Portal Get an API Key

WatShop Reseller API

Resell our full digital-goods catalog on your own website, SMM panel or WooCommerce store. Orders debit your wallet and auto-deliver — stock credentials arrive instantly, manual items follow within their ETA. All delivery notifications go out by email.

Overview & Authentication

There are two API surfaces over the same account, wallet and catalog:

APIBase URLAuthBest for
SMM Panel API https://mskey.watshop.in/api/v2 key parameter (form or JSON) SMM panels (Perfect Panel, SmartPanel, Rental panels…) via the standard provider format
REST API v1 https://mskey.watshop.in/api/v1 Authorization: Bearer <api_key> (or ?key=) Custom websites, AI-built storefronts, the WordPress plugin, scripts

Get your API key by creating a reseller account — the key is issued instantly and shown on your dashboard, where you also top up your wallet.

Wallet & errors. Every order debits your wallet at the product's INR rate × quantity. If the balance is too low, v1 responds 402 and v2 responds {"error":"..."}. Suspended accounts get {"error":"Account suspended"} on every call.
Keep the key server-side. Anyone holding your key can spend your balance. Never ship it in browser JavaScript, mobile apps or public repos — call the API from your backend and keep the key in an environment variable.

SMM Panel API — POST /api/v2

The industry-standard SMM provider format: one endpoint, POST only, form-encoded (or JSON) body, an action parameter, responses in JSON. Errors always come back as {"error":"message"} with HTTP 200, as SMM panels expect.

POST action=services

Returns the full catalog as SMM services. service is a stable integer id; rate is the INR price per unit.

ParameterRequiredDescription
keyYesYour API key
actionYesservices
curl
curl -X POST https://mskey.watshop.in/api/v2 \
  -d 'key=YOUR_API_KEY' \
  -d 'action=services'
200 · json
[
  {
    "service": 12,
    "name": "Netflix Premium — 1 Month",
    "type": "Package",
    "category": "Streaming",
    "rate": "99.00",
    "min": 1,
    "max": 14,
    "refill": false,
    "cancel": false
  }
]

max reflects available stock for instant-delivery products (falls back to 1000 for manual delivery).

POST action=add

Places an order: checks the product is active and your balance covers rate × quantity, debits the wallet atomically, then delivers instantly when stock is available.

ParameterRequiredDescription
keyYesYour API key
actionYesadd
serviceYesService id from action=services
quantityNoDefaults to 1
customer_emailNoNon-standard extra: your buyer's email — credentials are emailed there (you get a copy). Defaults to your reseller email.
curl
curl -X POST https://mskey.watshop.in/api/v2 \
  -d 'key=YOUR_API_KEY' \
  -d 'action=add' \
  -d 'service=12' \
  -d 'quantity=1' \
  -d '[email protected]'
200 · json
{ "order": 5731 }

POST action=status

Check one order. credentials is included only once the order is Completed.

ParameterRequiredDescription
keyYesYour API key
actionYesstatus
orderYesOrder id returned by add
curl
curl -X POST https://mskey.watshop.in/api/v2 \
  -d 'key=YOUR_API_KEY' \
  -d 'action=status' \
  -d 'order=5731'
200 · json
{
  "charge": "99.00",
  "start_count": "0",
  "status": "Completed",
  "remains": "0",
  "currency": "INR",
  "credentials": "[email protected]:password123"
}
StatusMeaning
CompletedPaid and delivered — credentials included
In progressPaid, delivery being prepared
PendingAwaiting fulfillment (manual-delivery products)
RefundedCharge returned to your wallet
CanceledOrder cancelled

POST action=status (multiple orders)

Pass orders as a comma-separated list (instead of order) to check up to 100 orders in one call.

curl
curl -X POST https://mskey.watshop.in/api/v2 \
  -d 'key=YOUR_API_KEY' \
  -d 'action=status' \
  -d 'orders=5731,5732,5733'
200 · json
{
  "5731": { "charge": "99.00", "start_count": "0", "status": "Completed", "remains": "0", "currency": "INR", "credentials": "[email protected]:password123" },
  "5732": { "charge": "199.00", "start_count": "0", "status": "In progress", "remains": "0", "currency": "INR" },
  "5733": { "error": "Incorrect order ID" }
}

POST action=balance

curl
curl -X POST https://mskey.watshop.in/api/v2 \
  -d 'key=YOUR_API_KEY' \
  -d 'action=balance'
200 · json
{ "balance": "1234.50", "currency": "INR" }
200 · error shape
{ "error": "Not enough funds in the balance" }

REST API v1

Clean JSON over proper HTTP verbs and status codes. Authenticate with Authorization: Bearer <api_key> (a ?key= query parameter also works for quick tests).

CodeMeaning
401Missing or invalid API key
402Insufficient wallet funds
404Unknown product or order
422Validation error (bad quantity, missing fields…)

GET /api/v1/products

Full catalog, including live stock for instant-delivery products.

curl
curl https://mskey.watshop.in/api/v1/products \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 · json
[
  {
    "id": "netflix_premium_1m",
    "api_service_id": 12,
    "name": "Netflix Premium — 1 Month",
    "category": "Streaming",
    "description": "4K UHD private profile, instant delivery",
    "price_inr": 99,
    "price_usdt": 1.2,
    "image_url": "https://mskey.watshop.in/images/netflix.png",
    "delivery_type": "auto",
    "eta_minutes": 0,
    "in_stock": true,
    "stock_count": 14
  }
]

POST /api/v1/orders

Create an order. Pass either product_id (string id) or service (integer id from the SMM services list). If the product delivers instantly, credentials is already in the response.

curl
curl -X POST https://mskey.watshop.in/api/v1/orders \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "product_id": "netflix_premium_1m",
    "quantity": 1,
    "customer_email": "[email protected]"
  }'
201 · json
{
  "order_id": 5731,
  "charge": 99,
  "balance_after": 1135.5,
  "status": "Completed",
  "credentials": "[email protected]:password123"
}
402 · json
{ "error": "Insufficient funds" }

GET /api/v1/orders/:id

Order details. Poll this until status is Completed for manual-delivery products.

curl
curl https://mskey.watshop.in/api/v1/orders/5731 \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 · json
{
  "order_id": 5731,
  "product": "Netflix Premium — 1 Month",
  "status": "Completed",
  "charge": 99,
  "credentials": "[email protected]:password123",
  "created_at": "2026-08-05 12:41:03"
}

GET /api/v1/orders?limit=50

Your most recent orders, newest first. limit defaults to 50.

curl
curl 'https://mskey.watshop.in/api/v1/orders?limit=10' \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 · json
[
  { "order_id": 5731, "product": "Netflix Premium — 1 Month", "status": "Completed", "charge": 99, "created_at": "2026-08-05 12:41:03" },
  { "order_id": 5729, "product": "Spotify Premium — 3 Months", "status": "Pending", "charge": 249, "created_at": "2026-08-05 11:02:47" }
]

GET /api/v1/balance

curl
curl https://mskey.watshop.in/api/v1/balance \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 · json
{ "balance": 1135.5, "currency": "INR" }

GET /api/v1/me

Account details — handy as a "test connection" call.

curl
curl https://mskey.watshop.in/api/v1/me \
  -H 'Authorization: Bearer YOUR_API_KEY'
200 · json
{
  "name": "Acme Digital",
  "email": "[email protected]",
  "status": "active",
  "created_at": "2026-07-01 09:15:00"
}

Connect from an SMM Panel

WatShop speaks the standard SMM provider protocol, so any panel software (Perfect Panel, SmartPanel, rental panels, custom scripts) can plug us in as a provider:

  1. 1In your panel's admin area open Providers (sometimes called API Providers or Services → Providers).
  2. 2Click Add provider.
  3. 3API URL: https://mskey.watshop.in/api/v2
  4. 4API key: paste the key from your reseller dashboard.
  5. 5Save, then import services — our catalog appears with INR rates. Set your own markup per service.
  6. 6Map order delivery: when an order completes, fetch action=status — the credentials field contains what your buyer receives (also emailed automatically when you pass customer_email on add).
Tip: keep your wallet topped up — orders fail instantly (no queue) when the balance can't cover the charge, and most panels will mark the order as errored.

Integrate with an AI Website Builder

Building a storefront with Lovable, v0, Bolt or a similar AI builder? Paste the prompt below, replace YOUR_API_KEY, and the builder will wire a complete storefront against our REST API — with the key safely kept server-side.

Never expose the key client-side. The prompt explicitly instructs the builder to create a server-side proxy that injects the key from an environment variable. If a builder puts the key in browser code, regenerate your key and fix the proxy first.
prompt · paste into your AI builder
You are building a digital-goods storefront that resells products from the
WatShop Reseller API.

API BASE URL: https://mskey.watshop.in/api/v1
API KEY: YOUR_API_KEY

AUTH: every request to the WatShop API needs the header
  Authorization: Bearer <API KEY>

SECURITY (most important requirement):
Create server-side API routes (for example /api/watshop/*) that forward
requests to the WatShop API and inject the Authorization header from an
environment variable named WATSHOP_API_KEY. The browser must only ever call
these proxy routes. Never place the key in client-side code, bundles, or
public config — if the framework only supports client code, generate a small
serverless/edge function for the proxy.

BUILD THIS:

1. Catalog page
   - GET {base}/products returns an array of:
     { id, api_service_id, name, category, description, price_inr,
       price_usdt, image_url, delivery_type, eta_minutes, in_stock,
       stock_count }
   - Render a responsive product grid grouped by category with name, image,
     description, delivery ETA and an "In stock" badge.
   - Show a selling price of price_inr with my margin applied (make the
     margin a single constant I can edit, default 20%).
   - Grey out / disable buying when in_stock is false.

2. Checkout
   - Collect the buyer's email address, then POST {base}/orders with JSON:
     { "product_id": "<id>", "quantity": 1, "customer_email": "<buyer email>" }
   - A 201 response returns { order_id, charge, balance_after, status,
     credentials? }. If credentials is present, the item was delivered
     instantly — show it on a success page with a copy button.
   - Error handling: 402 means my reseller wallet is out of funds — show the
     buyer "temporarily unavailable, try again soon" (never mention the
     wallet); 404 unknown product; 422 validation error; show friendly toasts.

3. Order status page
   - For orders that are not yet Completed, poll GET {base}/orders/{order_id}
     every 15 seconds. The response is { order_id, product, status, charge,
     credentials?, created_at }.
   - While status is "Pending" or "In progress" show a friendly "your order
     is being prepared" state with the ETA. When it becomes "Completed",
     stop polling and reveal the credentials with a copy button.
   - Give the buyer a link they can bookmark to come back to this page.

4. Utilities (server-side only)
   - GET {base}/balance returns { balance, currency } — log a server-side
     warning when the balance drops below 500 so I know to top up.
   - GET {base}/me verifies the key works; use it in a health-check route.

GENERAL: mobile-first responsive design, clear loading and empty states,
no exposure of wholesale price_inr or my wallet anywhere in the UI.

WordPress Plugin

Already running WooCommerce? The WatShop Reseller plugin imports our catalog as WooCommerce products with your margin, keeps prices and stock in sync hourly, and fulfills paid orders automatically — credentials land in the buyer's completion email.

Download watshop-reseller.zip

Install & set up

  1. 1Requirements: WordPress with WooCommerce active, PHP 7.4+.
  2. 2WP Admin → Plugins → Add New → Upload Plugin → choose watshop-reseller.zipInstall Now.
  3. 3Click Activate.
  4. 4Open Settings → WatShop Reseller and enter the API URL https://mskey.watshop.in/api/v1 and your API key. Set your price margin % and (optionally) enable hourly auto-sync.
  5. 5Click Test connection — it calls /api/v1/me and shows your account plus wallet balance.
  6. 6Click Import now — the catalog is created as virtual WooCommerce products (SKU = product id, price = INR price × (1 + margin)), with categories and images mapped.

How selling works

  1. 1A customer pays for an imported product in your WooCommerce store.
  2. 2The plugin places the order on WatShop with your buyer's email and stores the WatShop order id on the WooCommerce order.
  3. 3A cron job polls the order until it is Completed, then saves the credentials to the order, adds an order note and sends them to the buyer in the completion email.
  4. 4If the order fails (for example your wallet hits 402), the WooCommerce order stays in processing with a note, you get an admin email, and a Retry button appears in the order's WatShop meta box.
Hourly sync keeps prices in line with the WatShop catalog and flips WooCommerce products to out-of-stock when our stock runs dry. Uninstalling the plugin cleans up its settings.

WatShop Reseller API · Portal login · Create account