API v1 Support Get an API token

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.

Base URL https://dash.skyserver.in/api/v1 Format JSON over HTTPS Auth Bearer token Rate limit 120 req/min per token

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"
Keep tokens on your server. A token acts as your account within its permissions. Never put it in browser JavaScript, a mobile app or a public repository. The API does not answer browser cross-origin requests.

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.

StatusCodesMeaning
400invalid_json invalid_idempotency_keyThe request could not be read.
401unauthenticated invalid_tokenNo token, or the token is wrong, revoked or expired.
402insufficient_balanceThe wallet balance does not cover the invoice.
403insufficient_scope ip_not_allowed api_access_disabled account_inactive email_not_verifiedAuthenticated, but not allowed to do this.
404not_found route_not_found feature_disabledThe resource does not exist or is not yours.
405method_not_allowedWrong HTTP method.
409conflict already_paid service_not_active not_ready ticket_closed idempotency_in_progressThe request clashes with the current state.
422validation_failed request_failed order_failed confirmation_required not_supported registrant_details_required idempotency_key_reusedThe request was understood but cannot be done as sent.
429rate_limitedToo many requests. Wait for Retry-After seconds.
5xxinternal_error upstream_errorSomething 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-LimitRequests allowed in the current window
X-RateLimit-RemainingRequests left in the current window
X-RateLimit-ResetUnix time when the window resets
Retry-AfterOn 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:read

Read your profile, wallet balance and wallet transactions.

catalog:read

List products, prices, order options and check domain availability.

orders:writeWRITE

Order new services. An invoice is created; it can be paid from the wallet.

invoices:read

List invoices and read their line items.

invoices:payWRITE

Pay unpaid invoices from the wallet balance.

services:read

List services and servers, their status, IP and renewal dates.

services:powerWRITE

Start, stop, shut down and reboot VPS servers.

services:rebuildWRITE

Reinstall the OS of a VPS. Erases all data on that server.

domains:read

List domains, expiry dates and nameservers.

domains:writeWRITE

Register domains and change nameservers.

tickets:read

List support tickets and read their replies.

tickets:writeWRITE

Open 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:

  1. Show plans. List products and add your own margin to pricing[].price.
  2. Ask for options. Get a product returns the locations and operating systems to offer.
  3. Order and pay. Create an order with pay_with_wallet: true and an Idempotency-Key.
  4. Wait for it. Poll Get a service every 30-60 seconds until status is active and ip_address is set.
  5. Hand over control. Offer your customer power and reinstall buttons that call the API.
  6. Renew. Each period a renewal invoice appears: list unpaid invoices daily and pay them before due_date, or the service is suspended.
Keep your wallet topped up. An order whose payment fails is still created, with an unpaid invoice — pay it once you have added funds.

Account

GET /api/v1/ping any token

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 /api/v1/account account:read

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": "…"
}
GET /api/v1/account/wallet/transactions account:read

List wallet transactions

Every movement of your wallet balance, newest first. Paginated (default 50 per page).

Query parameters

ParameterTypeDescription
pageintPage number, from 1
per_pageint1-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

GET /api/v1/products catalog:read

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

ParameterTypeDescription
group_idintOnly 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 /api/v1/products/{id} catalog:read

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": "…"
}
GET /api/v1/domains/availability catalog:read

Check domain availability

Live availability and price of one name across up to 10 extensions.

Query parameters

ParameterTypeDescription
domainstringRequired. 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

POST /api/v1/orders orders:write Idempotency-Key

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

