Developer API v1.0

Built for Scalability and Innovation

Integrate domain registration and management directly into your own applications with our powerful REST API.

POST /api/v1/domains/check
{
  "domain_name": "example.co.tz"
}

// 200 OK
{
  "available": true,
  "price": 35000
}

Quick Start

Integrate our API into your backend in seconds using standard HTTP tools like cURL.

curl -X POST "https://reseller.co.tz/api/v1/domains/check" \
  -H "X-API-KEY: your_reseller_api_key" \
  -H "Accept: application/json" \
  -d '{"domain_name": "example.co.tz"}'

Authentication

All API requests must be authenticated using your unique API key found in the Reseller Portal.

Header Value
X-API-KEY Your unique reseller API key
Accept application/json

Response Formats

Every v1 response uses a predictable JSON envelope. Registry and DNS errors are intentionally general so provider details, private configuration, and credentials stay hidden from public integrations.

Success
{
  "success": true,
  "message": "Domain renewed successfully.",
  "data": {
    "domain": {
      "domain_name": "example.co.tz",
      "status": "active"
    }
  }
}
Validation or Registry Error
{
  "success": false,
  "message": "The registry could not complete this request. Please try again later.",
  "errors": {
    "registry": [
      "The registry could not complete this request. Please try again later."
    ]
  }
}

Domain actions and endpoints

Every domain action on the reseller API. Search for an endpoint, open it for parameters and examples, then copy the cURL command. Replace {domain} with a portal domain ID or the full domain name, and {record} with a record line or record ID.

https://reseller.co.tz/api/v1

26 endpoints

Find and inspect domains

GET /domains List the domains owned by your reseller account with search, status filter and pagination.
GET /domains/{domain} Read one owned domain, including expiry, lock, privacy and the exact renewal price.
POST /domains/check Check availability and return catalog pricing plus the reserved, premium and bookable flags.

Register, re-register and renew

POST /domains/register Register a new domain, create the portal ownership record, and charge the reseller balance after registry success.
POST /domains/{domain}/register Register an owned cancelled domain again, reusing the existing portal domain record.
POST /domains/{domain}/renew Renew an owned domain for one or more years and charge the reseller balance after registry success.
POST /domains/{domain}/sync Refresh local status, expiry, lock, privacy and safe registry metadata from the registry.

Transfer a domain in

POST /domains/{domain}/transfer Submit a domain transfer with the Auth/EPP code and charge the transfer price after registry success.

Contacts and Whois

GET /domains/{domain}/whois Read the registrant and admin contact details currently held at the registry.
POST /domains/{domain}/whois Update the registrant and admin contact details at the registry.

Nameservers and glue records

GET /domains/{domain}/nameservers Read the nameservers currently set for an owned domain.
POST /domains/{domain}/nameservers Replace the nameservers of an owned domain.
GET /domains/{domain}/child-nameservers Read saved child nameservers (glue records) for extensions that support them.
POST /domains/{domain}/child-nameservers Save child nameservers with glue addresses and optionally apply them as the active nameservers.

DNS management

GET /domains/{domain}/dns Read DNS management status and the editable DNS records of an owned domain.
POST /domains/{domain}/dns/provision Enable the free DNS management addon for an owned domain.
DELETE /domains/{domain}/dns Cancel DNS management for an owned domain.
POST /domains/{domain}/dns/records Create a DNS record. DNS management must be active for the domain.
PUT /domains/{domain}/dns/records/{record} Update a DNS record by record line or record ID. DNS management must be active.
DELETE /domains/{domain}/dns/records/{record} Delete a DNS record by record line or record ID. DNS management must be active.

Transfer lock, privacy and EPP codes

POST /domains/{domain}/epp-code Request the current Auth/EPP code so a customer can move the domain away.
PUT /domains/{domain}/epp-code Set a new Auth/EPP code when the extension supports it.
GET /domains/{domain}/lock Read the transfer lock status where the extension supports a client lock.
PUT /domains/{domain}/lock Enable or disable the transfer lock where the extension supports it.
GET /domains/{domain}/privacy Read Whois privacy status where the extension supports it.
PUT /domains/{domain}/privacy Enable or disable Whois privacy where the extension supports it.
No endpoint matches that search.

Find and inspect domains

Search availability, list the domains you own, and read a single domain record.

GET /domains No charge 200 OK on success

List the domains owned by your reseller account with search, status filter and pagination.

Operation: listDomains

Query parameters

q optional search text matched against the domain name
status optional one of active, expired, pending, pending_transfer, cancelled
per_page optional integer 1-100, default 25
page optional integer page number

Good to know

  • Only domains owned by the API key account are returned.
  • Send status=all (or omit status) to search every status.

