Skip navigation
SMM Velox

SMM Velox · API V1

API documentation

Connect your website to the SMM Velox catalog, VND wallet and orders through our API.

Quick start

POST · VND · HTTPS

Send key and action in an application/x-www-form-urlencoded body; JSON is also accepted. URL query parameters and query keys are rejected. Production requires HTTPS. GET is unsupported. Examples use placeholders only.

API endpoint

https://smmvelox.com/api/v2
cURL example
curl -X POST 'https://smmvelox.com/api/v2' \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=add' \
  --data-urlencode 'service=123' \
  --data-urlencode 'link=https://example.com/post' \
  --data-urlencode 'quantity=1000' \
  --data-urlencode 'client_order_id=YOUR_UNIQUE_ORDER_ID' \
  --data-urlencode 'max_charge=11550'

API key authentication

Keep keys secret and send them only in the body. Never put keys in URLs or frontend code, or share them. Rotation/revocation invalidates the old key immediately. Accounts must be active and email verified.

Send the API key over HTTPS in the POST body only. Never put a key in a URL or browser-side code.

API prices and settlement always use VND. UI USD amounts are reference displays only.

POST

List services

V1 exposes verified Default services only: rate is VND per 1,000 units, charge = rate × quantity / 1,000. Service is the internal DV-ID; order is a stable local ID string. No upstream IDs. Money uses exact decimal strings with up to 12 fractional digits.

Request (body)
key=YOUR_API_KEY&action=services
JSON response
[
  {
    "service": 123,
    "name": "Example",
    "desc": "",
    "type": "Default",
    "category": "Facebook",
    "platform": "facebook",
    "rate": "11550.000000000000",
    "rate_unit": "per_1000",
    "min": "100",
    "max": "100000",
    "refill": false,
    "cancel": false,
    "dripfeed": false,
    "currency": "VND"
  }
]
POST

Check balance

API prices and settlement always use VND. UI USD amounts are reference displays only.

Request (body)
key=YOUR_API_KEY&action=balance
JSON response
{
  "balance": "100000.000000000001",
  "currency": "VND"
}
POST

Place an order

add requires a positive integer service, an http/https link up to 2,000 characters, and integer quantity within min/max. price/rate/discount/currency/user_id/status/provider and unknown fields are rejected. Batch status accepts at most 100 IDs.

ParameterRequirementDescription
keyRequiredYour account API key
actionRequiredThe add action
serviceRequiredService ID from the API catalog
linkRequiredHTTP/HTTPS content URL
quantityRequiredInteger quantity within min/max
client_order_idOptionalAccount-unique reference to prevent duplicate orders
idempotency_keyOptionalAlternative to client_order_id; send only one of these fields, never both
max_chargeOptionalMaximum acceptable charge (VND string), not a client-defined price
Request (body)
key=YOUR_API_KEY&action=add&service=123&link=https://example.com/post&quantity=1000&client_order_id=YOUR_UNIQUE_ORDER_ID
JSON response
{
  "order": "456"
}
POST

Single order status

Status may be Pending, Processing, In progress, Completed, Partial or Canceled based on verified evidence. Unknown/review orders return Pending with review_required=true. start_count/remains are null without evidence, never invented zeros. charge always uses the paid snapshot.

Request (body)
key=YOUR_API_KEY&action=status&order=456
JSON response
{
  "charge": "11550",
  "status": "Pending",
  "start_count": null,
  "remains": null,
  "currency": "VND",
  "review_required": false
}
POST

Multiple order status

Responses are objects keyed by order ID. Missing IDs receive individual errors. Up to 100 IDs per call.

Request (body)
key=YOUR_API_KEY&action=status&orders=456,999
JSON response
{
  "456": {
    "charge": "11550",
    "status": "Pending",
    "start_count": null,
    "remains": null,
    "currency": "VND",
    "review_required": false
  },
  "999": {
    "error": "Incorrect order ID"
  }
}
400

Unsupported actions

Package/per_unit, custom comments, subscriptions and dripfeed are unsupported and hidden. cancel, refill and refill_status return HTTP 400 Action is not supported; no status mutation or automatic refund. V1 cancel/refill/dripfeed flags are always false.

Request (body)
key=YOUR_API_KEY&action=cancel
JSON response
{
  "error": "Action is not supported"
}

Ordering and status rules