FieldTypeDescription
product_idrequiredintFrom List products
billing_cyclerequiredstringmonthly quarterly semi_annual annual biennial triennial — one the product has a price for
domainstringRequired for hosting, reseller and email products
register_domainboolHosting: also register domain in the same order
domain_yearsint1-10, with register_domain
locationstringServer location id (Cloud VPS: required) — see the product's order.choices
os_idstringOperating system: an id from the product’s order.choices.os. Left out, the one marked default is installed (Windows plans list only Windows images)
hostnamestringVPS products that ask for one
passwordstringRoot password (min 8), VPS products that ask for one
couponstringCoupon code
notesstringOrder notes, up to 1000 characters
pay_with_walletboolPay the invoice from the wallet now
optionsobjectExtra 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": "…"
}
If the wallet balance is too low the order is still placed: payment.paid is false with error_code: insufficient_balance, and the invoice stays unpaid. Poll Get a service until status is active.

Invoices

GET /api/v1/invoices invoices:read

List invoices

Newest first. Paginated.

Query parameters

ParameterTypeDescription
statusstringall (default) unpaid paid overdue cancelled refunded
service_idintOnly invoices of this service
pageint
per_pageint1-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 /api/v1/invoices/{id} invoices:read

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": "…"
}
POST /api/v1/invoices/{id}/pay invoices:pay Idempotency-Key

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": "…"
}
Errors: 402 insufficient_balance, 409 already_paid.

Services

GET /api/v1/services services:read

List services

All your services — hosting, servers, everything — newest first. actions tells you which server actions a service supports right now.

Query parameters

ParameterTypeDescription
statusstringactive pending suspended cancelled terminated
typestringhosting reseller cloud_vps vps dedicated …
pageint
per_pageint

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 /api/v1/services/{id} services:read

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": "…"
}
POST /api/v1/services/{id}/power services:power

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

FieldTypeDescription
actionrequiredstringstart · 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": "…"
}
Errors: 409 service_not_active (suspended or not active), 409 not_ready (still being set up), 422 not_supported (not a VPS).
GET /api/v1/services/{id}/os-templates services:read

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": "…"
}
POST /api/v1/services/{id}/rebuild services:rebuild Idempotency-Key

Reinstall a server

Erases everything on the server and installs a fresh operating system. Limited to 3 per 10 minutes per server.

Body

FieldTypeDescription
os_idrequiredstringFrom List operating systems
confirmrequiredstringMust be exactly REBUILD
passwordstringNew root password, 8-72 characters. Some server types require it; others generate one
ssh_keysstringCloud 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

GET /api/v1/domains domains:read

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 /api/v1/domains/{id} domains:read

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": "…"
}
POST /api/v1/domains/register domains:write Idempotency-Key

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

FieldTypeDescription
domainrequiredstringFull name, e.g. example.in
yearsintRegistration period, default 1
nameserversarray2-4 host names; leave out for our default nameservers
id_protectionboolAdd ID protection where the extension supports it
pay_with_walletboolPay 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": "…"
}
Errors: 422 registrant_details_required — complete your profile address first.
POST /api/v1/domains/{id}/nameservers domains:write

Change nameservers

Sets 2-4 nameservers. Some extensions are changed by our team — then status is pending_review.

Body

FieldTypeDescription
nameserversrequiredarray2-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

GET /api/v1/tickets/departments tickets:read

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": "…"
}
GET /api/v1/tickets tickets:read

List tickets

Most recently updated first. Paginated.

Query parameters

ParameterTypeDescription
statusstringopen 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 /api/v1/tickets/{id} tickets:read

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": "…"
}
POST /api/v1/tickets tickets:write Idempotency-Key

Open a ticket

Opens a support ticket. Our team is notified as usual.

Body

FieldTypeDescription
department_idrequiredintFrom List departments
subjectrequiredstringUp to 255 characters
messagerequiredstring
prioritystringlow 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": "…"
}
POST /api/v1/tickets/{id}/reply tickets:write

Reply to a ticket

Adds your reply to an open ticket.

Body

FieldTypeDescription
messagerequiredstring

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": "…"
}
Errors: 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-Key on orders and payments, and retry 5xx / network errors with the same key.

Changelog

v1 — November 2026. First release: account & wallet, catalog, orders, invoices & wallet payments, services with VPS power and reinstall, domains, support tickets; scoped tokens, IP allowlists, rate limits and idempotency keys.

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).