cURL

curl -X GET "https://reseller.co.tz/api/v1/domains" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "Domains loaded successfully.",
    "data": {
        "domains": [
            {
                "id": 123,
                "domain_name": "example.co.tz",
                "status": "active",
                "registry_status": "active",
                "redemption_state": "grace",
                "in_redemption": false,
                "renewal_price": 20000,
                "redemption_price": null,
                "registration_date": "2026-05-28",
                "expiry_date": "2027-05-28",
                "lock_status": false,
                "privacy_status": false,
                "last_synced_at": "2026-05-28T12:00:00.000000Z"
            }
        ],
        "pagination": {
            "current_page": 1,
            "per_page": 25,
            "total": 1,
            "last_page": 1
        }
    }
}
GET /domains/{domain} No charge 200 OK on success

Read one owned domain, including expiry, lock, privacy and the exact renewal price.

Operation: getDomain

Path parameters

domain required portal domain ID or full domain name

Good to know

  • in_redemption is true when the registry has already moved the domain into its restoration window.
  • When in_redemption is true, show redemption_price for the first year; extra years use renewal_price.

cURL

curl -X GET "https://reseller.co.tz/api/v1/domains/{domain}" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "Domain loaded successfully.",
    "data": {
        "domain": {
            "id": 123,
            "domain_name": "example.co.tz",
            "status": "active",
            "registry_status": "active",
            "redemption_state": "grace",
            "in_redemption": false,
            "renewal_price": 20000,
            "redemption_price": null,
            "registration_date": "2026-05-28",
            "expiry_date": "2027-05-28",
            "lock_status": false,
            "privacy_status": false,
            "last_synced_at": "2026-05-28T12:00:00.000000Z"
        }
    }
}
POST /domains/check No charge 200 OK on success

Check availability and return catalog pricing plus the reserved, premium and bookable flags.

Operation: checkDomainAvailability

Body parameters

domain_name required full domain name including the extension, max 253 characters

Good to know

  • available and bookable are usually the same. reserved means the registry blocks the name, premium means the registry prices it per name.
  • Always quote premium names from price.registration before charging a customer.
  • A domain already managed in this portal is reported as unavailable.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/check" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"domain_name":"example.co.tz"}'

Request body

{
    "domain_name": "example.co.tz"
}

Sample response (200 OK)

{
    "success": true,
    "message": "Domain availability checked successfully.",
    "data": {
        "domain_name": "example.co.tz",
        "available": true,
        "bookable": true,
        "reserved": false,
        "premium": false,
        "price": {
            "registration": 20000,
            "renewal": 20000,
            "transfer": 0,
            "premium_registration": null,
            "premium_sellable": false
        }
    }
}

Register, re-register and renew

Billable actions that create ownership or extend an expiry date. Your balance is charged only after the registry accepts the order.

POST /domains/register Billable 201 Created on success

Register a new domain, create the portal ownership record, and charge the reseller balance after registry success.

Operation: registerDomain

Body parameters

domain_name required full domain name that is not already in the portal
period required integer 1-10 years
nameservers required array of 2-10 hostnames
registrant required contact object, see schemas.contact
admin required contact object, see schemas.contact
same_contact optional boolean. true copies the registrant onto the admin contact, so admin can be omitted
provision_dns optional boolean. true enables DNS management after successful registration

Good to know

  • The wallet balance is checked before the registry call and charged only after the registry confirms success.
  • Some extensions have registry rules. For example .co.za requires the registrant country to be South Africa (ZA).
  • Reserved and premium names are rejected unless the extension has a sellable premium price configured.
  • Treat this endpoint as non-idempotent and add your own retry guard.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/register" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"domain_name":"example.co.tz","period":1,"nameservers":["ns1.example.co.tz","ns2.example.co.tz"],"same_contact":true,"registrant":{"name":"Jane Doe","organization":"Jane Doe Ltd","address1":"123 Registry Road","city":"Dar es Salaam","state":"Dar es Salaam","postcode":"11101","country":"TZ","phone":"+255.754123456","email":"jane@example.co.tz"},"admin":{"name":"Jane Doe","organization":"Jane Doe Ltd","address1":"123 Registry Road","city":"Dar es Salaam","state":"Dar es Salaam","postcode":"11101","country":"TZ","phone":"+255.754123456","email":"jane@example.co.tz"}}'

Request body

