Reseller API
Sell our products in your own bot, website or app. Orders through the API are paid from your balance here and cost 5% less than the normal price.
How to start
- Top up your balance (โ Top up).
- Make an API key (๐ My keys).
- Call
https://mfatools.one/api/v1: list the products, place orders, get the codes.
Want a ready-made shop bot of your own instead? Tap ๐ค Become a reseller.
https://mfatools.one/api/v11Start here
Base address: https://mfatools.one/api/v1
Every request and answer is JSON. Amounts are strings in USDT (e.g. "1.38"), times are UTC (ISO 8601).
What you can do
- GET
/meyour balance and limits - GET
/productswhat you can sell and your price - POST
/ordersbuy; the codes come back in the answer - GET
/orders/IDan order with its codes - GET
/ordersyour recent orders
Your price
Every product costs 5% less through the API than in the shop (price; the shop's own price is retail_price). You choose your own selling price.
Money
Orders are paid from your balance with us. Top it up in the bot or on the website with any of our payment methods. If an order cannot be delivered, its money goes back to your balance.
2Your key
Make keys in the bot (๐ API โ ๐ My keys) or on the website (Account โ API). A key is shown once: copy it somewhere safe. You can have 3 keys and revoke any of them at once.
Send it in a header with every request:
X-API-Key: mfa_your_key(or Authorization: Bearer mfa_your_key)
โ ๏ธ Anyone with your key can spend your balance. Keep it on your server only: never in a website's page, an app people can download, or a public code repository. If it leaks, revoke it and make a new one.
Check that it works
curl -H "X-API-Key: mfa_your_key" https://mfatools.one/api/v1/me{"user_id": 123, "balance": "25.40", "currency": "USDT",
"discount_percent": 5, "rate_limit_per_min": 60, ...}3Products
/products{"products": [{
"id": 14,
"title": "Gemini Pro 18 months",
"description": "...",
"category": "Gemini",
"price": "1.38",
"retail_price": "1.45",
"currency": "USDT",
"in_stock": true,
"stock": 250,
"requires_email": false,
"max_quantity": 20,
"delivery": "instant"
}]}pricewhat one item costs youstockitems left;null= no limit known, 0 = sold outrequires_emailthe product is activated on your customer's email: sendemailwith the order (one item per order)deliveryinstant(codes in seconds) ormanual: our team delivers it by hand on the email, usually within a few hours (e.g. Canva Pro on your customer's own account). The order saysprocessinguntil then
One product: GET https://mfatools.one/api/v1/products/14
Prices and stock change: read the list every few minutes, not before every sale. The order itself always checks the current price and stock.
4Place an order
/orders{"product_id": 14,
"quantity": 2,
"idempotency_key": "your-order-123",
"max_price": "1.40"}idempotency_keyrequiredyour own unique id for this purchase, 1 to 64 characters (letters, digits,_ - . :). Sending the same key again never buys twice: you get the same order back. So if a request times out, simply send it again with the same key.quantity1 to 20max_priceoptionalthe most you pay per item. If the price went up, the order is refused (409price_changed) and nothing is charged.emailneeded when the product hasrequires_emailwaitoptional, 0 to 30, default 25seconds to wait for the codes
The price is taken from your balance at once. Most orders come back delivered with their codes in the same answer:
{"order": {"id": 501, "status": "delivered",
"quantity": 2, "delivered_quantity": 2,
"total": "2.76", "codes": ["...", "..."],
"idempotency_key": "your-order-123", ...}}201 = a new order, 200 = the order you already made with this key.
5Order status and codes
/orders/501status
processingpaid, the codes are on their way. Ask again in a few seconds (or minutes).deliveredcodesholds the items.instructionsmay hold activation notes for your customer (amanualproduct: what to do with the invitation).reviewour team is checking this order by hand. It ends delivered or refunded.refundednothing was delivered; the money is back in your balance.
Fewer items
Rarely a supplier delivers fewer items than ordered: delivered_quantity is smaller than quantity, and the missing ones are already refunded (refunded).
Your recent orders, newest first, without codes: GET https://mfatools.one/api/v1/orders?limit=20, then &before_id=ID for older ones.
Every order also shows in your ๐ฆ My orders in the bot and on the website.
6Errors
Errors come as {"error": {"code": "...", "message": "..."}}. Nothing is charged when an order is refused.
- 400
bad_request: something in the request is missing or malformed - 401
invalid_key: missing, wrong or revoked key - 402
insufficient_balance: top up your balance - 403
account_banned/api_blocked: contact support - 404
not_found: no such product or order (or not yours) - 409
out_of_stock/not_enough_stock: try later or fewer items - 409
price_changed: the price is above yourmax_price - 409
idempotency_conflict: this key was used for a different product or quantity - 422
invalid_quantity/email_required/invalid_email - 429
rate_limited: too many requests; waitRetry-Afterseconds - 500 / 503: a problem on our side. Retry with the same idempotency key: it never buys twice.
A timeout or a dropped connection does not mean the order failed. Always retry with the same key instead of making a new one.
7Limits and tips
- 60 requests per minute per key, 20 new orders per minute. Answers carry
X-RateLimit-Remaining. - At most 5 orders per key waiting for their codes at the same time.
- Up to 20 items per order.
Test mode
Add the header X-Test-Mode: true to try everything without spending: orders are checked as usual but answered with TEST codes, and no money moves. Ask for a test order with the same header. New test orders count against the 20 per minute too, and at most 500 a day.
Tips
- Save the idempotency key with your own order before you call us, and reuse it on every retry.
- Use
max_priceso a price rise never costs you. - Keep some balance with us: an order is refused (402) when it runs out.
- Show your customers the codes only once your order says
delivered.
8Examples
curl
curl -X POST https://mfatools.one/api/v1/orders \
-H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"product_id": 14, "quantity": 1, "idempotency_key": "o-1001"}'Python
import httpx
api = httpx.Client(base_url="https://mfatools.one/api/v1",
headers={"X-API-Key": KEY}, timeout=40)
r = api.post("/orders", json={"product_id": 14,
"quantity": 1, "idempotency_key": "o-1001"})
order = r.json()["order"]
if order["status"] == "delivered":
print(order["codes"])Node.js
const r = await fetch("https://mfatools.one/api/v1/orders", {
method: "POST",
headers: {"X-API-Key": KEY,
"Content-Type": "application/json"},
body: JSON.stringify({product_id: 14,
quantity: 1, idempotency_key: "o-1001"})});
const {order} = await r.json();Timeout: allow at least 35 seconds (an order may wait up to 30 for its codes).
9Become a reseller
Two ways to sell our products under your own name:
1. Get a ready-made shop bot
A complete Telegram shop bot of your own: products, all crypto payment methods, balances, orders, refunds and an admin panel, running on your own server and buying from us through this API. You set your own prices.
Talk to us in @MFAShopResellersBot: we send you the bot and a step-by-step setup guide.
2. Build your own
Use these docs to connect your own bot, website or app.
Either way your orders are paid from your balance with us, at 5% less than our normal price.