Your Domain Reseller Plan lets you register and manage .tz domains from your own WHMCS (or from your own software) at wholesale prices. Registrations and renewals are charged to your reseller wallet; transfers are free. This page covers everything you need: where to find your credentials, how to install the WHMCS module, and the full API reference.
modules folder into the root of your WHMCS (it adds modules/registrars/sakurareseller/)..co.tz, .or.tz, .ac.tz, .go.tz, .tz), set Auto Registration to Sakura .TZ Domain Reseller and set your own selling prices. Your wholesale prices are on your service page.The module supports registration, renewal, transfer in, nameservers, registrar lock, EPP/auth code, contact details, expiry sync and availability search. Deleting a domain is not offered; contact support if you need one removed.
Use the API directly if you are not using WHMCS.
URL: https://billing.sakurahost.co.tz/modules/addons/sakura_reseller/api.php?endpoint=ENDPOINT
Method: POST with a JSON body (send {} when there are no fields).
Every request carries three headers:
| Header | Value |
|---|---|
Authorization | Bearer YOUR_API_KEY |
X-Timestamp | Current Unix time in seconds (must be within 5 minutes of our clock) |
X-Signature | Lower-case hex of HMAC-SHA256(API_SECRET, TIMESTAMP + ":" + RAW_BODY) |
Sign the exact bytes you send as the body. Keep the API Secret on your server only; never put it in browser code or a mobile app.
# shell
BODY='{"domains":["example.co.tz"]}'
TS=$(date +%s)
SIG=$(printf '%s' "$TS:$BODY" | openssl dgst -sha256 -hmac "$API_SECRET" -hex | awk '{print $NF}')
curl -X POST "https://billing.sakurahost.co.tz/modules/addons/sakura_reseller/api.php?endpoint=domain/check" \
-H "Authorization: Bearer $API_KEY" -H "X-Timestamp: $TS" -H "X-Signature: $SIG" \
-H "Content-Type: application/json" -d "$BODY"
// PHP
$body = json_encode(['domains' => ['example.co.tz']]);
$ts = time();
$sig = hash_hmac('sha256', $ts . ':' . $body, $apiSecret);
$ch = curl_init('https://billing.sakurahost.co.tz/modules/addons/sakura_reseller/api.php?endpoint=domain/check');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_POSTFIELDS => $body, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json', "Authorization: Bearer $apiKey", "X-Timestamp: $ts", "X-Signature: $sig"]]);
$result = json_decode(curl_exec($ch), true);
Success: {"status":"success","data":{...}}
Error: {"status":"error","message":"..."}
| HTTP | Meaning |
|---|---|
| 200 | Done |
| 400 / 422 | Request or field problem; the message says which field |
| 401 | Authentication failed (key, signature or timestamp) |
| 402 | Wallet balance too low for this action |
| 403 | Not allowed: suspended account, domain limit reached, address not on your allow-list, or the domain is not in your account |
| 404 / 409 | Unknown endpoint / the domain already exists |
| 429 | Too many requests, or too many failed logins (wait 10 minutes) |
| 502 / 503 | The .tz registry returned an error or is unavailable. You are not charged when this happens |
| Endpoint | Body fields | Returns |
|---|---|---|
account/balance | none | balance, currency, tier, domain_limit, domains_used |
pricing/tlds | none | your register / renew / transfer price per extension |
domain/check | domains: array of up to 20 names | results: name → available / registered / unknown |
domain/suggest | query, optional limit | suggested names to check |
domain/register | domain, years (1-10), nameservers (2 to 10), registrant object | registered, expiry, charged |
domain/renew | domain, years | renewed, new expiry, charged |
domain/transfer | domain, auth_code | transfer_initiated, charged (always 0). Transfers are free and keep the domain's current expiry date |
domain/info | domain | status, locked, expiry, created, transfer_pending |
domain/list | none | every domain in your account with status and expiry |
domain/nameservers | domain; add nameservers (array) to change them | current nameservers, or updated |
domain/lock | domain, locked (true / false) | locked |
domain/contacts | domain; add registrant to change it | registrant details, or updated |
domain/eppcode | domain | a new transfer (auth) code |
{
"firstname": "Amina", "lastname": "Juma", "companyname": "Optional Ltd",
"email": "amina@example.com", "phonenumber": "+255.712345678",
"address1": "Samora Avenue 12", "address2": "", "city": "Dar es Salaam",
"state": "Dar es Salaam", "postcode": "11101", "country": "TZ"
}
Required: firstname, lastname, email, phonenumber, address1, city. Phone numbers are written like +255.712345678; a Tanzanian number such as 0712345678 is also accepted.
POST ...api.php?endpoint=domain/register
{"domain":"example.co.tz","years":1,
"nameservers":["ns1.yourdns.co.tz","ns2.yourdns.co.tz"],
"registrant":{ ...as above... }}
200 {"status":"success","data":{"domain":"example.co.tz","registered":true,
"expiry":"2027-10-26","charged":25000,"currency":"TZS"}}
Email hello@sakuragroup.co.tz or WhatsApp +255 758 309 999. Please include the domain name and the exact message you received.