{
    "domain_name": "example.co.tz",
    "period": 1,
    "nameservers": [
        "ns1.example.co.tz",
        "ns2.example.co.tz"
    ],
    "same_contact": true,
    "registrant": {
        "name": "Jane Doe",
        "organization": "Jane Doe Ltd",
        "address1": "123 Registry Road",
        "city": "Dar es Salaam",
        "state": "Dar es Salaam",
        "postcode": "11101",
        "country": "TZ",
        "phone": "+255.754123456",
        "email": "jane@example.co.tz"
    },
    "admin": {
        "name": "Jane Doe",
        "organization": "Jane Doe Ltd",
        "address1": "123 Registry Road",
        "city": "Dar es Salaam",
        "state": "Dar es Salaam",
        "postcode": "11101",
        "country": "TZ",
        "phone": "+255.754123456",
        "email": "jane@example.co.tz"
    }
}

Sample response (201 Created)

{
    "success": true,
    "message": "Domain registered successfully.",
    "data": {
        "domain": {
            "id": 123,
            "domain_name": "example.co.tz",
            "status": "active",
            "registry_status": "active",
            "redemption_state": "grace",
            "in_redemption": false,
            "renewal_price": 20000,
            "redemption_price": null,
            "registration_date": "2026-05-28",
            "expiry_date": "2027-05-28",
            "lock_status": false,
            "privacy_status": false,
            "last_synced_at": "2026-05-28T12:00:00.000000Z"
        },
        "dns": null,
        "amount_charged": 20000
    }
}
POST /domains/{domain}/register Billable 201 Created on success

Register an owned cancelled domain again, reusing the existing portal domain record.

Operation: registerCancelledDomain

Path parameters

domain required portal domain ID or full domain name with cancelled status

Body parameters

period required integer 1-10 years
nameservers required array of 2-10 hostnames
registrant required contact object, see schemas.contact
admin required contact object, see schemas.contact
same_contact optional boolean, true to reuse the registrant details
provision_dns optional boolean

Good to know

  • Only a domain the account already owns with status cancelled can be re-registered.
  • A cancelled domain is registered at the normal registration price, not the restoration price.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/register" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"period":1,"nameservers":["ns1.example.co.tz","ns2.example.co.tz"],"same_contact":true,"registrant":{"name":"Jane Doe","organization":"Jane Doe Ltd","address1":"123 Registry Road","city":"Dar es Salaam","state":"Dar es Salaam","postcode":"11101","country":"TZ","phone":"+255.754123456","email":"jane@example.co.tz"},"admin":{"name":"Jane Doe","organization":"Jane Doe Ltd","address1":"123 Registry Road","city":"Dar es Salaam","state":"Dar es Salaam","postcode":"11101","country":"TZ","phone":"+255.754123456","email":"jane@example.co.tz"}}'

Request body

{
    "period": 1,
    "nameservers": [
        "ns1.example.co.tz",
        "ns2.example.co.tz"
    ],
    "same_contact": true,
    "registrant": {
        "name": "Jane Doe",
        "organization": "Jane Doe Ltd",
        "address1": "123 Registry Road",
        "city": "Dar es Salaam",
        "state": "Dar es Salaam",
        "postcode": "11101",
        "country": "TZ",
        "phone": "+255.754123456",
        "email": "jane@example.co.tz"
    },
    "admin": {
        "name": "Jane Doe",
        "organization": "Jane Doe Ltd",
        "address1": "123 Registry Road",
        "city": "Dar es Salaam",
        "state": "Dar es Salaam",
        "postcode": "11101",
        "country": "TZ",
        "phone": "+255.754123456",
        "email": "jane@example.co.tz"
    }
}

Sample response (201 Created)

{
    "success": true,
    "message": "Domain registered successfully.",
    "data": {
        "domain": {
            "id": 123,
            "domain_name": "example.co.tz",
            "status": "active",
            "registry_status": "active",
            "redemption_state": "grace",
            "in_redemption": false,
            "renewal_price": 20000,
            "redemption_price": null,
            "registration_date": "2026-05-28",
            "expiry_date": "2027-05-28",
            "lock_status": false,
            "privacy_status": false,
            "last_synced_at": "2026-05-28T12:00:00.000000Z"
        },
        "dns": null,
        "amount_charged": 20000
    }
}
POST /domains/{domain}/renew Billable 200 OK on success

Renew an owned domain for one or more years and charge the reseller balance after registry success.

Operation: renewDomain

Path parameters

domain required portal domain ID or full domain name

Body parameters

period required integer 1-10 years

Good to know

  • Domains in the registry restoration window cost redemption_price for the first year; extra years use renewal_price.
  • Read the domain first (GET /domains/{domain}) to show the same amount this endpoint will charge.
  • If the registry cannot be reached, the API returns a retry message and no charge is made.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/renew" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"period":1}'

Request body

{
    "period": 1
}

Sample response (200 OK)

