CodedFone API

Three products, three separate integrations. Pick the one you want to build against.

Base endpoint: http://codedfone.com/stubs/handler_api.php
All calls are HTTP GET. Responses are plain text (except getCountries / getServices, which return JSON). Send your key as the api_key query parameter, or as an Authorization: Bearer <key> header, on every request.

1. Get an API key

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.

2. How it works

1 getCountries pick a server id2 getServices pick a service id3 getPrice (optional) → 4 getNumber returns ACCESS_NUMBER:<id>:<phone>5 getStatus poll for STATUS_OK:<code>6 setStatus=8 cancel/refund if needed.

An activation with no SMS is auto-cancelled and refunded after 20 minutes. The country parameter is the numeric server id from getCountries — not an ISO country code.

3. Endpoints

GET getBalance

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

GET getCountries

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

GET getServices

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

GET getPrice

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

GET getNumber  — purchase a number

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.

ResponseMeaning
TRY_AGAINTemporary (provider busy/slow, or another buy is in flight on your key). No charge made — retry shortly.
NO_API_NUMBERNo numbers in stock right now — try again later.
NO_BALANCENot enough wallet balance.
BAD_SERVICE / BAD_COUNTRYInvalid service id or server id.
BAD_KEY / ACCOUNT_BLOCKEDBad key, or account disabled.

GET getStatus  — poll for the OTP

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.

ResponseMeaning
STATUS_OK:123456SMS received. The code is everything after STATUS_OK:
STATUS_WAIT_CODENumber ready, still waiting for the SMS. Keep polling.
TRY_AGAINTemporary, retry.
STATUS_CANCELCancelled. If no SMS had arrived you are auto-refunded (also happens automatically after 20 min).
BAD_KEY / NO_ACTIVATIONBad key, or no activation for this id.

GET setStatus  — cancel or request another SMS

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

4. Quick start (code)

<?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)
Base endpoint: http://codedfone.com/stubs/logs_api.php
Every response is JSON. Reads are HTTP GET; buyLogs is HTTP POST. Send your key as the api_key parameter, or as an Authorization: Bearer <key> header, on every request.

1. Get an API key

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.

2. How it works

1 getCategories2 getProducts pick a sku3 getPrice (optional) → 4 buyLogs returns an order_id, status PENDING5 getOrder poll until COMPLETED, read credentials.

Logs orders are checked and delivered by our team — they are not instant. Expect minutes, and poll 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.

3. Envelope

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"}

4. Endpoints

GET getBalance

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

GET getCategories

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

GET getProducts

http://codedfone.com/stubs/logs_api.php?action=getProducts&api_key=YOUR_LOGS_KEY&category=CATEGORY&page=1&limit=100
ParameterMeaning
categoryOptional. Restrict to one category from getCategories.
searchOptional. Substring match on the product name.
page / limitOptional. 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.

Filter on 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.
Syncing the whole catalog? Check 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

GET getPrice

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

POST buyLogs  — place an order

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.

ErrorMeaning
TRY_AGAINAnother purchase is already in flight on your key. No charge made — retry shortly.
NO_BALANCENot enough wallet balance.
OUT_OF_STOCKNot enough units left.
BAD_QUANTITYBelow the product's min or above its max.
BAD_SKUUnknown sku, or no longer on sale.
METHOD_NOT_ALLOWEDYou sent a GET. Use POST.
BAD_KEY / ACCOUNT_BLOCKEDBad key, or account disabled.

GET getOrder  — poll for the credentials

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 statusMeaning
PENDINGPaid, being prepared. credentials is still empty — keep polling.
COMPLETEDDelivered. One credentials entry per unit, each formatted login|password.
CANCELLEDCould not be filled. Your wallet has already been refunded in full.

Errors: BAD_KEY, NO_ORDER

GET getOrders  — order history

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

5. Quick start (code)

<?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)
Endpoint: http://codedfone.com/stubs/smm_api.php
Auth: ?api_key=YOUR_SMM_KEY, or an Authorization: Bearer header.
Your key: open API Tool in your dashboard, choose Boost Socials API and copy your key. It is a different key from your Buy Numbers and Buy Logs keys — rotating one never affects the others.
Server-to-server only. This endpoint sends no CORS headers on purpose. Your key spends your wallet, so it must never appear in front-end JavaScript where anyone viewing the page can read it. Call it from your backend.

How an order works

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.

GET getBalance

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

GET getCategories

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.

GET getServices

http://codedfone.com/stubs/smm_api.php?action=getServices&api_key=YOUR_SMM_KEY&category=CATEGORY&page=1&limit=100
ParameterMeaning
categoryOptional. Restrict to one category from getCategories.
searchOptional. Substring match on the service name.
page / limitOptional. 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"}
FieldMeaning
skuWhat you order with. Treat it as an opaque string — never parse it.
price_per_1000NGN per 1,000 units. Your charge is ceil(price_per_1000 × quantity / 1000).
min / maxQuantity bounds. An order outside them is rejected.
orderableCheck this. false means the service needs parameters this API does not accept yet — see below.
Only 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

GET getPrice

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

POST placeOrder

http://codedfone.com/stubs/smm_api.php?action=placeOrder&api_key=YOUR_SMM_KEY&sku=s4055&link=LINK&quantity=1000&request_id=UUID
ParameterMeaning
skuRequired. From getServices.
linkRequired. The profile, post or channel URL the service acts on.
quantityRequired. Between the service's min and max.
request_idStrongly 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)

GET getOrder  — poll this

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"}}
statusMeaning
Pending / ProcessingAccepted, not started yet.
In progressDelivering. remains counts down.
CompletedDelivered in full. Terminal.
PartialStopped early. The undelivered remainder is refunded automatically. Terminal.
CanceledCancelled and refunded in full. Terminal.

Poll every 30–60 seconds. Stop at any terminal status.

Errors: BAD_KEY, NO_ORDER

GET getOrders

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}

No cancel, no refill

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.

Full example

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.