Reseller program · API
RyzenRDP reseller API v1 reference
The RyzenRDP reseller API is a REST API over HTTPS for accounts in the reseller program. It lists plans and prices, orders Windows or Linux servers, controls power, resets passwords and reads the wallet. Requests and responses are JSON, and the base address is https://ryzenrdp.com/api/v1.
Quick start
Four steps take you from a funded account to a running server. Replace rzk_YOUR_API_KEY with a
key from the Reseller API page of your console.
# 1. Your account: status, balance, discount and server cap
curl https://ryzenrdp.com/api/v1/account \
-H "Authorization: Bearer rzk_YOUR_API_KEY"
# 2. Plans, with your price and live stock for each location
curl https://ryzenrdp.com/api/v1/plans \
-H "Authorization: Bearer rzk_YOUR_API_KEY"
# 3. Order a server: the first month is charged from the wallet
curl https://ryzenrdp.com/api/v1/servers \
-H "Authorization: Bearer rzk_YOUR_API_KEY" \
-H "Idempotency-Key: order-2026-0001" \
-H "Content-Type: application/json" \
-d '{"plan": "amd-ryzen-t1", "location": "new-york",
"os": "ws2022", "label": "client-42"}'
# 4. Poll until "state" is "active", then read the login details
curl https://ryzenrdp.com/api/v1/servers/srv_0123456789abcdef \
-H "Authorization: Bearer rzk_YOUR_API_KEY"
curl https://ryzenrdp.com/api/v1/servers/srv_0123456789abcdef/credentials \
-H "Authorization: Bearer rzk_YOUR_API_KEY"
A new server is usually active within minutes. If the build fails, the charge is refunded to the
wallet and the state becomes failed.
Authentication
Every request carries an API key in the Authorization header:
Authorization: Bearer rzk_YOUR_API_KEY
- Keys start with
rzk_. You create them on the Reseller API page of your console (in the account menu), once your account has been admitted to the reseller program and its first wallet deposit has been credited. - A key is shown once, when you create it. We store only its hash, so keep the key somewhere safe; if you lose it, revoke it and create a new one.
- An account can hold up to 5 active keys, and you can revoke a key at any time.
- A missing or invalid key is answered with
401 unauthorized. An account that cannot use the API is answered with403 forbidden. GET /account,/plans,/locations,/os,/transactions,/serversand/servers/{id}work in every account state. Ordering, changing or deleting a server, and thestatus,power,password,credentialsandreinstallcalls, need an account whose status isactive. The first wallet deposit makes an account active; in any other state these calls answer403 account_not_active.
Conventions
- Base address:
https://ryzenrdp.com/api/v1. Every path on this page is relative to it. - Format: JSON in, JSON out, UTF-8.
- Money is a decimal string in US dollars, for example
"14.99". - Times are ISO 8601 in UTC, for example
"2026-12-11T10:04:00Z". - Server ids look like
srv_0123456789abcdef.
Errors
An error is a JSON object with a code and a message, sent with a matching HTTP status. Have your software match on the code; the message is written for people.
| Code | Status | Meaning |
|---|---|---|
invalid_json | 400 | The request body must be a JSON object. |
unauthorized | 401 | The API key is missing or invalid. |
insufficient_funds | 402 | The wallet balance is too low for this order. |
forbidden | 403 | This account cannot use the reseller API. |
account_not_active | 403 | The account's status is not active. The first wallet deposit activates a new account. |
account_on_hold | 403 | The account is on hold. Contact support. |
not_found | 404 | No such resource or server. |
method_not_allowed | 405 | That method is not supported on this resource. |
out_of_stock | 409 | That plan is out of stock in that location. |
invalid_state | 409 | The server is in a state that does not allow this call. |
refused | 409 | The action could not be completed, for example because the password is no longer stored. |
busy | 409 | The server is being built and cannot be deleted yet. Try again in a few minutes. |
body_too_large | 413 | The request body is too large. |
unknown_plan | 422 | That plan is not offered in that location. See GET /plans. |
unknown_os | 422 | Unknown operating system. See GET /os. |
os_needs_more_ram | 422 | That operating system needs a plan with more memory. |
invalid_field | 422 | A field has the wrong type or value. |
invalid_action | 422 | action must be start, stop, restart or poweroff. |
invalid_idempotency_key | 422 | Idempotency-Key must be 8 to 80 characters: letters, digits, -, _, . and :. |
confirmation_required | 422 | A reinstall needs confirm set to the server id. |
nothing_to_change | 422 | Send auto_renew, label or both. |
rate_limited | 429 | Too many requests. Wait for the seconds given in Retry-After. |
server_limit | 429 | The account has reached its server cap. Contact support to raise it. |
create_rate | 429 | Too many servers ordered in the last hour. |
internal_error | 500 | Something went wrong on our side. Try again shortly. |
upstream_error | 502 | The server could not complete that action right now. Try again shortly. |
unavailable | 503 | The API is temporarily unavailable. Try again shortly. |
An error response looks like this:
{"error": {"code": "insufficient_funds",
"message": "The wallet balance is too low. Add funds and try again."}}
Every error has this shape, so a client can handle a code it does not know by its HTTP status.
Rate limits and idempotency
- Rate limits are per account: 120 reads and 30 writes a minute. A request over the limit is
answered with
429 rate_limitedand aRetry-Afterheader. - Account caps also answer
429:server_limitwhen the account has reached its cap on running servers, andcreate_ratewhen too many servers were ordered in the last hour.GET /accountreturns your running servers and your cap. - Idempotency.
POST /serversaccepts anIdempotency-Keyheader of 8 to 80 characters: letters, digits,-,_,.and:. Repeating the call with the same key returns the same server and charges the wallet once, so a timed-out order is safe to retry. Keys are compared exactly: a key that differs only in case is a new order.
Account and catalog
GET /account
Your account status, wallet balance, current discount, sales and server cap.
{"status": "active", "balance": "42.51", "currency": "USD", "discount_pct": 10,
"sales_this_month": 12, "sales_last_month": 4,
"next_tier": {"sales": 20, "discount_pct": 15},
"servers": {"live": 12, "limit": 50}, "min_topup": "20.00"}
Funds are added in the console, by cryptocurrency or a credit or debit card. The wallet is credited within a few minutes of payment.
GET /plans
Plans with your current price for each location.
{"discount_pct": 10, "plans": [
{"id": "amd-ryzen-t1", "family": "amd-ryzen", "name": "AMD Ryzen T1",
"vcpu": 2, "ram_gb": 2, "disk_gb": 40, "disk_type": "NVMe SSD", "port_gbps": 1,
"billing": "monthly", "currency": "USD",
"locations": [
{"id": "new-york", "in_stock": true, "list_price": "14.99", "price": "13.49"}
]}
]}
The figures only illustrate the shape. Read live values from the endpoint.
GET /locations
{"locations": [{"id": "new-york", "name": "New York, USA"}]}
GET /os
The operating systems you can install, each with the minimum memory it needs.
{"os": [{"id": "ws2022", "name": "Windows Server 2022", "type": "windows", "min_ram_mb": 2048}]}
GET /transactions
The wallet ledger, newest first. Query parameters: limit (for example 50) and before, the
id of a transaction, to page back. type is one of topup, charge, renewal, refund and
adjust.
{"transactions": [
{"id": 31, "type": "charge", "amount": "-13.49", "balance_after": "29.02", "currency": "USD",
"server": "srv_0123456789abcdef", "invoice_id": null, "note": "New server …",
"created_at": "2026-11-11T10:02:11Z"}
]}
Servers
GET /servers and GET /servers/{id}
GET /servers lists your servers; add ?all=1 to include terminated and failed ones.
GET /servers/{id} returns one server.
{"server": {"id": "srv_0123456789abcdef", "label": "client-42", "plan": "amd-ryzen-t1",
"location": "new-york", "os": "ws2022", "state": "active",
"ip_address": "203.0.113.10", "hostname": "…",
"price": "13.49", "list_price": "14.99", "discount_pct": 10, "currency": "USD",
"auto_renew": true, "paid_until": "2026-12-11T10:04:00Z", "overdue": false,
"created_at": "2026-11-11T10:02:11Z", "terminated_at": null, "error": null}}
POST /servers
Orders a server. label is optional.
{"plan": "amd-ryzen-t1", "location": "new-york", "os": "ws2022", "label": "client-42"}
The first month is charged from the wallet and the build is queued. The API answers 202 with
the server in the state queued; poll GET /servers/{id} until the state is active. If the
build fails, the charge is refunded and the state becomes failed.
PATCH /servers/{id}
Changes auto_renew, label or both.
{"auto_renew": false, "label": "new label"}
With auto_renew off, the server is deleted at the end of the paid period.
DELETE /servers/{id}
Destroys the server and its data, and answers 202. POST /servers/{id}/terminate does the
same. The current month is not refunded. A server that has not started building yet is canceled
and refunded in full. While a server is being built the call answers 409 busy: try again in a
few minutes.
GET /servers/{id}/status
The server's state, power state and usage.
{"id": "srv_…", "state": "active", "power_state": "running",
"usage": {"cpu_percent": 3, "ram_used_mb": 1210, "ram_mb": 2048,
"disk_used_gb": 21, "disk_gb": 40, "bandwidth_used_gb": 12},
"pending_restart": false}
POST /servers/{id}/power
action is start, stop, restart or poweroff. Answers 202.
{"action": "restart"}
POST /servers/{id}/password
Generates a new administrator or root password. If the answer carries
"applies_on_next_boot": true, restart the server first, then read /credentials.
GET /servers/{id}/credentials
The login details of the server.
{"id": "srv_…", "username": "Administrator", "password": "…", "ip_address": "203.0.113.10",
"port": 3389, "protocol": "rdp", "available_until": "2026-11-18T10:04:00Z"}
The password is held only for a set period after a build or a reset, shown as
available_until. After that this call answers 409 refused: reset the password and read it
again. Every read is recorded in the audit log.
POST /servers/{id}/reinstall
Reinstalls the operating system and erases all data on the server. confirm must be the id of
the server. Answers 202.
{"os": "ubuntu2404", "confirm": "srv_0123456789abcdef"}
Server states and billing lifecycle
A server's state is one of seven values.
| State | Meaning |
|---|---|
queued | The order is paid and waiting to be built. |
provisioning | The server is being built. |
active | The server is built and in service. |
suspended | The server is suspended because a renewal could not be paid. Adding funds restores it. |
terminating | The server is being deleted. |
terminated | The server and its data are deleted. |
failed | The build failed and the charge was refunded to the wallet. |
What to expect over a server's life:
- The wallet is funded and the account becomes
active. POST /serverscreates the server asqueued, and it becomesactive, usually within minutes.- Each month, on
paid_until, the server renews from the wallet at the discount tier in effect that day. - If the balance is too low, the server shows
"overdue": trueand you get an e-mail warning. It is suspended after 48 hours and deleted 5 days later. Adding funds at any point before deletion renews and restores the server automatically.
The discount tiers and the wallet rules are on the reseller program page.
Security notes
- Keep API keys on your own server. Do not put a key in a browser, a mobile app or a public code repository.
- If a key may have leaked, revoke it on the Reseller API page of your console and create a new one.
- Every change made through the API and every read of
/credentialsis recorded in the audit log. - A password is held only for a set period after a build or a reset. Read it, store it the way you store other secrets, and reset it if you need it again later.
- A reinstall needs the server id in
confirm, which guards against erasing the wrong server by mistake.
Reseller API FAQ
How do I get an API key?
You create API keys on the Reseller API page of your console, which appears in the account menu once your account has been admitted to the reseller program. The program is by invitation: apply with a support ticket from our contact page. Keys can be created once the first wallet deposit has been credited. A key is shown once, and an account can hold up to 5 active keys.
What happens if I send the same order twice?
If both calls carry the same Idempotency-Key, the second one returns the same server and the wallet is charged once. Keys are 8 to 80 characters (letters, digits, -, _, . and :) and are compared exactly. Send a new key for each new order, and reuse it only to retry that order.
How long until a new server is active?
Usually minutes. POST /servers answers 202 with the server in the state queued; poll GET /servers/{id} until the state is active, then read /credentials. If the build fails, the charge is refunded to the wallet and the state becomes failed.
Is there a test mode?
There is no separate test environment. Read calls such as GET /account, GET /plans and GET /os never charge the wallet and work as soon as you have a key. An order is a real order: one that has not started building can be deleted for a full refund to the wallet.
Get access to the reseller API
The API is part of the reseller program, which is by invitation. Open a support ticket from our contact page and tell us what you are building.