{
    "success": true,
    "message": "Domain renewed successfully.",
    "data": {
        "domain": {
            "id": 123,
            "domain_name": "example.co.tz",
            "status": "active",
            "registry_status": "active",
            "redemption_state": "grace",
            "in_redemption": false,
            "renewal_price": 20000,
            "redemption_price": null,
            "registration_date": "2026-05-28",
            "expiry_date": "2028-05-28",
            "lock_status": false,
            "privacy_status": false,
            "last_synced_at": "2026-05-28T12:00:00.000000Z"
        }
    }
}
POST /domains/{domain}/sync No charge 200 OK on success

Refresh local status, expiry, lock, privacy and safe registry metadata from the registry.

Operation: syncDomain

Path parameters

domain required portal domain ID or full domain name

Good to know

  • Never billable. Use it after a transfer completes or when a customer disputes the expiry date.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/sync" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "Domain synced successfully.",
    "data": {
        "domain": {
            "id": 123,
            "domain_name": "example.co.tz",
            "status": "active",
            "registry_status": "active",
            "redemption_state": "grace",
            "in_redemption": false,
            "renewal_price": 20000,
            "redemption_price": null,
            "registration_date": "2026-05-28",
            "expiry_date": "2027-05-28",
            "lock_status": false,
            "privacy_status": false,
            "last_synced_at": "2026-05-28T12:00:00.000000Z"
        }
    }
}

Transfer a domain in

Move an existing domain to this platform with its Auth/EPP code.

POST /domains/{domain}/transfer Billable 200 OK on success

Submit a domain transfer with the Auth/EPP code and charge the transfer price after registry success.

Operation: transferDomain

Path parameters

domain required full domain name to transfer

Body parameters

auth_code required string 6-128 characters. Never log or store it
registrant optional contact object when the registry must match an existing contact
admin optional contact object

Good to know

  • Auth codes are never echoed back in API responses or stored in the portal.
  • A transfer only completes when the current registrar releases the domain. Poll with POST /domains/{domain}/sync.
  • The domain shows status pending_transfer until the registry finishes the move.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/transfer" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"auth_code":"sample-transfer-code","registrant":{"name":"Jane Doe","organization":"Jane Doe Ltd","address1":"123 Registry Road","city":"Dar es Salaam","state":"Dar es Salaam","postcode":"11101","country":"TZ","phone":"+255.754123456","email":"jane@example.co.tz"},"admin":{"name":"Jane Doe","organization":"Jane Doe Ltd","address1":"123 Registry Road","city":"Dar es Salaam","state":"Dar es Salaam","postcode":"11101","country":"TZ","phone":"+255.754123456","email":"jane@example.co.tz"}}'

Request body

{
    "auth_code": "sample-transfer-code",
    "registrant": {
        "name": "Jane Doe",
        "organization": "Jane Doe Ltd",
        "address1": "123 Registry Road",
        "city": "Dar es Salaam",
        "state": "Dar es Salaam",
        "postcode": "11101",
        "country": "TZ",
        "phone": "+255.754123456",
        "email": "jane@example.co.tz"
    },
    "admin": {
        "name": "Jane Doe",
        "organization": "Jane Doe Ltd",
        "address1": "123 Registry Road",
        "city": "Dar es Salaam",
        "state": "Dar es Salaam",
        "postcode": "11101",
        "country": "TZ",
        "phone": "+255.754123456",
        "email": "jane@example.co.tz"
    }
}

Sample response (200 OK)

{
    "success": true,
    "message": "Domain transfer submitted successfully.",
    "data": {
        "domain": {
            "id": 123,
            "domain_name": "example.co.tz",
            "status": "pending_transfer",
            "registry_status": "pending_transfer",
            "redemption_state": "grace",
            "in_redemption": false,
            "renewal_price": 20000,
            "redemption_price": null,
            "registration_date": "2026-05-28",
            "expiry_date": "2027-05-28",
            "lock_status": false,
            "privacy_status": false,
            "last_synced_at": "2026-05-28T12:00:00.000000Z"
        }
    }
}

Contacts and Whois

Read and update the registrant and admin contact details held at the registry.

GET /domains/{domain}/whois No charge 200 OK on success

Read the registrant and admin contact details currently held at the registry.

Operation: getWhois

Path parameters

domain required portal domain ID or full domain name

Good to know

  • Some extensions omit state or organization. Send the returned values back unchanged when updating.

cURL

