https://dash.skyserver.in/developers/api
15 Nov 2026
Reseller API
Run your hosting business on top of SkyServer Cloud Technologies. Sell our hosting, Cloud VPS and domains under your own brand, pay from your wallet, control servers and handle support — straight from your website, billing system or scripts.
Authentication
Every request carries an API token in the Authorization header. Create tokens in the client area under
Account → API access. You choose each token's permissions, an optional expiry date and an
optional IP allowlist. The token is shown once when it is created — we only keep a hash of it.
curl https://dash.skyserver.in/api/v1/account \ -H "Authorization: Bearer sky_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
<?php
$token = getenv('SKY_TOKEN');
$ch = curl_init('https://dash.skyserver.in/api/v1/account');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, 'Accept: application/json'],
CURLOPT_TIMEOUT => 60,
]);
$res = json_decode(curl_exec($ch), true);
if (!$res['success']) {
throw new RuntimeException($res['error']['code'] . ': ' . $res['error']['message']);
}
echo 'Wallet balance: ' . $res['data']['wallet']['balance'];
const res = await fetch('https://dash.skyserver.in/api/v1/account', {
headers: { Authorization: `Bearer ${process.env.SKY_TOKEN}` },
});
const body = await res.json();
if (!body.success) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log('Wallet balance:', body.data.wallet.balance);
import os, requests
r = requests.get(
"https://dash.skyserver.in/api/v1/account",
headers={"Authorization": f"Bearer {os.environ['SKY_TOKEN']}"},
timeout=60,
)
body = r.json()
if not body["success"]:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print("Wallet balance:", body["data"]["wallet"]["balance"])
Requests & responses
Send request bodies as JSON with Content-Type: application/json (form encoding also works). Every response is JSON
with the same envelope, and every response carries a request_id — quote it when you contact support.
Success
{
"success": true,
"message": "Optional human-readable note",
"data": {
"…": "…"
},
"meta": {
"page": 1,
"per_page": 25,
"total": 3,
"total_pages": 1
},
"request_id": "9f2c1d0a7b6e5f43"
}Error
{
"success": false,
"error": {
"code": "insufficient_scope",
"message": "This token does not have the \"services:power\" permission.",
"required_scope": "services:power"
},
"request_id": "9f2c1d0a7b6e5f43"
}Money is a number in the invoice's currency (INR) with two decimals. Dates are YYYY-MM-DD; timestamps are ISO 8601 with
the time-zone offset (2026-11-12T13:30:00+05:30). IDs are integers unless documented otherwise.
Errors
Check the HTTP status first, then error.code — a stable string you can switch on. error.message is written
for people and may change.
| Status | Codes | Meaning |
|---|---|---|
| 400 | invalid_json invalid_idempotency_key | The request could not be read. |
| 401 | unauthenticated invalid_token | No token, or the token is wrong, revoked or expired. |
| 402 | insufficient_balance | The wallet balance does not cover the invoice. |
| 403 | insufficient_scope ip_not_allowed api_access_disabled account_inactive email_not_verified | Authenticated, but not allowed to do this. |
| 404 | not_found route_not_found feature_disabled | The resource does not exist or is not yours. |
| 405 | method_not_allowed | Wrong HTTP method. |
| 409 | conflict already_paid service_not_active not_ready ticket_closed idempotency_in_progress | The request clashes with the current state. |
| 422 | validation_failed request_failed order_failed confirmation_required not_supported registrant_details_required idempotency_key_reused | The request was understood but cannot be done as sent. |
| 429 | rate_limited | Too many requests. Wait for Retry-After seconds. |
| 5xx | internal_error upstream_error | Something failed on our side. Safe to retry with the same Idempotency-Key. |
Rate limits
Each token may make 120 requests per minute. Every response tells you where you stand:
| X-RateLimit-Limit | Requests allowed in the current window |
| X-RateLimit-Remaining | Requests left in the current window |
| X-RateLimit-Reset | Unix time when the window resets |
| Retry-After | On a 429: seconds to wait before retrying |
Some actions have their own, tighter limits per account: power actions 6 per minute per server (60 in total), reinstalls 3 per 10 minutes per server, orders and payments 30 per hour, domain orders 20 per hour, new tickets 20 per hour.
Idempotency
Networks fail. To retry an order, a payment, a reinstall or a new ticket safely, send an Idempotency-Key header with a
unique value (a UUID is ideal). If we have already handled a request with that key, we return the original response again
(with Idempotent-Replayed: true) instead of ordering or charging twice. Keys are kept for 48 hours.
curl -X POST https://dash.skyserver.in/api/v1/orders \
-H "Authorization: Bearer $SKY_TOKEN" \
-H "Idempotency-Key: 3b0f4c9e-1f7a-4a52-9c1e-0d9b2f1a7e10" \
-H "Content-Type: application/json" \
-d '{"product_id": 41, "billing_cycle": "monthly", "location": "in-mum-1", "pay_with_wallet": true}'
Reusing a key with a different body is refused with 422 idempotency_key_reused. A retry while the first request is
still running gets 409 idempotency_in_progress.
Pagination
List endpoints take page (from 1) and per_page (1-100, default 25) and return a meta object with
page, per_page, total and total_pages.
Permissions
A token can only do what its permissions allow. Give each integration the smallest set it needs; WRITE permissions can change things or spend money.
account:readRead your profile, wallet balance and wallet transactions.
catalog:readList products, prices, order options and check domain availability.
orders:writeWRITEOrder new services. An invoice is created; it can be paid from the wallet.
invoices:readList invoices and read their line items.
invoices:payWRITEPay unpaid invoices from the wallet balance.
services:readList services and servers, their status, IP and renewal dates.
services:powerWRITEStart, stop, shut down and reboot VPS servers.
services:rebuildWRITEReinstall the OS of a VPS. Erases all data on that server.
domains:readList domains, expiry dates and nameservers.
domains:writeWRITERegister domains and change nameservers.
tickets:readList support tickets and read their replies.
tickets:writeWRITEOpen support tickets and reply to them.
Selling a server, end to end
A typical storefront integration — your customer pays you, you buy from us with your wallet:
- Show plans. List products and add your own margin to
pricing[].price. - Ask for options. Get a product returns the locations and operating systems to offer.
- Order and pay. Create an order with
pay_with_wallet: trueand anIdempotency-Key. - Wait for it. Poll Get a service every 30-60 seconds until
statusisactiveandip_addressis set. - Hand over control. Offer your customer power and reinstall buttons that call the API.
- Renew. Each period a renewal invoice appears: list unpaid invoices daily and pay them before
due_date, or the service is suspended.
Account
Check a token
Confirms the token works and shows its permissions. Handy as the first call of an integration.
Request
curl "https://dash.skyserver.in/api/v1/ping" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": {
"pong": true,
"client_id": 1042,
"token": {
"id": 7,
"name": "My WHMCS",
"prefix": "sky_live_Ab12",
"scopes": [
"account:read",
"services:read"
],
"expires_at": null
},
"server_time": "2026-11-12T13:30:00+05:30"
},
"request_id": "9f2c1d0a7b6e5f43"
}
Get account
Your profile, wallet balance, money owed and how many services you have in each status.
Request
curl "https://dash.skyserver.in/api/v1/account" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": {
"id": 1042,
"first_name": "Asha",
"last_name": "Verma",
"email": "asha@example.com",
"company": "Verma Web Studio",
"wallet": {
"enabled": true,
"balance": 12500.0,
"currency": "INR"
},
"billing": {
"unpaid_invoices": 1,
"amount_due": 1179.819999999999936335370875895023345947265625,
"currency": "INR"
},
"services": {
"active": 14,
"suspended": 1
}
},
"request_id": "…"
}
List wallet transactions
Every movement of your wallet balance, newest first. Paginated (default 50 per page).
Query parameters
| Parameter | Type | Description |
|---|---|---|
| page | int | Page number, from 1 |
| per_page | int | 1-100 |
Request
curl "https://dash.skyserver.in/api/v1/account/wallet/transactions" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"id": 881,
"direction": "debit",
"amount": 1179.819999999999936335370875895023345947265625,
"balance_after": 12500.0,
"currency": "INR",
"type": "invoice_payment",
"reference": {
"type": "invoice",
"id": 5521
},
"note": null,
"created_at": "2026-11-12T13:02:11+05:30"
}
],
"meta": {
"page": 1,
"per_page": 50,
"total": 37,
"total_pages": 1
},
"request_id": "…"
}
Catalog
List products
Every product you can order, grouped like the store, with the price of each billing cycle. Prices exclude GST, which is added on the invoice.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| group_id | int | Only this product group |
Request
curl "https://dash.skyserver.in/api/v1/products" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"id": 3,
"name": "Cloud VPS",
"slug": "cloud-vps",
"description": null,
"products": [
{
"id": 41,
"group_id": 3,
"name": "Cloud VPS 4 GB",
"type": "cloud_vps",
"currency": "INR",
"setup_fee": 0.0,
"pricing": [
{
"cycle": "monthly",
"label": "Monthly",
"months": 1,
"price": 999.0,
"per_month": 999.0
},
{
"cycle": "annual",
"label": "Annual",
"months": 12,
"price": 9990.0,
"per_month": 832.5
}
],
"features": [
"4 GB RAM",
"2 vCPU",
"80 GB NVMe"
],
"in_stock": true
}
]
}
],
"request_id": "…"
}
Get a product and its order options
One product, plus an order block that says which fields Create an order needs for it and, for Cloud VPS, the locations and operating systems you can pick.
Request
curl "https://dash.skyserver.in/api/v1/products/123" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": {
"id": 41,
"name": "Cloud VPS 4 GB",
"type": "cloud_vps",
"pricing": [
"…"
],
"order": {
"required": [
"product_id",
"billing_cycle",
"location"
],
"optional": [
"coupon",
"notes",
"pay_with_wallet",
"os_id"
],
"choices": {
"locations": [
{
"id": "in-mum-1",
"name": "Mumbai, India"
}
],
"os": [
{
"id": "ubuntu-24.04",
"name": "Ubuntu 24.04",
"default": true
}
]
}
}
},
"request_id": "…"
}
Check domain availability
Live availability and price of one name across up to 10 extensions.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| domain | string | Required. Comma separated, same name: example.com,example.in |
Request
curl "https://dash.skyserver.in/api/v1/domains/availability?domain=example.com,example.in" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"domain": "example.in",
"available": true,
"status": "available",
"price": 699.0,
"renewal_price": 899.0,
"currency": "INR",
"period_years": 1
}
],
"request_id": "…"
}
Orders
Create an order
Orders a service exactly like the store's checkout does — same prices, coupons, stock and location checks. An invoice is created; send pay_with_wallet: true to pay it from your wallet straight away, which starts provisioning. Without it, pay later with Pay an invoice.
Body
| Field | Type | Description |
|---|---|---|
| product_idrequired | int | From List products |
| billing_cyclerequired | string | monthly quarterly semi_annual annual biennial triennial — one the product has a price for |
| domain | string | Required for hosting, reseller and email products |
| register_domain | bool | Hosting: also register domain in the same order |
| domain_years | int | 1-10, with register_domain |
| location | string | Server location id (Cloud VPS: required) — see the product's order.choices |
| os_id | string | Operating system: an id from the product’s order.choices.os. Left out, the one marked default is installed (Windows plans list only Windows images) |
| hostname | string | VPS products that ask for one |
| password | string | Root password (min 8), VPS products that ask for one |
| coupon | string | Coupon code |
| notes | string | Order notes, up to 1000 characters |
| pay_with_wallet | bool | Pay the invoice from the wallet now |
| options | object | Extra order-form fields for configurable server products |
Request
curl -X POST "https://dash.skyserver.in/api/v1/orders" \
-H "Authorization: Bearer $SKY_TOKEN" \
-H "Idempotency-Key: 6f1c2b0e-order-0001" \
-H "Content-Type: application/json" \
-d '{"product_id":41,"billing_cycle":"monthly","location":"in-mum-1","os_id":"ubuntu-24.04","pay_with_wallet":true}'
Response 201
{
"success": true,
"message": "Order placed and paid from the wallet. Provisioning has started.",
"data": {
"order": {
"id": 3310,
"number": "ORD-20261112-3310",
"status": "pending"
},
"invoice": {
"id": 5522,
"number": "INV-2026-5522",
"status": "paid",
"currency": "INR",
"subtotal": 999.0,
"tax": 179.81999999999999317878973670303821563720703125,
"total": 1178.819999999999936335370875895023345947265625,
"amount_due": 0.0,
"items": [
"…"
]
},
"services": [
{
"id": 9021,
"name": "Cloud VPS 4 GB",
"status": "pending"
}
],
"payment": {
"paid": true,
"message": "Invoice paid from wallet."
}
},
"request_id": "…"
}
payment.paid is false with error_code: insufficient_balance, and the invoice stays unpaid. Poll Get a service until status is active.Invoices
List invoices
Newest first. Paginated.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| status | string | all (default) unpaid paid overdue cancelled refunded |
| service_id | int | Only invoices of this service |
| page | int | |
| per_page | int | 1-100, default 25 |
Request
curl "https://dash.skyserver.in/api/v1/invoices" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"id": 5521,
"number": "INV-2026-5521",
"status": "unpaid",
"currency": "INR",
"subtotal": 999.0,
"tax": 179.81999999999999317878973670303821563720703125,
"total": 1178.819999999999936335370875895023345947265625,
"wallet_applied": 0.0,
"amount_due": 1178.819999999999936335370875895023345947265625,
"due_date": "2026-11-19",
"paid_at": null,
"service_id": 9020
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"total_pages": 1
},
"request_id": "…"
}
Get an invoice
One invoice with its line items.
Request
curl "https://dash.skyserver.in/api/v1/invoices/123" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": {
"id": 5521,
"number": "INV-2026-5521",
"status": "unpaid",
"total": 1178.819999999999936335370875895023345947265625,
"items": [
{
"description": "Cloud VPS 4 GB — Monthly",
"quantity": 1.0,
"unit_price": 999.0,
"tax_rate": 18.0,
"total": 999.0,
"type": "service"
}
]
},
"request_id": "…"
}
Pay an invoice
Pays an unpaid invoice in full from your wallet. This runs the normal paid-invoice steps: the service is provisioned or renewed. Top up the wallet in the client area.
Request
curl -X POST "https://dash.skyserver.in/api/v1/invoices/123/pay" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"message": "Invoice paid from wallet.",
"data": {
"id": 5521,
"status": "paid",
"amount_due": 0.0,
"paid_at": "2026-11-12T13:40:02+05:30"
},
"request_id": "…"
}
402 insufficient_balance, 409 already_paid.Services
List services
All your services — hosting, servers, everything — newest first. actions tells you which server actions a service supports right now.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| status | string | active pending suspended cancelled terminated |
| type | string | hosting reseller cloud_vps vps dedicated … |
| page | int | |
| per_page | int |
Request
curl "https://dash.skyserver.in/api/v1/services" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"id": 9020,
"name": "Cloud VPS 4 GB",
"type": "cloud_vps",
"status": "active",
"domain": null,
"hostname": "vps1.example.com",
"ip_address": "203.0.113.25",
"product_id": 41,
"billing_cycle": "monthly",
"recurring_amount": 999.0,
"currency": "INR",
"next_due_date": "2026-12-12",
"actions": {
"power": [
"start",
"stop",
"shutdown",
"reboot"
],
"rebuild": true
}
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 15,
"total_pages": 1
},
"request_id": "…"
}
Get a service
One service, with disk and bandwidth use where known and the ids of its unpaid invoices.
Request
curl "https://dash.skyserver.in/api/v1/services/123" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": {
"id": 9020,
"status": "active",
"type": "cloud_vps",
"ip_address": "203.0.113.25",
"disk": {
"used_mb": null,
"limit_mb": null
},
"unpaid_invoice_ids": []
},
"request_id": "…"
}
Start, stop or reboot a server
Sends a power action to a VPS. The action runs in the background and takes up to a minute. Limited to 6 per minute per server.
Body
| Field | Type | Description |
|---|---|---|
| actionrequired | string | start · stop (power off now) · shutdown (graceful) · reboot |
Request
curl -X POST "https://dash.skyserver.in/api/v1/services/123/power" \
-H "Authorization: Bearer $SKY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"action":"reboot"}'
Response 202
{
"success": true,
"message": "Reboot sent. It can take up to a minute.",
"data": {
"service_id": 9020,
"action": "reboot",
"accepted": true
},
"request_id": "…"
}
409 service_not_active (suspended or not active), 409 not_ready (still being set up), 422 not_supported (not a VPS).List operating systems for a reinstall
The operating systems this server can be reinstalled with. Use an id as os_id in Reinstall a server.
Request
curl "https://dash.skyserver.in/api/v1/services/123/os-templates" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"id": "ubuntu-24.04",
"name": "Ubuntu 24.04 LTS",
"current": true
},
{
"id": "debian-12",
"name": "Debian 12"
}
],
"request_id": "…"
}
Reinstall a server
Erases everything on the server and installs a fresh operating system. Limited to 3 per 10 minutes per server.
Body
| Field | Type | Description |
|---|---|---|
| os_idrequired | string | From List operating systems |
| confirmrequired | string | Must be exactly REBUILD |
| password | string | New root password, 8-72 characters. Some server types require it; others generate one |
| ssh_keys | string | Cloud VPS: public SSH keys to install, one per line |
Request
curl -X POST "https://dash.skyserver.in/api/v1/services/123/rebuild" \
-H "Authorization: Bearer $SKY_TOKEN" \
-H "Idempotency-Key: 6f1c2b0e-order-0001" \
-H "Content-Type: application/json" \
-d '{"os_id":"debian-12","confirm":"REBUILD"}'
Response 202
{
"success": true,
"message": "Reinstall started. It takes a few minutes.",
"data": {
"service_id": 9020,
"os_id": "debian-12",
"accepted": true
},
"request_id": "…"
}
Domains
List domains
Your domains with expiry dates and nameservers. Paginated.
Request
curl "https://dash.skyserver.in/api/v1/domains" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"id": 310,
"domain": "example.in",
"tld": "in",
"status": "active",
"registration_date": "2025-11-12",
"expiry_date": "2026-11-12",
"auto_renew": true,
"nameservers": [
"ns1.example.net",
"ns2.example.net"
]
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"total_pages": 1
},
"request_id": "…"
}
Get a domain
One domain.
Request
curl "https://dash.skyserver.in/api/v1/domains/123" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": {
"id": 310,
"domain": "example.in",
"status": "active",
"expiry_date": "2026-11-12",
"nameservers": [
"ns1.example.net",
"ns2.example.net"
]
},
"request_id": "…"
}
Register a domain
Orders a domain registration and creates its invoice. Your account needs a full address and phone number (the registrar requires them).
Body
| Field | Type | Description |
|---|---|---|
| domainrequired | string | Full name, e.g. example.in |
| years | int | Registration period, default 1 |
| nameservers | array | 2-4 host names; leave out for our default nameservers |
| id_protection | bool | Add ID protection where the extension supports it |
| pay_with_wallet | bool | Pay the invoice from the wallet now |
Request
curl -X POST "https://dash.skyserver.in/api/v1/domains/register" \
-H "Authorization: Bearer $SKY_TOKEN" \
-H "Idempotency-Key: 6f1c2b0e-order-0001" \
-H "Content-Type: application/json" \
-d '{"domain":"example.in","years":1,"pay_with_wallet":true}'
Response 201
{
"success": true,
"message": "Domain ordered and paid from the wallet. Registration has started.",
"data": {
"invoice": {
"id": 5530,
"status": "paid",
"total": 824.8200000000000500222085975110530853271484375
},
"payment": {
"paid": true,
"message": "Invoice paid from wallet."
}
},
"request_id": "…"
}
422 registrant_details_required — complete your profile address first.Change nameservers
Sets 2-4 nameservers. Some extensions are changed by our team — then status is pending_review.
Body
| Field | Type | Description |
|---|---|---|
| nameserversrequired | array | 2-4 host names |
Request
curl -X POST "https://dash.skyserver.in/api/v1/domains/123/nameservers" \
-H "Authorization: Bearer $SKY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"nameservers":["ns1.example.net","ns2.example.net"]}'
Response 200
{
"success": true,
"message": "Nameservers updated successfully.",
"data": {
"domain_id": 310,
"nameservers": [
"ns1.example.net",
"ns2.example.net"
],
"status": "updated"
},
"request_id": "…"
}
Support
List departments
Departments a ticket can be opened in.
Request
curl "https://dash.skyserver.in/api/v1/tickets/departments" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"id": 1,
"name": "Technical Support"
},
{
"id": 2,
"name": "Billing"
}
],
"request_id": "…"
}
List tickets
Most recently updated first. Paginated.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| status | string | open answered client_reply on_hold closed |
Request
curl "https://dash.skyserver.in/api/v1/tickets" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": [
{
"id": 778,
"number": "TKT-20261112-4F2A1C",
"subject": "Server not reachable",
"status": "answered",
"priority": "high",
"department": {
"id": 1,
"name": "Technical Support"
},
"created_at": "2026-11-12T10:02:00+05:30"
}
],
"meta": {
"page": 1,
"per_page": 25,
"total": 1,
"total_pages": 1
},
"request_id": "…"
}
Get a ticket
One ticket with its conversation (internal staff notes are never included).
Request
curl "https://dash.skyserver.in/api/v1/tickets/123" \ -H "Authorization: Bearer $SKY_TOKEN"
Response 200
{
"success": true,
"data": {
"id": 778,
"subject": "Server not reachable",
"status": "answered",
"messages": [
{
"id": 1,
"from": "client",
"message": "My VPS 9020 does not answer since 10:00.",
"created_at": "…"
},
{
"id": 2,
"from": "staff",
"message": "Fixed — a network change upstream. Sorry for the trouble!",
"created_at": "…"
}
]
},
"request_id": "…"
}
Open a ticket
Opens a support ticket. Our team is notified as usual.
Body
| Field | Type | Description |
|---|---|---|
| department_idrequired | int | From List departments |
| subjectrequired | string | Up to 255 characters |
| messagerequired | string | |
| priority | string | low medium (default) high critical |
Request
curl -X POST "https://dash.skyserver.in/api/v1/tickets" \
-H "Authorization: Bearer $SKY_TOKEN" \
-H "Idempotency-Key: 6f1c2b0e-order-0001" \
-H "Content-Type: application/json" \
-d '{"department_id":1,"subject":"Need a reverse DNS record","message":"Please set PTR for 203.0.113.25 to mail.example.com","priority":"medium"}'
Response 201
{
"success": true,
"message": "Ticket opened.",
"data": {
"id": 779,
"number": "TKT-20261112-8B1D0E",
"status": "open"
},
"request_id": "…"
}
Reply to a ticket
Adds your reply to an open ticket.
Body
| Field | Type | Description |
|---|---|---|
| messagerequired | string |
Request
curl -X POST "https://dash.skyserver.in/api/v1/tickets/123/reply" \
-H "Authorization: Bearer $SKY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"message":"Thanks, all working now."}'
Response 201
{
"success": true,
"message": "Reply added.",
"data": {
"ticket_id": 779,
"status": "client_reply"
},
"request_id": "…"
}
409 ticket_closed.Security checklist
- Use one token per integration, named after it, so you can revoke one without touching the others.
- Give each token only the permissions it needs, and an IP allowlist with your server's addresses.
- Store tokens in environment variables or a secrets manager, never in source code.
- Watch Recent API calls for requests you do not recognise; revoke the token at once if you see any.
- Always send an
Idempotency-Keyon orders and payments, and retry 5xx / network errors with the same key.
Changelog
We add fields and endpoints without notice; your code should ignore fields it does not know. Anything that would break an
existing integration goes into a new version (/api/v2).