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 · HTTPSSend 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/v2curl -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.
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.
key=YOUR_API_KEY&action=services[
{
"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"
}
]Check balance
API prices and settlement always use VND. UI USD amounts are reference displays only.
key=YOUR_API_KEY&action=balance{
"balance": "100000.000000000001",
"currency": "VND"
}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.
| Parameter | Requirement | Description |
|---|---|---|
| key | Required | Your account API key |
| action | Required | The add action |
| service | Required | Service ID from the API catalog |
| link | Required | HTTP/HTTPS content URL |
| quantity | Required | Integer quantity within min/max |
| client_order_id | Optional | Account-unique reference to prevent duplicate orders |
| idempotency_key | Optional | Alternative to client_order_id; send only one of these fields, never both |
| max_charge | Optional | Maximum acceptable charge (VND string), not a client-defined price |
key=YOUR_API_KEY&action=add&service=123&link=https://example.com/post&quantity=1000&client_order_id=YOUR_UNIQUE_ORDER_ID{
"order": "456"
}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.
key=YOUR_API_KEY&action=status&order=456{
"charge": "11550",
"status": "Pending",
"start_count": null,
"remains": null,
"currency": "VND",
"review_required": false
}Multiple order status
Responses are objects keyed by order ID. Missing IDs receive individual errors. Up to 100 IDs per call.
key=YOUR_API_KEY&action=status&orders=456,999{
"456": {
"charge": "11550",
"status": "Pending",
"start_count": null,
"remains": null,
"currency": "VND",
"review_required": false
},
"999": {
"error": "Incorrect order ID"
}
}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.
key=YOUR_API_KEY&action=cancel{
"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
IdempotencyA 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.
- 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.
- 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.
- 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.
- 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.
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
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.
{
"error": "Client order ID conflicts with an existing request"
}Invalid parameters or purchase conditions. Inspect fields and correct the cause before submitting a new request; do not retry blindly.
{
"error": "Invalid request parameters",
"fields": [
"quantity"
]
}Rate limited. Wait at least the Retry-After header duration, lower request frequency and retain the reference for add retries.
Retry-After: 60
{
"error": "Rate limit exceeded"
}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.
{
"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.
| HTTP | Description |
|---|---|
| 200 | Success (individual batch entries can contain errors) |
| 400 | Invalid action or query parameters |
| 401 | Invalid API key or insufficient access |
| 403 | HTTPS is required |
| 404 | Service or order not found or owned by another account |
| 405 | Unsupported HTTP method |
| 409 | Idempotency conflict or max_charge exceeded |
| 413 | Request body exceeds the size limit |
| 415 | Unsupported Content-Type |
| 422 | Invalid parameters, pricing, or purchase eligibility |
| 429 | Rate limit exceeded; check Retry-After |
| 503 | API 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.