curl -X GET "https://reseller.co.tz/api/v1/domains/{domain}/whois" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "Whois contact details loaded successfully.",
    "data": {
        "registrant": {
            "name": "Jane Doe",
            "organization": "Jane Doe Ltd",
            "address1": "123 Registry Road",
            "city": "Dar es Salaam",
            "state": "Dar es Salaam",
            "postcode": "11101",
            "country": "TZ",
            "phone": "+255.754123456",
            "email": "jane@example.co.tz"
        },
        "admin": {
            "name": "Jane Doe",
            "organization": "Jane Doe Ltd",
            "address1": "123 Registry Road",
            "city": "Dar es Salaam",
            "state": "Dar es Salaam",
            "postcode": "11101",
            "country": "TZ",
            "phone": "+255.754123456",
            "email": "jane@example.co.tz"
        }
    }
}
POST /domains/{domain}/whois No charge 200 OK on success

Update the registrant and admin contact details at the registry.

Operation: updateWhois

Path parameters

domain required portal domain ID or full domain name

Body parameters

registrant required contact object, see schemas.contact
admin required contact object, see schemas.contact
same_contact optional boolean, true to reuse the registrant details as the admin contact

Good to know

  • Contact country must be an ISO 3166-1 alpha-2 code (Tanzania = TZ, South Africa = ZA).
  • Extensions with registry rules reject some contact changes, for example .co.za requires a South African registrant.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/whois" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"registrant":{"name":"Jane Doe","organization":"Jane Doe Ltd","address1":"123 Registry Road","city":"Dar es Salaam","state":"Dar es Salaam","postcode":"11101","country":"TZ","phone":"+255.754123456","email":"jane@example.co.tz"},"admin":{"name":"Jane Doe","organization":"Jane Doe Ltd","address1":"123 Registry Road","city":"Dar es Salaam","state":"Dar es Salaam","postcode":"11101","country":"TZ","phone":"+255.754123456","email":"jane@example.co.tz"}}'

Request body

{
    "registrant": {
        "name": "Jane Doe",
        "organization": "Jane Doe Ltd",
        "address1": "123 Registry Road",
        "city": "Dar es Salaam",
        "state": "Dar es Salaam",
        "postcode": "11101",
        "country": "TZ",
        "phone": "+255.754123456",
        "email": "jane@example.co.tz"
    },
    "admin": {
        "name": "Jane Doe",
        "organization": "Jane Doe Ltd",
        "address1": "123 Registry Road",
        "city": "Dar es Salaam",
        "state": "Dar es Salaam",
        "postcode": "11101",
        "country": "TZ",
        "phone": "+255.754123456",
        "email": "jane@example.co.tz"
    }
}

Sample response (200 OK)

{
    "success": true,
    "message": "Whois contact details updated successfully.",
    "data": {
        "registrant": {
            "name": "Jane Doe",
            "organization": "Jane Doe Ltd",
            "address1": "123 Registry Road",
            "city": "Dar es Salaam",
            "state": "Dar es Salaam",
            "postcode": "11101",
            "country": "TZ",
            "phone": "+255.754123456",
            "email": "jane@example.co.tz"
        },
        "admin": {
            "name": "Jane Doe",
            "organization": "Jane Doe Ltd",
            "address1": "123 Registry Road",
            "city": "Dar es Salaam",
            "state": "Dar es Salaam",
            "postcode": "11101",
            "country": "TZ",
            "phone": "+255.754123456",
            "email": "jane@example.co.tz"
        }
    }
}

Nameservers and glue records

Point a domain at your DNS provider, including child nameservers with glue IP addresses.

GET /domains/{domain}/nameservers No charge 200 OK on success

Read the nameservers currently set for an owned domain.

Operation: getNameservers

Path parameters

domain required portal domain ID or full domain name

cURL

curl -X GET "https://reseller.co.tz/api/v1/domains/{domain}/nameservers" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "Nameservers loaded successfully.",
    "data": {
        "nameservers": [
            "ns1.example.co.tz",
            "ns2.example.co.tz"
        ]
    }
}
POST /domains/{domain}/nameservers No charge 200 OK on success

Replace the nameservers of an owned domain.

Operation: updateNameservers

Path parameters

domain required portal domain ID or full domain name

Body parameters

nameservers required array of 2-10 hostnames
provision_dns optional boolean, keep true to use the portal DNS management addon

Good to know

  • Nameserver limits depend on the domain extension. The API rejects a list that is too long or too short.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/nameservers" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"nameservers":["ns1.example.co.tz","ns2.example.co.tz"]}'

Request body

{
    "nameservers": [
        "ns1.example.co.tz",
        "ns2.example.co.tz"
    ]
}

Sample response (200 OK)

{
    "success": true,
    "message": "Nameservers updated successfully.",
    "data": {
        "nameservers": [
            "ns1.example.co.tz",
            "ns2.example.co.tz"
        ]
    }
}
GET /domains/{domain}/child-nameservers No charge 200 OK on success

Read saved child nameservers (glue records) for extensions that support them.

