Developers

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

  1. Top up your balance (โž• Top up).
  2. Make an API key (๐Ÿ”‘ My keys).
  3. 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.

Base URLhttps://mfatools.one/api/v1

1Start 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:

Header
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

Shell
curl -H "X-API-Key: mfa_your_key" https://mfatools.one/api/v1/me
JSON
{"user_id": 123, "balance": "25.40", "currency": "USDT",
 "discount_percent": 5, "rate_limit_per_min": 60, ...}

3Products

GET/products
JSON
{"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"
}]}
  • price
    what one item costs you
  • stock
    items left; null = no limit known, 0 = sold out
  • requires_email
    the product is activated on your customer's email: send email with the order (one item per order)
  • delivery
    instant (codes in seconds) or manual: 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 says processing until 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

POST/orders
Request body
{"product_id": 14,
 "quantity": 2,
 "idempotency_key": "your-order-123",
 "max_price": "1.40"}
  • idempotency_keyrequired
    your 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.
  • quantity
    1 to 20
  • max_priceoptional
    the most you pay per item. If the price went up, the order is refused (409 price_changed) and nothing is charged.
  • email
    needed when the product has requires_email
  • waitoptional, 0 to 30, default 25
    seconds 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:

JSON
{"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

GET/orders/501

status

  • processing
    paid, the codes are on their way. Ask again in a few seconds (or minutes).
  • delivered
    codes holds the items. instructions may hold activation notes for your customer (a manual product: what to do with the invitation).
  • review
    our team is checking this order by hand. It ends delivered or refunded.
  • refunded
    nothing 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 your max_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; wait Retry-After seconds
  • 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_price so 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

Shell
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

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

JavaScript
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.