Your site. Our catalogue.
One connected experience.
Bring digital resources and SMS services into your own website. Browse availability, check your wallet and manage orders through one secure API.
01 / Your API access
Sign in with your Toolzplanet account to request developer access. Purchases use your existing wallet.
Sign in to continue02 / Create a server key
Keys inherit your approved account limits. Read keys can browse and retrieve your own orders. Purchase keys can also place orders and request SMS cancellation.
Beginner setup: fund, request access, connect
- Fund your Toolzplanet wallet to at least $5 USD and wait for verified credit.
- Request API access above and wait for administrator approval and API launch.
- Create a server key, store it privately, check your balance, then fetch catalogue pages.
Download the integration guide · Download the Postman collection
Integrate in three steps
01 / Authenticate on your server
Base endpoint: https://toolzplanet.net/developer-api.php
Use HTTPS and an Authorization: Bearer YOUR_API_KEY header. Browser sessions and keys sent in URLs are not accepted.
curl 'https://toolzplanet.net/developer-api.php?action=balance' \ -H 'Authorization: Bearer YOUR_API_KEY'
All prices and wallet amounts are integers in USD cents, regardless of your website display currency. ₦ pricing is not accepted by this API.
02 / Browse and quote
GET ?action=catalogue&kind=product&page=1 GET ?action=catalogue&kind=sms&page=1 GET ?action=quote&item_id=ITEM_ID
Use the catalogue id as item_id. Responses contain up to 50 items and next_page. Only enabled, approved supplier-backed listings with recent availability appear. TextPlus is a separate read-only catalogue available only to explicitly approved TextPlus or product/category scopes. Use kind=textplus; TextPlus-only accounts default to that catalogue. Other local/manual listings are excluded.
Some services need a live quote. Always fetch a fresh quote before purchase and use its price_cents. Availability and price can change before checkout.
03 / Place one protected order
curl 'https://toolzplanet.net/developer-api.php?action=purchase' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: my-store-order-000001' \
-d '{"item_id":123,"expected_price_cents":250}'Example IDs and prices are placeholders. One unit per order. Save the idempotency key before sending. Repeat the same request with the same key after a timeout; a different payload with that key returns 409. Never create a new key to retry an uncertain purchase.
Track delivery and SMS
GET ?action=orders&before_id=ORDER_ID
GET ?action=order&order_id=ORDER_ID
POST ?action=refresh {"order_id":123}
POST ?action=cancel {"order_id":123}
GET ?action=meRefresh/cancel use JSON and the same Bearer header. Wait at least five seconds between status checks for an order. An active SMS can be cancelled only where the supplier permits it. Refunds happen after supplier confirmation.
Order responses contain status, phone, delivery and refunded. Delivery is returned only to the owning account. Treat delivered credentials and messages as private.
Read-only connection check
Check whether the endpoint responds. This check sends no API key and cannot place orders. It does not verify authenticated catalogue access or wallet eligibility. Your approved key and at least $5 USD (500 cents) are required for authenticated catalogue syncing.
Ready to check API availability. Authenticated catalogue syncing requires at least $5 USD in your wallet.
PHP · server only
<?php
// Server-side only. Set TOOLZPLANET_API_KEY in server configuration.
$key=getenv('TOOLZPLANET_API_KEY');
if(!$key)throw new RuntimeException('Configure an approved read-only API key.');
$page=1;
$ch=curl_init('https://toolzplanet.net/developer-api.php?action=catalogue&page='.$page);
curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>true,CURLOPT_TIMEOUT=>20,CURLOPT_FOLLOWLOCATION=>false,CURLOPT_HTTPHEADER=>['Authorization: Bearer '.$key,'Accept: application/json']]);
$raw=curl_exec($ch);$http=(int)curl_getinfo($ch,CURLINFO_RESPONSE_CODE);curl_close($ch);
if($raw===false)throw new RuntimeException('Connection failed; retry this read-only request later.');
$data=json_decode($raw,true,512,JSON_THROW_ON_ERROR);
if(($data['error']['code']??'')==='minimum_wallet_balance_required'){
throw new RuntimeException('Catalogue sync paused: maintain at least $5 USD (500 cents). Fund your wallet at '.$data['error']['funding_url'].' and retry after verified credit. No activation fee.');
}
if($http!==200||!($data['success']??false))throw new RuntimeException('API request rejected: '.($data['error']['code']??'http_'.$http));
foreach($data['data']['items'] as $item){
echo json_encode(['id'=>$item['id'],'price_cents'=>$item['price_cents'],'currency'=>$item['currency'],'stock'=>$item['stock'],'live_quote_required'=>$item['live_quote_required']]).PHP_EOL;
}
// Request next_page with the same GET action when not null.
echo 'Next page: '.json_encode($data['data']['next_page']).PHP_EOL;
JavaScript · Node.js server only
// Node.js server only. Never embed an API key in browser JavaScript.
const key = process.env.TOOLZPLANET_API_KEY;
if (!key) throw new Error('Configure an approved read-only API key.');
const url = new URL('https://toolzplanet.net/developer-api.php');
url.searchParams.set('action', 'catalogue');
url.searchParams.set('page', '1');
const response = await fetch(url, {
headers: {Authorization: `Bearer ${key}`, Accept: 'application/json'},
redirect: 'error', signal: AbortSignal.timeout(20000)
});
const data = await response.json();
if (data.error?.code === 'minimum_wallet_balance_required') {
throw new Error(`Catalogue sync paused: keep at least $5 USD (500 cents). Fund at ${data.error.funding_url} and retry after verified credit. No activation fee.`);
}
if (!response.ok || !data.success) throw new Error(`API request rejected: ${data.error?.code ?? response.status}`);
for (const item of data.data.items) {
console.log({id: item.id, price_cents: item.price_cents, currency: item.currency,
stock: item.stock, live_quote_required: item.live_quote_required});
}
console.log('Next page:', data.data.next_page);
// Follow next_page with GET catalogue only. A null price requires GET quote.
Set TOOLZPLANET_API_KEY in private server configuration. Never put it in browser code, a URL or logs. Use an approved read-only key. Supplier catalogue IDs are integer API item IDs. TextPlus IDs are strings such as textplus:123; preserve them exactly. TextPlus API purchasing is disabled. Prices are integer USD cents; a null price requires a fresh GET quote. Follow next_page until null. Stock can change before an order.
The launch pause is intentional and enforced server-side. Launch and individual account approval must both permit access before keys can be created.
Catalogue balance requirement · HTTP 403
minimum_wallet_balance_required means catalogue syncing is paused while your usable wallet is below 500 USD cents. Existing keys resume automatically after verified funding reaches at least 500 cents. No $5 fee, deduction or reservation is made.
{
"success": false,
"error": {
"code": "minimum_wallet_balance_required",
"currency": "USD",
"required_balance_cents": 500,
"balance_cents": 499,
"funding_url": "https://toolzplanet.net/index.php?page=funding",
"funding_instructions": "Top up your usable wallet to at least $5 USD, wait for verified credit, and retry the catalogue GET using the same key."
},
"request_id": "example"
}Only catalogue access is subject to this minimum. Balance, account access, existing order history, delivery, refresh and eligible cancellation/refund actions remain available below it. Purchases and quotes use their existing rules. A purchase leaving less than $5 pauses subsequent catalogue requests.
Responses, limits and recovery
A predictable JSON envelope
{"success":true,"data":{...},"request_id":"..."}
{"success":false,"error":{
"code":"rate_limited",
"message":"..."
},"request_id":"..."}Save request_id when contacting support. No customer API response contains supplier credentials or supplier wallet balances.
Handle failures safely
- 401: key missing, revoked, expired or account disabled.
- 403: minimum_wallet_balance_required for catalogue balance below $5, or existing permission, IP or spending limits. Inspect the error code.
- 409: conflict, price change or uncertain order. Check history.
- 429: rate limit. Respect
Retry-After. - 503: paused API or temporary failure. Reconcile any purchase before retrying.
Orders may be reserved, dispatching, active, delivered, unknown, failed or cancelled. unknown requires review; it does not mean you should place another order. Daily limits conservatively count all accepted attempts, including refunded orders, until the next UTC day.
Product scope & optional integration monitoring
Check GET ?action=me for your approved catalogue scope. Existing supplier catalogue access stays unchanged unless an administrator changes your scope. TextPlus-only access excludes other products and SMS, across every key. TextPlus catalogue: GET ?action=catalogue&kind=textplus&page=1; quote: GET ?action=quote&item_id=textplus:PRODUCT_ID. Follow next_page. Use price_cents in integer USD cents, stock and availability_checked_at; listed NGN pricing uses the same TextPlus pricing source as the website. No login, password, phone or inventory payload is in catalogue responses. TextPlus API purchases remain disabled.
Register your integration and optionally authorise monitoring at Integration monitoring settings. A same-host public HTTPS health endpoint must return your ownership challenge and status ok. Alternatively, enable heartbeats and send POST ?action=heartbeat with your private Bearer key and {"status":"ok"} every configured interval, initially 300 seconds. Three consecutive failures or missed intervals trigger an internal incident. No external notifications are enabled.
API activity shows requests reaching Toolzplanet. Endpoint availability shows a validated dedicated health response. Heartbeat shows fresh authenticated sender activity. Wallet eligibility shows the current $5 minimum. These are separate: no API requests does not prove downtime, and a responding homepage does not prove catalogue syncing works. Missing/stale data is Unknown, optional monitoring off is Not configured, and inactivity is Inactive.