Operation: getChildNameservers

Path parameters

domain required portal domain ID or full domain name

Query parameters

child_nsset_id optional saved child nameserver set ID

cURL

curl -X GET "https://reseller.co.tz/api/v1/domains/{domain}/child-nameservers" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "Child nameservers loaded successfully.",
    "data": {
        "child_nsset_id": "NSSET123",
        "nameservers": [
            {
                "label": "ns1",
                "name": "ns1.example.co.tz",
                "addresses": [
                    "192.0.2.10"
                ]
            },
            {
                "label": "ns2",
                "name": "ns2.example.co.tz",
                "addresses": [
                    "192.0.2.11"
                ]
            }
        ]
    }
}
POST /domains/{domain}/child-nameservers No charge 200 OK on success

Save child nameservers with glue addresses and optionally apply them as the active nameservers.

Operation: updateChildNameservers

Path parameters

domain required portal domain ID or full domain name

Body parameters

child_nameserver_action optional save_child_nameservers (default) or use_child_nameservers
child_nameservers required array of 2-5 objects
child_nameservers[].label required label such as ns1, or a full hostname inside the same domain
child_nameservers[].addresses required comma or space separated IPv4/IPv6 glue addresses

Good to know

  • Use use_child_nameservers to save the set and switch the domain to it in one request.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/child-nameservers" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"child_nameserver_action":"use_child_nameservers","child_nameservers":[{"label":"ns1","addresses":"192.0.2.10, 2001:db8::10"},{"label":"ns2","addresses":"192.0.2.11"}]}'

Request body

{
    "child_nameserver_action": "use_child_nameservers",
    "child_nameservers": [
        {
            "label": "ns1",
            "addresses": "192.0.2.10, 2001:db8::10"
        },
        {
            "label": "ns2",
            "addresses": "192.0.2.11"
        }
    ]
}

Sample response (200 OK)

{
    "success": true,
    "message": "Child nameservers saved and applied successfully.",
    "data": {
        "child_nsset_id": "NSSET123",
        "nameservers": [
            {
                "label": "ns1",
                "name": "ns1.example.co.tz",
                "addresses": [
                    "192.0.2.10",
                    "2001:db8::10"
                ]
            },
            {
                "label": "ns2",
                "name": "ns2.example.co.tz",
                "addresses": [
                    "192.0.2.11"
                ]
            }
        ]
    }
}

DNS management

Create, update and delete DNS records for domains using the free DNS management addon.

GET /domains/{domain}/dns No charge 200 OK on success

Read DNS management status and the editable DNS records of an owned domain.

Operation: getDnsRecords

Path parameters

domain required portal domain ID or full domain name

Good to know

  • DNS management is a free addon that must be enabled per domain with POST /domains/{domain}/dns/provision.

cURL

curl -X GET "https://reseller.co.tz/api/v1/domains/{domain}/dns" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "DNS records loaded successfully.",
    "data": {
        "dns_service": {
            "id": 10,
            "status": "active",
            "zone": "example.co.tz"
        },
        "records": [
            {
                "line": 24,
                "type": "A",
                "name": "@",
                "value": "192.0.2.10",
                "ttl": 14400
            },
            {
                "line": 25,
                "type": "CNAME",
                "name": "www",
                "value": "example.co.tz",
                "ttl": 14400
            }
        ]
    }
}
POST /domains/{domain}/dns/provision No charge 201 Created on success

Enable the free DNS management addon for an owned domain.

Operation: provisionDns

Path parameters

domain required portal domain ID or full domain name

Good to know

  • The portal points the domain at the managed nameservers when the addon is enabled.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/dns/provision" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (201 Created)

{
    "success": true,
    "message": "DNS management has been enabled.",
    "data": {
        "dns_service": {
            "id": 10,
            "status": "active",
            "zone": "example.co.tz",
            "provisioned_at": "2026-05-28T12:00:00.000000Z"
        }
    }
}
DELETE /domains/{domain}/dns No charge 200 OK on success

Cancel DNS management for an owned domain.

Operation: cancelDns

Path parameters

domain required portal domain ID or full domain name

Good to know

  • Removing DNS management does not delete the domain, but the portal stops serving its zone.

cURL

curl -X DELETE "https://reseller.co.tz/api/v1/domains/{domain}/dns" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "DNS management has been cancelled.",
    "data": {
        "dns_service": {
            "id": 10,
            "status": "cancelled",
            "zone": "example.co.tz",
            "cancelled_at": "2026-05-28T12:30:00.000000Z"
        }
    }
}
POST /domains/{domain}/dns/records No charge 201 Created on success

Create a DNS record. DNS management must be active for the domain.

Operation: createDnsRecord

Path parameters

