Three products, three separate integrations. Pick the one you want to build against.
http://codedfone.com/stubs/handler_api.phpgetCountries /
getServices, which return JSON). Send your key as the api_key query parameter,
or as an Authorization: Bearer <key> header, on every request.
1. Create an account 2. Add wallet balance 3. Open API Tool in your dashboard, choose Buy Numbers API and copy your key (or click Change Key to rotate it).
Purchases draw from your wallet balance. Prices and balance are in NGN. Keep your key secret and call the API from your server, never from browser JavaScript.
1 getCountries pick a server id →
2 getServices pick a service id →
3 getPrice (optional) →
4 getNumber returns ACCESS_NUMBER:<id>:<phone> →
5 getStatus poll for STATUS_OK:<code> →
6 setStatus=8 cancel/refund if needed.
country parameter is the numeric server id from getCountries — not an ISO country code.http://codedfone.com/stubs/handler_api.php?action=getBalance&api_key=YOUR_API_KEY
Success: ACCESS_BALANCE:1500.00 (NGN)
Errors: BAD_KEY, ACCOUNT_BLOCKED
http://codedfone.com/stubs/handler_api.php?action=getCountries&api_key=YOUR_API_KEY
Success (JSON, keys are server ids you pass as country):
{"1":"United States","2":"United Kingdom","7":"Nigeria"}
Errors: BAD_KEY
http://codedfone.com/stubs/handler_api.php?action=getServices&api_key=YOUR_API_KEY&country=SERVER_ID
Success (JSON, keys are service ids you pass as service):
{"wa":"WhatsApp","tg":"Telegram","go":"Google"}
Errors: BAD_KEY, BAD_COUNTRY
http://codedfone.com/stubs/handler_api.php?action=getPrice&api_key=YOUR_API_KEY&service=SERVICE_ID&country=SERVER_ID
Success: PRICE:150.00:WhatsApp
Errors: BAD_KEY, BAD_SERVICE, BAD_COUNTRY
http://codedfone.com/stubs/handler_api.php?action=getNumber&api_key=YOUR_API_KEY&service=SERVICE_ID&country=SERVER_ID
Success: ACCESS_NUMBER:<id>:<phone> — e.g. ACCESS_NUMBER:a1b2c3d4e5:447700900123.
Save <id> — you pass it to getStatus / setStatus. <phone> is the number to enter on the target site.
| Response | Meaning |
|---|---|
| TRY_AGAIN | Temporary (provider busy/slow, or another buy is in flight on your key). No charge made — retry shortly. |
| NO_API_NUMBER | No numbers in stock right now — try again later. |
| NO_BALANCE | Not enough wallet balance. |
| BAD_SERVICE / BAD_COUNTRY | Invalid service id or server id. |
| BAD_KEY / ACCOUNT_BLOCKED | Bad key, or account disabled. |
http://codedfone.com/stubs/handler_api.php?action=getStatus&api_key=YOUR_API_KEY&id=ACTIVATION_ID
id = the <id> returned by getNumber. Poll about every 5 seconds.
| Response | Meaning |
|---|---|
| STATUS_OK:123456 | SMS received. The code is everything after STATUS_OK: |
| STATUS_WAIT_CODE | Number ready, still waiting for the SMS. Keep polling. |
| TRY_AGAIN | Temporary, retry. |
| STATUS_CANCEL | Cancelled. If no SMS had arrived you are auto-refunded (also happens automatically after 20 min). |
| BAD_KEY / NO_ACTIVATION | Bad key, or no activation for this id. |
http://codedfone.com/stubs/handler_api.php?action=setStatus&api_key=YOUR_API_KEY&id=ACTIVATION_ID&status=STATUS
status=8 cancel (refunds if no SMS arrived) → STATUS_CANCEL
status=3 request another SMS → ACCESS_RETRY_GET
Errors: BAD_KEY, NO_ACTIVATION
<?php
$base = "http://codedfone.com/stubs/handler_api.php";
$key = "YOUR_API_KEY";
function call($url){ return trim(file_get_contents($url)); }
// 1. buy a number (service + numeric server id)
$res = call("$base?action=getNumber&api_key=$key&service=wa&country=1");
if (strpos($res, "ACCESS_NUMBER:") !== 0) { exit("buy failed: $res"); }
[, $id, $phone] = explode(":", $res);
echo "Got $phone (id $id)\n";
// 2. poll for the code
for ($i = 0; $i < 60; $i++) {
$s = call("$base?action=getStatus&api_key=$key&id=$id");
if (strpos($s, "STATUS_OK:") === 0) { echo "Code: " . substr($s, 10) . "\n"; break; }
if ($s === "STATUS_CANCEL") { echo "Cancelled/refunded\n"; break; }
sleep(5);
}const base = "http://codedfone.com/stubs/handler_api.php";
const key = "YOUR_API_KEY";
const call = async (q) => (await fetch(`${base}?${q}`)).text();
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
(async () => {
let res = (await call(`action=getNumber&api_key=${key}&service=wa&country=1`)).trim();
if (!res.startsWith("ACCESS_NUMBER:")) return console.error("buy failed:", res);
const [, id, phone] = res.split(":");
console.log("Got", phone, "id", id);
for (let i = 0; i < 60; i++) {
const s = (await call(`action=getStatus&api_key=${key}&id=${id}`)).trim();
if (s.startsWith("STATUS_OK:")) { console.log("Code:", s.slice(10)); break; }
if (s === "STATUS_CANCEL") { console.log("Cancelled/refunded"); break; }
await sleep(5000);
}
})();import time, requests
base = "http://codedfone.com/stubs/handler_api.php"
key = "YOUR_API_KEY"
def call(q): return requests.get(base, params=q, timeout=30).text.strip()
res = call({"action":"getNumber","api_key":key,"service":"wa","country":"1"})
if not res.startswith("ACCESS_NUMBER:"):
raise SystemExit(f"buy failed: {res}")
_, id, phone = res.split(":")
print("Got", phone, "id", id)
for _ in range(60):
s = call({"action":"getStatus","api_key":key,"id":id})
if s.startswith("STATUS_OK:"): print("Code:", s[10:]); break
if s == "STATUS_CANCEL": print("Cancelled/refunded"); break
time.sleep(5)http://codedfone.com/stubs/logs_api.phpbuyLogs is HTTP POST.
Send your key as the api_key parameter, or as an
Authorization: Bearer <key> header, on every request.
1. Create an account 2. Add wallet balance 3. Open API Tool in your dashboard, choose Buy Logs API and copy your key.
This is a different key from the Buy Numbers one — rotating either leaves the other working. Purchases draw from the same wallet. Prices and balance are in NGN. Call the API from your server, never from browser JavaScript: the responses contain account credentials.
1 getCategories →
2 getProducts pick a sku →
3 getPrice (optional) →
4 buyLogs returns an order_id, status PENDING →
5 getOrder poll until COMPLETED, read credentials.
getOrder every 30–60 seconds, not every second. If an order can't be filled we cancel
it and refund your wallet in full (CANCELLED).A sku is our permanent identifier for a product. Always buy by sku — product
names and stock change, skus don't.
Success responses always carry "status":"success"; failures always carry
"status":"error" plus a machine-readable error code. Branch on
error, not on the human-readable message.
{"status":"success","balance":1500.00,"currency":"NGN"}
{"status":"error","error":"NO_BALANCE","message":"Insufficient balance. Need 3,600.00, have 900.00"}
http://codedfone.com/stubs/logs_api.php?action=getBalance&api_key=YOUR_LOGS_KEY
Success: {"status":"success","balance":1500.00,"currency":"NGN"}
Errors: BAD_KEY, ACCOUNT_BLOCKED, NO_WALLET
http://codedfone.com/stubs/logs_api.php?action=getCategories&api_key=YOUR_LOGS_KEY
Success:
{"status":"success","categories":[
{"category":"Facebook Accounts","products":124},
{"category":"Gmail Accounts","products":57}
]}
Pass category back to getProducts exactly as written.
Errors: BAD_KEY
http://codedfone.com/stubs/logs_api.php?action=getProducts&api_key=YOUR_LOGS_KEY&category=CATEGORY&page=1&limit=100
| Parameter | Meaning |
|---|---|
| category | Optional. Restrict to one category from getCategories. |
| search | Optional. Substring match on the product name. |
| page / limit | Optional. limit defaults to 100, max 500. |
Success:
{"status":"success","products":[
{"sku":"b7-99812","category":"Spotify Accounts","name":"Spotify Premium 3 Months",
"description":"...","price":1800,"stock":-1,"in_stock":true,"min":1,"max":100}
],"total":124,"page":1,"limit":100,"pages":2,"complete":true,"currency":"NGN"}
price is per unit.
in_stock, never on stock.
Most of our catalog comes from sources that don't publish a running count, so those products
report "stock": -1 — meaning untracked, and available to buy, not sold out.
Only "stock": 0 is genuinely out of stock. A stock > 0 filter throws
away the large majority of the shop, including whole categories such as Facebook, Gmail,
Instagram, TikTok, Netflix, Spotify and eBay. Use the boolean in_stock
(stock !== 0) and you can't get this wrong.complete first.
Part of the catalog is refreshed in the background, so a request can occasionally return a shorter
list than the full one. When complete is false, the catalog is still
loading — wait a few seconds and start again from page 1 rather than paging through it.
Paginating across that boundary makes total shrink under your offset, and a later page
comes back empty.Errors: BAD_KEY
http://codedfone.com/stubs/logs_api.php?action=getPrice&api_key=YOUR_LOGS_KEY&sku=SKU
Success: {"status":"success","sku":"a1274","name":"USA FB Aged 2019","price":1800,"stock":42,"in_stock":true,"min":1,"max":50,"currency":"NGN"}
Same rule as getProducts: branch on in_stock. stock: -1
is untracked-but-available, not empty.
Errors: BAD_KEY, BAD_SKU
http://codedfone.com/stubs/logs_api.php?action=buyLogs&api_key=YOUR_LOGS_KEY&sku=SKU&quantity=1
Must be a POST — this spends money, so it is deliberately not reachable by a plain link. Parameters may be sent in the query string, a form body, or a JSON body.
Success:
{"status":"success","order":{
"order_id":"LGS_9fK2xQ7bTn4mLp1a","sku":"a1274",
"product":"USA FB Aged 2019","quantity":2,"charge":3600,
"status":"PENDING","new_balance":8400,"created_at":"2026-08-07 12:41:05"}}
Save order_id — you poll getOrder with it to collect the credentials.
| Error | Meaning |
|---|---|
| TRY_AGAIN | Another purchase is already in flight on your key. No charge made — retry shortly. |
| NO_BALANCE | Not enough wallet balance. |
| OUT_OF_STOCK | Not enough units left. |
| BAD_QUANTITY | Below the product's min or above its max. |
| BAD_SKU | Unknown sku, or no longer on sale. |
| METHOD_NOT_ALLOWED | You sent a GET. Use POST. |
| BAD_KEY / ACCOUNT_BLOCKED | Bad key, or account disabled. |
http://codedfone.com/stubs/logs_api.php?action=getOrder&api_key=YOUR_LOGS_KEY&order_id=ORDER_ID
{"status":"success","order":{
"order_id":"LGS_9fK2xQ7bTn4mLp1a","product":"USA FB Aged 2019",
"quantity":2,"charge":3600,"status":"COMPLETED",
"credentials":["user1@mail.com|Pass123","user2@mail.com|Pass456"],
"created_at":"2026-08-07 12:41:05"}}
| Order status | Meaning |
|---|---|
| PENDING | Paid, being prepared. credentials is still empty — keep polling. |
| COMPLETED | Delivered. One credentials entry per unit, each formatted login|password. |
| CANCELLED | Could not be filled. Your wallet has already been refunded in full. |
Errors: BAD_KEY, NO_ORDER
http://codedfone.com/stubs/logs_api.php?action=getOrders&api_key=YOUR_LOGS_KEY&page=1&limit=20
Success: {"status":"success","orders":[ ...same shape as getOrder... ],"total":37,"page":1,"limit":20}
Covers every logs order on the account, dashboard purchases included. limit defaults to 20, max 100.
Errors: BAD_KEY
<?php
$base = "http://codedfone.com/stubs/logs_api.php";
$key = "YOUR_LOGS_KEY";
function call($url, $post = false) {
$ch = curl_init($url);
curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => $post]);
$out = curl_exec($ch);
curl_close($ch);
return json_decode($out, true);
}
// 1. find something to buy
$list = call("$base?action=getProducts&api_key=$key&search=Facebook&limit=5");
$sku = $list["products"][0]["sku"];
// 2. buy it (POST)
$buy = call("$base?action=buyLogs&api_key=$key&sku=$sku&quantity=1", true);
if ($buy["status"] !== "success") { exit("buy failed: " . $buy["message"]); }
$order_id = $buy["order"]["order_id"];
// 3. poll until the team delivers it
for ($i = 0; $i < 120; $i++) {
$o = call("$base?action=getOrder&api_key=$key&order_id=$order_id")["order"];
if ($o["status"] === "COMPLETED") { print_r($o["credentials"]); break; }
if ($o["status"] === "CANCELLED") { echo "Cancelled and refunded\n"; break; }
sleep(30);
}const base = "http://codedfone.com/stubs/logs_api.php";
const key = "YOUR_LOGS_KEY";
const call = async (q, post = false) =>
(await fetch(`${base}?${q}`, { method: post ? "POST" : "GET" })).json();
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
(async () => {
const list = await call(`action=getProducts&api_key=${key}&search=Facebook&limit=5`);
const sku = list.products[0].sku;
const buy = await call(`action=buyLogs&api_key=${key}&sku=${sku}&quantity=1`, true);
if (buy.status !== "success") return console.error("buy failed:", buy.message);
const orderId = buy.order.order_id;
for (let i = 0; i < 120; i++) {
const { order } = await call(`action=getOrder&api_key=${key}&order_id=${orderId}`);
if (order.status === "COMPLETED") { console.log(order.credentials); break; }
if (order.status === "CANCELLED") { console.log("Cancelled and refunded"); break; }
await sleep(30000);
}
})();import time, requests
base = "http://codedfone.com/stubs/logs_api.php"
key = "YOUR_LOGS_KEY"
def call(params, post=False):
m = requests.post if post else requests.get
return m(base, params=params, timeout=60).json()
# 1. find something to buy
lst = call({"action":"getProducts","api_key":key,"search":"Facebook","limit":5})
sku = lst["products"][0]["sku"]
# 2. buy it (POST)
buy = call({"action":"buyLogs","api_key":key,"sku":sku,"quantity":1}, post=True)
if buy["status"] != "success":
raise SystemExit("buy failed: " + buy["message"])
order_id = buy["order"]["order_id"]
# 3. poll until the team delivers it
for _ in range(120):
o = call({"action":"getOrder","api_key":key,"order_id":order_id})["order"]
if o["status"] == "COMPLETED": print(o["credentials"]); break
if o["status"] == "CANCELLED": print("Cancelled and refunded"); break
time.sleep(30)http://codedfone.com/stubs/smm_api.php?api_key=YOUR_SMM_KEY, or an Authorization: Bearer header.Orders are asynchronous. placeOrder returns immediately with
Pending and charges your wallet; delivery happens over minutes to hours depending
on the service. Poll getOrder until status reaches
Completed, Partial or Canceled.
Refunds are automatic. A Canceled order refunds in full and a
Partial refunds the undelivered remainder — both straight to your wallet, with no
call needed from you. There is no cancel or refill action; an order runs to completion.
Send a request_id on every order. It is your idempotency key.
If a response times out and you retry with the same one, you get the original order back
instead of a second order and a second charge.
http://codedfone.com/stubs/smm_api.php?action=getBalance&api_key=YOUR_SMM_KEY
Success: {"status":"success","balance":12500.00,"currency":"NGN"}
Errors: BAD_KEY, ACCOUNT_BLOCKED
http://codedfone.com/stubs/smm_api.php?action=getCategories&api_key=YOUR_SMM_KEY
Success:
{"status":"success","categories":[
{"category":"Instagram Followers","services":48},
{"category":"TikTok Views","services":31}
]}
Pass category back to getServices exactly as written.
http://codedfone.com/stubs/smm_api.php?action=getServices&api_key=YOUR_SMM_KEY&category=CATEGORY&page=1&limit=100
| Parameter | Meaning |
|---|---|
| category | Optional. Restrict to one category from getCategories. |
| search | Optional. Substring match on the service name. |
| page / limit | Optional. limit defaults to 100, max 500. |
Success:
{"status":"success","services":[
{"sku":"s4055","name":"Telegram Members [Max 200k][Speed 5k/Day]",
"category":"Telegram Members","type":"Default","price_per_1000":53,
"min":1,"max":200000,"orderable":true,"currency":"NGN"}
],"total":1346,"page":1,"limit":100,"pages":14,"currency":"NGN"}
| Field | Meaning |
|---|---|
sku | What you order with. Treat it as an opaque string — never parse it. |
price_per_1000 | NGN per 1,000 units. Your charge is ceil(price_per_1000 × quantity / 1000). |
min / max | Quantity bounds. An order outside them is rejected. |
orderable | Check this. false means the service needs parameters this API does not accept yet — see below. |
type: "Default" services can be ordered today.
Subscriptions, Custom Comments, Mentions and Web Traffic each need extra parameters
(drip-feed runs and intervals, a comment list, usernames, hashtags) that this API does not take
yet, so ordering one returns UNSUPPORTED_TYPE rather than quietly placing an order
that behaves differently from what you asked for. Filter on orderable and you will
never hit it. Tell us if you need the others and we will add them.Errors: BAD_KEY
http://codedfone.com/stubs/smm_api.php?action=getPrice&api_key=YOUR_SMM_KEY&sku=s4055&quantity=1000
quantity is optional — omit it for the rate card, include it to get the
exact charge before committing.
Success: {"status":"success","sku":"s4055","name":"...","price_per_1000":53,"quantity":1000,"charge":53,"min":1,"max":200000,"currency":"NGN"}
Errors: BAD_KEY, BAD_SKU
http://codedfone.com/stubs/smm_api.php?action=placeOrder&api_key=YOUR_SMM_KEY&sku=s4055&link=LINK&quantity=1000&request_id=UUID
| Parameter | Meaning |
|---|---|
| sku | Required. From getServices. |
| link | Required. The profile, post or channel URL the service acts on. |
| quantity | Required. Between the service's min and max. |
| request_id | Strongly recommended. Your idempotency key — reuse it on retries. |
Success:
{"status":"success","order":{
"order_id":"SMM_a1b2c3d4e5f6g7h8","sku":"s4055","service_name":"...",
"link":"https://t.me/example","quantity":1000,"charge":53,
"status":"Pending","start_count":0,"remains":0,"created_at":"2026-08-27 15:04:11"
},"balance":12447.00,"duplicate":false}
duplicate: true means this request_id had already been used
and you are looking at the original order. Nothing was charged twice.
Errors: BAD_SKU, BAD_LINK, BAD_QUANTITY,
BELOW_MIN, ABOVE_MAX, UNSUPPORTED_TYPE,
NO_BALANCE (402), IN_FLIGHT (409), PROVIDER_REJECTED (502)
http://codedfone.com/stubs/smm_api.php?action=getOrder&api_key=YOUR_SMM_KEY&order_id=SMM_xxxx
Success:
{"status":"success","order":{
"order_id":"SMM_a1b2c3d4e5f6g7h8","sku":"s4055","service_name":"...",
"quantity":1000,"charge":53,"status":"In progress",
"start_count":420,"remains":260,"created_at":"2026-08-27 15:04:11"}}
| status | Meaning |
|---|---|
| Pending / Processing | Accepted, not started yet. |
| In progress | Delivering. remains counts down. |
| Completed | Delivered in full. Terminal. |
| Partial | Stopped early. The undelivered remainder is refunded automatically. Terminal. |
| Canceled | Cancelled and refunded in full. Terminal. |
Poll every 30–60 seconds. Stop at any terminal status.
Errors: BAD_KEY, NO_ORDER
http://codedfone.com/stubs/smm_api.php?action=getOrders&api_key=YOUR_SMM_KEY&page=1&limit=20
Success: {"status":"success","orders":[...],"total":86,"page":1,"limit":20,"pages":5}
There is no way to cancel an order or request a refill through this API. Once an order is placed it runs to completion.
You are still covered when delivery falls short: if an order ends
Canceled you are refunded in full, and if it ends Partial the
undelivered remainder is refunded — both automatically, to the wallet, with no call from you.
Watch for it on getOrder.
const base = "http://codedfone.com/stubs/smm_api.php";
const key = "YOUR_SMM_KEY";
const call = async (q, post = false) =>
(await fetch(`${base}?${q}`, { method: post ? "POST" : "GET" })).json();
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
(async () => {
// 1. pick a service you can actually order
const list = await call(`action=getServices&api_key=${key}&search=Instagram Followers&limit=50`);
const svc = list.services.find(s => s.orderable);
// 2. place it, with an idempotency key you can safely retry on
const requestId = crypto.randomUUID();
const res = await call(
`action=placeOrder&api_key=${key}&sku=${svc.sku}&link=${encodeURIComponent("https://instagram.com/example")}` +
`&quantity=${svc.min}&request_id=${requestId}`, true);
if (res.status !== "success") return console.error("order failed:", res.message);
// 3. poll to completion — refunds for Partial/Canceled are automatic
const id = res.order.order_id;
for (let i = 0; i < 240; i++) {
const { order } = await call(`action=getOrder&api_key=${key}&order_id=${id}`);
console.log(order.status, "remains:", order.remains);
if (["Completed", "Partial", "Canceled", "Cancelled"].includes(order.status)) break;
await sleep(30000);
}
})();import time, uuid, requests
base = "http://codedfone.com/stubs/smm_api.php"
key = "YOUR_SMM_KEY"
def call(params, post=False):
m = requests.post if post else requests.get
return m(base, params=params, timeout=60).json()
# 1. pick a service you can actually order
lst = call({"action":"getServices","api_key":key,"search":"Instagram Followers","limit":50})
svc = next(s for s in lst["services"] if s["orderable"])
# 2. place it, with an idempotency key you can safely retry on
res = call({"action":"placeOrder","api_key":key,"sku":svc["sku"],
"link":"https://instagram.com/example","quantity":svc["min"],
"request_id":str(uuid.uuid4())}, post=True)
if res["status"] != "success":
raise SystemExit("order failed: " + res["message"])
# 3. poll to completion — refunds for Partial/Canceled are automatic
order_id = res["order"]["order_id"]
for _ in range(240):
o = call({"action":"getOrder","api_key":key,"order_id":order_id})["order"]
print(o["status"], "remains:", o["remains"])
if o["status"] in ("Completed", "Partial", "Canceled", "Cancelled"): break
time.sleep(30)Questions? Contact support.