Send client_order_id (or idempotency_key), 1–64 characters A–Z/a–z/0–9/_.:-, unique per account. Same ID and service/link/quantity/max_charge returns the existing order; changed payload returns 409. Optional max_charge is a VND string ceiling, never a client-set price.

Without a client ID, every valid add creates a new order, even with identical content. Do not blindly retry after timeouts; exactly-once is not guaranteed without a client ID.

API prices are calculated by the server. Safety floors may limit effective discounts; website prices remain unchanged.

When API ordering is OFF, add (including replay) is blocked; valid keys can still read services/balance/status. Provider delivery follows existing gates and queues; immediate dispatch is not promised. API orders earn no Affiliate commission.

Errors and safe retries

Idempotency

A connection can fail after an order has already been accepted and charged. A timeout or HTTP 503 does not prove the request was not processed. Assign a unique reference to every intended order.

  1. Before the first add request, generate a unique client_order_id (or idempotency_key). Store it alongside the submitted service, link, quantity and max_charge.
  2. When an order ID is returned, save it and check with action=status and order. Do not create another add request merely to check status.
  3. If the response times out or disappears and there is no order ID, retry only when the connection and API are available. Send the exact same action=add, reference and original parameters. Never generate a new reference for that attempt.
  4. If a retry returns an order ID, track that ID. Otherwise, stop repeated automatic retries and contact support with the request reference (never your API key).

Prevent duplicate charges

Changing client_order_id or omitting it can create and charge another order. Keep max_charge unchanged on retry; using one reference with different service/link/quantity/max_charge is rejected with 409. When the API is OFF, even add replays are blocked; do not bypass the switch.

First add request or retry with the SAME reference and parameters
curl -X POST 'https://smmvelox.com/api/v2' \
  --data-urlencode 'key=YOUR_API_KEY' \
  --data-urlencode 'action=add' \
  --data-urlencode 'service=123' \
  --data-urlencode 'link=https://example.com/post' \
  --data-urlencode 'quantity=1000' \
  --data-urlencode 'client_order_id=YOUR_UNIQUE_ORDER_ID' \
  --data-urlencode 'max_charge=11550'

Status lookup does not accept client_order_id; action=status requires the returned order ID. Without an order ID, safely repeat the identical add request when the API is ready or contact support.

Example JSON errors and recovery steps

HTTP 409

Reference conflicts with another payload or charge exceeds max_charge. Stop and review the request and price; do not evade the error by minting a new reference.

JSON response
{
  "error": "Client order ID conflicts with an existing request"
}
HTTP 422

Invalid parameters or purchase conditions. Inspect fields and correct the cause before submitting a new request; do not retry blindly.

JSON response
{
  "error": "Invalid request parameters",
  "fields": [
    "quantity"
  ]
}
HTTP 429

Rate limited. Wait at least the Retry-After header duration, lower request frequency and retain the reference for add retries.

Retry-After: 60

JSON response
{
  "error": "Rate limit exceeded"
}
HTTP 503

API disabled, provider unavailable or temporary failure. Stop bulk retries and wait for recovery; if add outcome is uncertain, retry only with the original reference and payload.

JSON response
{
  "error": "API order creation is disabled"
}

The JSON bodies illustrate actual error shapes; error wording can vary with the cause. Handle the HTTP status and underlying condition.

HTTP status codes

Errors are JSON objects with an error field; authentication and internal details are not disclosed.

HTTPDescription
200Success (individual batch entries can contain errors)
400Invalid action or query parameters
401Invalid API key or insufficient access
403HTTPS is required
404Service or order not found or owned by another account
405Unsupported HTTP method
409Idempotency conflict or max_charge exceeded
413Request body exceeds the size limit
415Unsupported Content-Type
422Invalid parameters, pricing, or purchase eligibility
429Rate limit exceeded; check Retry-After
503API disabled, uninstalled, or temporarily unavailable

Security, limits and errors

Optional: up to 20 exact IPv4/IPv6 addresses, one per line. Empty means no IP restriction. CIDR is unsupported. Invalid lists are rejected without changing existing restrictions.

Per minute: 60 requests/IP before authentication; additionally 120 reads or 15 adds per user and key. Maximum body 64 KiB. 429 includes Retry-After. Client-supplied Forwarded/X-Forwarded-For is not trusted.

FAQ: Get keys after signing in. Lost keys must be rotated; old secrets cannot be displayed again. Provider keys do not work here. V1 (2026-10-30): services, balance, Default add and single/batch status. After-sales actions remain V2 work pending safe workflows.