domain required portal domain ID or full domain name

Body

required DNS record object, see schemas.dns_record

Good to know

  • Send replace_existing = true to overwrite an existing record with the same type and name instead of failing.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/dns/records" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"type":"A","name":"@","value":"192.0.2.10","ttl":14400,"replace_existing":true}'

Request body

{
    "type": "A",
    "name": "@",
    "value": "192.0.2.10",
    "ttl": 14400,
    "replace_existing": true
}

Sample response (201 Created)

{
    "success": true,
    "message": "DNS record created successfully.",
    "data": {
        "records": [
            {
                "line": 24,
                "type": "A",
                "name": "@",
                "value": "192.0.2.10",
                "ttl": 14400
            }
        ]
    }
}
PUT /domains/{domain}/dns/records/{record} No charge 200 OK on success

Update a DNS record by record line or record ID. DNS management must be active.

Operation: updateDnsRecord

Path parameters

domain required portal domain ID or full domain name
record required record line or record ID returned by GET /domains/{domain}/dns

Body

required DNS record object, see schemas.dns_record

cURL

curl -X PUT "https://reseller.co.tz/api/v1/domains/{domain}/dns/records/{record}" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"type":"A","name":"@","value":"192.0.2.20","ttl":14400}'

Request body

{
    "type": "A",
    "name": "@",
    "value": "192.0.2.20",
    "ttl": 14400
}

Sample response (200 OK)

{
    "success": true,
    "message": "DNS record updated successfully.",
    "data": {
        "records": [
            {
                "line": 24,
                "type": "A",
                "name": "@",
                "value": "192.0.2.20",
                "ttl": 14400
            }
        ]
    }
}
DELETE /domains/{domain}/dns/records/{record} No charge 200 OK on success

Delete a DNS record by record line or record ID. DNS management must be active.

Operation: deleteDnsRecord

Path parameters

domain required portal domain ID or full domain name
record required record line or record ID returned by GET /domains/{domain}/dns

cURL

curl -X DELETE "https://reseller.co.tz/api/v1/domains/{domain}/dns/records/{record}" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "DNS record deleted successfully.",
    "data": {
        "records": []
    }
}

Transfer lock, privacy and EPP codes

Protect a domain from unauthorised transfers and manage Whois privacy where the extension supports it.

POST /domains/{domain}/epp-code No charge 200 OK on success

Request the current Auth/EPP code so a customer can move the domain away.

Operation: requestEppCode

Path parameters

domain required portal domain ID or full domain name

Good to know

  • Only some extensions expose an Auth/EPP code. Others return an unsupported-action message.
  • Never store or log the code, and never print it in a public page.

cURL

curl -X POST "https://reseller.co.tz/api/v1/domains/{domain}/epp-code" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "EPP code requested successfully.",
    "data": {
        "epp_code": "sample-auth-code"
    }
}
PUT /domains/{domain}/epp-code No charge 200 OK on success

Set a new Auth/EPP code when the extension supports it.

Operation: setEppCode

Path parameters

domain required portal domain ID or full domain name

Body parameters

epp_code required string 8-128 characters

cURL

curl -X PUT "https://reseller.co.tz/api/v1/domains/{domain}/epp-code" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"epp_code":"new-sample-auth-code"}'

Request body

{
    "epp_code": "new-sample-auth-code"
}

Sample response (200 OK)

{
    "success": true,
    "message": "EPP code updated successfully.",
    "data": []
}
GET /domains/{domain}/lock No charge 200 OK on success

Read the transfer lock status where the extension supports a client lock.

Operation: getDomainLock

Path parameters

domain required portal domain ID or full domain name

cURL

curl -X GET "https://reseller.co.tz/api/v1/domains/{domain}/lock" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "Domain lock status loaded successfully.",
    "data": {
        "locked": true
    }
}
PUT /domains/{domain}/lock No charge 200 OK on success

Enable or disable the transfer lock where the extension supports it.

Operation: setDomainLock

Path parameters

domain required portal domain ID or full domain name

Body parameters

locked required boolean

Good to know

  • A locked domain cannot be transferred away until the lock is removed.

cURL

curl -X PUT "https://reseller.co.tz/api/v1/domains/{domain}/lock" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"locked":true}'

Request body

{
    "locked": true
}

Sample response (200 OK)

{
    "success": true,
    "message": "Domain lock updated successfully.",
    "data": {
        "locked": true
    }
}
GET /domains/{domain}/privacy No charge 200 OK on success

Read Whois privacy status where the extension supports it.

Operation: getWhoisPrivacy

Path parameters

domain required portal domain ID or full domain name

cURL

curl -X GET "https://reseller.co.tz/api/v1/domains/{domain}/privacy" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json"

Sample response (200 OK)

{
    "success": true,
    "message": "Whois privacy status loaded successfully.",
    "data": {
        "enabled": false
    }
}
PUT /domains/{domain}/privacy No charge 200 OK on success

Enable or disable Whois privacy where the extension supports it.

Operation: setWhoisPrivacy

Path parameters

domain required portal domain ID or full domain name

Body parameters

enabled required boolean

Good to know

  • Many country extensions, including .tz domains, do not offer Whois privacy.

cURL

curl -X PUT "https://reseller.co.tz/api/v1/domains/{domain}/privacy" \
  -H "X-API-KEY: $RESELLER_API_KEY" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

Request body

{
    "enabled": true
}

Sample response (200 OK)

{
    "success": true,
    "message": "Whois privacy updated successfully.",
    "data": {
        "enabled": true
    }
}

Data schemas

Request objects reused by the endpoints above. All fields are strings unless stated otherwise.

Contact

name required string max:120
organization required string max:120
address1 required string max:255
city required string max:120
state required string max:120
postcode required string max:30
country required ISO 3166-1 alpha-2 code, for example TZ (Tanzania) or ZA (South Africa)
phone required string max:40, include the country code when possible
email required valid email address max:255

Dns record

type required one of A, AAAA, CNAME, MX, TXT, SRV, CAA, NS
name required string max:253. Use @ for the root, * for a wildcard, or a label such as www
value required string max:1000. A takes IPv4, AAAA takes IPv6, CNAME/MX/SRV/NS take a hostname
ttl optional integer 60-86400, default 14400
priority optional integer 0-65535, commonly used for MX and SRV
weight optional integer 0-65535, commonly used for SRV
port optional integer 1-65535, commonly used for SRV
flag optional integer 0-255, commonly used for CAA
tag optional one of issue, issuewild, iodef, commonly used for CAA
replace_existing optional boolean, true to overwrite an existing record with the same type and name

Best practices

  • Call the API from your own backend only. Never ship the key inside browser JavaScript or a public mobile app bundle.
  • Store the key in an environment variable or secret manager, and whitelist the server IP in the reseller portal.
  • Show customers the friendly message; keep raw responses and technical detail in your own logs.
  • Never log or display Auth/EPP codes.
  • Billable calls are not idempotent, so add your own retry guard before repeating a registration or renewal.
  • After a transfer, poll POST /domains/{domain}/sync instead of assuming the move finished instantly.
  • Countries must be ISO 3166-1 alpha-2 codes: Tanzania TZ, Kenya KE, South Africa ZA.

Legacy API Support

Older integrations can continue posting action-based requests to the legacy endpoint. New projects should use /api/v1 because it is easier to validate, audit, and extend.

https://reseller.co.tz/api
Legacy Request
{
  "action": "registerDomain",
  "domainName": "example.co.tz",
  "period": 1,
  "nameservers": ["ns1.example.co.tz", "ns2.example.co.tz"],
  "registrantInfo": {
    "name": "Jane Doe",
    "organization": "Jane Doe Ltd",
    "address1": "123 Registry Road",
    "city": "Dar es Salaam",
    "state": "Dar es Salaam",
    "postcode": "11101",
    "country": "TZ",
    "phone": "+255.754123456",
    "email": "jane@example.co.tz"
  }
}
Legacy Response
{
  "status": "success",
  "message": "Domain registered successfully.",
  "data": {
    "domain": {
      "domain_name": "example.co.tz",
      "status": "active"
    }
  },
  "meta": {
    "balance_before": 100000,
    "balance_after": 65000
  }
}
Action Purpose
checkDomainCheck domain availability and pricing.
getDomainInfoFetch domain information.
registerDomainRegister a domain.
renewDomainRenew a domain.
transferDomainSubmit a domain transfer.
getNameservers / updateNameserversRead or update nameservers.
getWhois / updateWhoisRead or update Whois contacts.
getEPPCodeRequest the current EPP/Auth code.
provisionDns / cancelDnsEnable or cancel DNS management.
getDnsRecords / addDnsRecord / deleteDnsRecordManage DNS records.
getBalanceFetch current reseller balance.

Status Codes

Code Meaning
200 Request completed successfully.
201 The resource was created or a billable action completed successfully.
401 The API key is missing, revoked, or invalid.
403 The API key is valid but the calling IP is not whitelisted, or the account is not allowed to use the API.
404 The domain, record, or resource does not belong to the authenticated reseller account.
422 Validation failed, the balance is too low, the action is unsupported for this extension, or the registry could not complete the request.
429 Too many requests. Slow down and retry later.
500 Unexpected server error. Retry later and contact support if it continues.