# Arianet documentation > Arianet (Ariaservice, ariaservice.net) is a cloud provider. These docs cover its public APIs on https://api.ariaservice.net (Arianet Cloud, VPS, regional VPS, shared hosting, dedicated servers and SMS), the `arianet` command-line tool and the `ariaservice/arianet` Terraform provider. --- title: "Arianet documentation" description: "Map of the Arianet documentation - every API (Cloud, VPS, regional VPS, hosting, dedicated servers, SMS), the CLI and Terraform, base URLs and where to start for each role." url: https://docs.ariaservice.net/en/intro markdown: https://docs.ariaservice.net/en/intro.md language: en --- # Arianet documentation Arianet (Ariaservice) provides cloud servers, virtual private servers, shared hosting, dedicated servers and SMS. Every product has a **REST API**, all of them work with **one API token**, and most are also available through the **CLI** and **Terraform**. This page is the map of the documentation. - [Quick start](https://docs.ariaservice.net/en/quickstart): From creating a token to your first server in minutes - [Authentication](https://docs.ariaservice.net/en/authentication): Creating tokens, scopes and keeping them safe - [API conventions](https://docs.ariaservice.net/en/api-conventions): Errors, rate limits, pagination and asynchronous operations - [API reference](https://docs.ariaservice.net/en/api-reference): OpenAPI documents and interactive references for every API - [CLI](https://docs.ariaservice.net/en/cli): Manage everything from your terminal with arianet - [For AI tools](https://docs.ariaservice.net/en/ai): llms.txt, Markdown pages and rules for agents ## Products and APIs Every API sits behind one gateway, `https://api.ariaservice.net`; each product has its own path and version. | Product | Base URL | CLI | Terraform | Guide | |---|---|---|---|---| | Arianet Cloud: cloud servers, volumes, networks, firewalls, IPs, load balancers | `/cloud/v1` | `arianet cloud` | Yes | [Cloud API](https://docs.ariaservice.net/en/cloud-api) | | Virtual private servers (VPS) | `/api/v1` | `arianet vps` | - | [VPS API](https://docs.ariaservice.net/en/api-endpoints) | | Regional VPS (such as `iran-1`) | `/vps/v1` | `arianet vps regional` ¹ | - | [Regional VPS](https://docs.ariaservice.net/en/regional-vps-api) | | Shared and reseller hosting (cPanel, DirectAdmin) | `/hosting/v1` | `arianet hosting` ¹ | - | [Hosting](https://docs.ariaservice.net/en/hosting-api) | | Dedicated servers | `/baremetal/v1` | `arianet baremetal` ¹ | - | [Dedicated servers](https://docs.ariaservice.net/en/baremetal-api) | | SMS | `/sms/v1` | `arianet sms` ¹ | - | [SMS](https://docs.ariaservice.net/en/sms/api) | ¹ Since CLI v0.6.0; update an older install with `arianet upgrade`. ## Which tool? | Tool | Best for | Start | |---|---|---| | **The API (REST)** | Your own application, in any language that speaks HTTP | [Quick start](https://docs.ariaservice.net/en/quickstart) | | **CLI** | Day-to-day work in a terminal, shell scripts and CI | [Install in three steps](https://docs.ariaservice.net/en/cli#install-and-get-started-in-three-steps) | | **Terraform** | Describing and versioning cloud infrastructure as code | [Provider setup](https://docs.ariaservice.net/en/terraform#provider-setup) | | **Control panel** | Manual work without code | [panel.ariaservice.net](https://panel.ariaservice.net) | ## Where should I start? - **Developers:** the [quick start](https://docs.ariaservice.net/en/quickstart), then [API conventions](https://docs.ariaservice.net/en/api-conventions) and the product page. For every detail of an endpoint, go to the [API reference](https://docs.ariaservice.net/en/api-reference). - **DevOps engineers:** the [CLI](https://docs.ariaservice.net/en/cli) and [Terraform](https://docs.ariaservice.net/en/terraform); create a separate least-privilege token per pipeline ([keeping tokens safe](https://docs.ariaservice.net/en/authentication#keeping-tokens-safe)). - **Managers and non-technical readers:** [Concepts and glossary](https://docs.ariaservice.net/en/concepts) explains every term in plain language; the first paragraph of each product page says what the product does. - **AI tools and autonomous agents:** [For AI tools](https://docs.ariaservice.net/en/ai) and [`llms.txt`](pathname:///en/llms.txt). ## More help - [Control panel](https://panel.ariaservice.net): servers, tokens and billing - [Service status](https://status.ariaservice.net): if something is not working, check here first - [Contact support](https://www.ariaservice.net/contact) - [CLI on GitHub](https://github.com/ariaservice/arianet-cli): source, releases and issues --- title: "Quick start" description: "Create an API token in minutes, send your first request with curl, the CLI, Python, Node.js or Go, and create and delete your first cloud server." url: https://docs.ariaservice.net/en/quickstart markdown: https://docs.ariaservice.net/en/quickstart.md language: en --- # Quick start On this page you create a token, send your first request, and create and delete a cloud server. The examples use the [Cloud API](https://docs.ariaservice.net/en/cloud-api); every other product follows the same pattern. ## Before you start - An Arianet account with wallet balance (creating a server costs money; reading lists is free) - `curl`, the [Arianet CLI](https://docs.ariaservice.net/en/cli#install-and-get-started-in-three-steps), or any language that speaks HTTP ## 1. Create a token 1. Sign in to the panel and open the [API tokens](https://cloud.ariaservice.net/users/api-tokens) page. 2. Create a token with the `cloud:servers:read` and `cloud:servers:write` scopes. 3. Copy the token; it is shown **only once**. Scopes and IP restrictions are covered in [Authentication](https://docs.ariaservice.net/en/authentication). ## 2. Put the token in an environment variable Do not write the token into your code; keep it in the `ARIANET_TOKEN` environment variable. The CLI reads the same variable. **macOS / Linux** ```bash export ARIANET_TOKEN="paste-your-token-here" ``` **Windows (PowerShell)** ```powershell $env:ARIANET_TOKEN = "paste-your-token-here" ``` ## 3. Send your first request List the cloud servers of your account (an empty list if you have none): **curl** ```bash curl -s https://api.ariaservice.net/cloud/v1/servers \ -H "Authorization: Bearer $ARIANET_TOKEN" ``` **CLI** ```bash arianet cloud servers list ``` **Python** ```python import os import requests resp = requests.get( "https://api.ariaservice.net/cloud/v1/servers", headers={"Authorization": f"Bearer {os.environ['ARIANET_TOKEN']}"}, timeout=30, ) resp.raise_for_status() for server in resp.json()["data"]: print(server["id"], server["name"], server["status"]) ``` **Node.js** ```js const resp = await fetch('https://api.ariaservice.net/cloud/v1/servers', { headers: {Authorization: `Bearer ${process.env.ARIANET_TOKEN}`}, }); if (!resp.ok) throw new Error(`${resp.status} ${await resp.text()}`); const {data} = await resp.json(); for (const server of data) console.log(server.id, server.name, server.status); ``` **Go** ```go package main import ( "encoding/json" "fmt" "net/http" "os" ) func main() { req, _ := http.NewRequest("GET", "https://api.ariaservice.net/cloud/v1/servers", nil) req.Header.Set("Authorization", "Bearer "+os.Getenv("ARIANET_TOKEN")) resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() var body struct { Data []struct { ID int64 `json:"id"` Name string `json:"name"` Status string `json:"status"` } `json:"data"` } if err := json.NewDecoder(resp.Body).Decode(&body); err != nil { panic(err) } for _, s := range body.Data { fmt.Println(s.ID, s.Name, s.Status) } } ``` A `401` means the token was not sent correctly; a `403` means it lacks a scope ([authentication errors](https://docs.ariaservice.net/en/authentication#authentication-errors)). ## 4. Create your first server Find a datacenter, a plan and an image, then create the server: **curl** ```bash BASE=https://api.ariaservice.net/cloud/v1 AUTH="Authorization: Bearer $ARIANET_TOKEN" curl -s $BASE/datacenters -H "$AUTH" # datacenter codes, e.g. ovh curl -s "$BASE/plans?datacenter=ovh" -H "$AUTH" # plan ids and prices curl -s "$BASE/images?type=system" -H "$AUTH" # image names, e.g. ubuntu-24.04 curl -s -X POST $BASE/servers -H "$AUTH" -H "Content-Type: application/json" \ -d '{"name":"web-1","datacenter":"ovh","plan_id":3,"image":"ubuntu-24.04"}' ``` **CLI** ```bash arianet cloud datacenters arianet cloud plans --datacenter ovh arianet cloud images list --type system arianet cloud servers create --name web-1 --datacenter ovh --plan 3 --image ubuntu-24.04 --wait ``` The create call answers `201` with the server, the `action_id` of the create action and a `root_password`. **The root password is shown only this once.** Creating a server is asynchronous; poll the action until its `status` is `success` or `error`: ```bash curl -s $BASE/actions/812 -H "$AUTH" # {"data":{"id":812,"command":"create","status":"running","progress":40,...}} ``` ## 5. Clean up Cloud servers are billed by the hour. If you were only trying things out, delete the server: ```bash curl -s -X DELETE $BASE/servers/ -H "$AUTH" # or: arianet cloud servers delete ``` ## Next steps - [API conventions](https://docs.ariaservice.net/en/api-conventions): Errors, rate limits, safe retries and asynchronous operations - [Cloud API](https://docs.ariaservice.net/en/cloud-api): Networks, firewalls, volumes, IPs and load balancers - [Terraform](https://docs.ariaservice.net/en/terraform): Describe the same server as code - [API reference](https://docs.ariaservice.net/en/api-reference): Every endpoint in full detail --- title: "Authentication" description: "Creating an Arianet API token, sending it as a Bearer token, the scopes of every API, IP restrictions, team members, revoking tokens and keeping them safe in CI." url: https://docs.ariaservice.net/en/authentication markdown: https://docs.ariaservice.net/en/authentication.md language: en --- # Authentication Every API, the CLI and Terraform work with a **personal API token**. One token is enough for every product; scopes decide what each token may do. ## Creating a token 1. Sign in to the panel and open the [API tokens](https://cloud.ariaservice.net/users/api-tokens) page (**Settings → API tokens**). 2. Give it a name that says where it is used (for example `ci-deploy` or `laptop`). 3. Pick the scopes it needs from the [tables below](#scopes) and, if useful, an expiry date and an [IP allowlist](#restricting-to-ip-addresses). 4. Copy the token. **It is shown only once**, and Arianet does not keep a readable copy. ## Sending the token Send the token in the `Authorization` header of every request: ```http GET /cloud/v1/servers HTTP/1.1 Host: api.ariaservice.net Authorization: Bearer ``` ```bash curl -s https://api.ariaservice.net/cloud/v1/servers -H "Authorization: Bearer $ARIANET_TOKEN" ``` The CLI reads the token from `arianet configure`, the `ARIANET_TOKEN` environment variable or the `--token` flag; Terraform from the provider's `token` argument or the same variable. ## Scopes A token created **without any scope** has every permission of its owner. Limit each token to the scopes it needs. A request outside the token's scopes answers `403`. ### Arianet Cloud (`/cloud/v1`) | Scope | Allows | |---|---| | `cloud:servers:read` | Every `GET`: servers, volumes, networks, firewalls, IPs, load balancers, images, prices and actions | | `cloud:servers:write` | Every change (`POST`, `PUT`, `PATCH`, `DELETE`) | The public price list (`GET /cloud/v1/public/pricing`) needs no token. ### VPS (`/api/v1`) | Scope | Allows | |---|---| | `regions:read` | `GET /regions` | | `os:read` | `GET /os/datacenter/{id}` | | `plans:read` | `GET /plans/...` | | `servers:read` / `servers:write` | Reading servers / creating, deleting, power, reinstalling, renaming and protection | | `ssh-keys:read` / `ssh-keys:write` | SSH keys | | `firewalls:read` / `firewalls:write` | Firewalls, their rules and attachments | | `balance:read` | Balance and transactions | | `invoices:read` | Invoices | | `tokens:read` / `tokens:write` | Listing and revoking tokens | `GET /auth/me` and `DELETE /auth/logout` need no scope. ### Regional VPS, hosting and dedicated servers | API | Read | Change | |---|---|---| | Regional VPS (`/vps/v1`) | `vps:servers:read` | `vps:servers:write` | | Hosting (`/hosting/v1`) | `hosting:accounts:read` | `hosting:accounts:write` | | Dedicated servers (`/baremetal/v1`) | `baremetal:servers:read` | `baremetal:servers:write` | ### SMS (`/sms/v1`) | Scope | Allows | |---|---| | `sms:messages:read` | Sent and received messages, batches, scheduled sends, prices and the report | | `sms:messages:write` | Sending, cancelling scheduled sends, blocked numbers and the webhook | | `sms:lines:read` | Sender lines | | `sms:templates:read` / `sms:templates:write` | Reading / managing templates | Requesting a dedicated line (`POST /lines`) needs a token without scopes. ## Restricting to IP addresses A token can be limited to a list of source addresses or ranges. A request from any other address is refused with `403` even with a valid token (with code `IP_NOT_ALLOWED` on `/api/v1`). Always do this for servers and CI runners with fixed addresses. ## Team members When a member of an account's team creates a token, the token can never do more than that member: the account's IAM policies apply to every request as well. For example, managing reseller hosting needs `hosting:reseller:manage`, and changing a regional VPS's traffic setting needs `vps:manage` in IAM. ## Managing and revoking tokens - The [API tokens](https://cloud.ariaservice.net/users/api-tokens) page in the panel lists your tokens and revokes any of them. `GET /api/v1/auth/tokens` also returns each token's last use (`last_used`) and expiry (`expires`). - With the VPS API: `GET /api/v1/auth/tokens` (scope `tokens:read`) and `DELETE /api/v1/auth/tokens/{id}` (scope `tokens:write`). `DELETE /api/v1/auth/logout` revokes the token the request was sent with. - With the CLI: `arianet auth tokens list`, `arianet auth tokens revoke `, `arianet auth whoami` and `arianet auth logout`. ## Keeping tokens safe - Never put a token in client-side code (browser, mobile app) or a repository; keep it in an environment variable or a secret store. - Create a separate token with the fewest scopes for each application, server or pipeline, so you can revoke one without disturbing the others. - Give CI tokens an expiry date and an IP allowlist, and rotate them regularly. - If a token leaks, revoke it in the panel immediately. In CI (the secret variable `ARIANET_TOKEN` is defined in the project settings): ```yaml title=".gitlab-ci.yml" deploy: image: alpine:3.20 script: - apk add --no-cache curl - curl -fsS https://api.ariaservice.net/cloud/v1/servers -H "Authorization: Bearer $ARIANET_TOKEN" ``` ```yaml title=".github/workflows/deploy.yml" jobs: deploy: runs-on: ubuntu-latest env: ARIANET_TOKEN: ${{ secrets.ARIANET_TOKEN }} steps: - run: curl -fsS https://api.ariaservice.net/cloud/v1/servers -H "Authorization: Bearer $ARIANET_TOKEN" ``` ## Authentication errors | HTTP | Means | What to do | |---|---|---| | `401` | No token, or it is invalid, expired or revoked | Check the `Authorization: Bearer ` header or create a new token | | `403` | The token is valid but lacks a scope (`insufficient_scope` / `INSUFFICIENT_SCOPE`), the address is not allowed (`IP_NOT_ALLOWED`), or the account may not do this (`forbidden`, `identity_needed`) | Fix the token's scopes or IP list; for `identity_needed`, complete identity verification in the panel | --- title: "API conventions" description: "Rules shared by the Arianet APIs - base URLs and versions, response and error formats, rate limits and retries, pagination, asynchronous operations, idempotency and regions." url: https://docs.ariaservice.net/en/api-conventions markdown: https://docs.ariaservice.net/en/api-conventions.md language: en --- # API conventions Every Arianet API is REST over HTTPS, takes and returns JSON, and authenticates with a [Bearer token](https://docs.ariaservice.net/en/authentication). This page puts the shared rules and each product's differences in one place, so your client works correctly against all of them. ## Base URLs and versions | API | Base URL | OpenAPI document | |---|---|---| | Arianet Cloud | `https://api.ariaservice.net/cloud/v1` | [`openapi.json`](https://api.ariaservice.net/cloud/v1/openapi.json) | | VPS | `https://api.ariaservice.net/api/v1` | [`openapi.yaml`](pathname:///openapi.yaml) | | Regional VPS | `https://api.ariaservice.net/vps/v1` | [`openapi.json`](https://api.ariaservice.net/vps/v1/openapi.json) | | Hosting | `https://api.ariaservice.net/hosting/v1` | [`openapi.json`](https://api.ariaservice.net/hosting/v1/openapi.json) | | Dedicated servers | `https://api.ariaservice.net/baremetal/v1` | [`openapi.json`](https://api.ariaservice.net/baremetal/v1/openapi.json) | | SMS | `https://api.ariaservice.net/sms/v1` | [`openapi.json`](https://api.ariaservice.net/sms/v1/openapi.json) | The version is part of the path (`v1`). Write clients that **ignore unknown response fields**; new fields and values are added without a version change. ## Requests and responses - `POST`, `PUT` and `PATCH` bodies are JSON and need `Content-Type: application/json`. - Times are UTC in ISO 8601 / RFC 3339 (`2026-10-02T09:30:00Z`). - Ids are integers unless the product page says otherwise (invoice numbers and SMS message ids, for example, are strings). - `PATCH` changes only the fields you send. Successful responses come in two shapes: **Cloud, regional VPS, hosting, dedicated, SMS** ```json { "data": { "id": 12, "name": "web-1" } } ``` **VPS (/api/v1)** ```json { "success": true, "data": { "id": 4821, "status": "active" } } ``` ## Errors Every error carries a **stable, machine-readable `code`**. Base your logic on the HTTP status and the `code`, never on the message; the message is for people and may change. | API | Error format | |---|---| | Cloud | `{"error": "...", "code": "not_found", "reason": "..."}`; `reason`, when present, narrows the case down | | Regional VPS, hosting, dedicated servers | `{"error": "...", "code": "not_found"}` | | SMS | `{"code": "not_found", "message": "..."}` | | VPS (`/api/v1`) | `{"success": false, "error": {"code": "NOT_FOUND", "message": "..."}}` | HTTP statuses mean the same thing everywhere: | HTTP | Means | Retry? | |---|---|---| | `400` / `422` | Invalid input, or a valid request that cannot be done right now | No; fix the request | | `401` | No token, or an invalid one | No | | `402` | Not enough wallet balance | After topping up | | `403` | Not allowed | No | | `404` | The resource does not exist in your account | No | | `409` / `423` | The resource's state does not allow it now, or another operation holds it | Yes, a little later | | `429` | Rate limited | Yes, after `Retry-After` | | `500` / `502` / `503` | Temporary server-side error | Yes, with growing back-off | | `504` | The answer did not arrive in time; **the request may have run** | Read the state first | The full list of codes for each API is on its product page and in its OpenAPI document. ## Rate limits | API | Limit | |---|---| | Cloud | 60 requests a minute and 3,600 an hour per account and user | | VPS (`/api/v1`) | Reads 120 a minute; writes about 20 a minute; creating servers 5 an hour per token ([details](https://docs.ariaservice.net/en/api-endpoints#rate-limits)) | | Regional VPS, hosting, dedicated servers, SMS | Per caller; the current values are in the `RateLimit-*` headers | The newer APIs send these headers on every response: | Header | Meaning | |---|---| | `RateLimit-Limit` | Requests allowed in the current window | | `RateLimit-Remaining` | Requests left | | `RateLimit-Reset` | Seconds until the next window | Over the limit, the answer is `429` and `Retry-After` (in seconds) says how long to wait. ### Retrying Retry `429`, `502`, `503` and network errors with exponential back-off, honouring `Retry-After` when present. **Only retry requests that spend money with an [idempotency key](#safe-retries-idempotency).** **Python** ```python import os import random import time import requests RETRY = {429, 502, 503} def call(method, url, **kwargs): headers = {"Authorization": f"Bearer {os.environ['ARIANET_TOKEN']}", **kwargs.pop("headers", {})} for attempt in range(6): resp = requests.request(method, url, headers=headers, timeout=30, **kwargs) if resp.status_code not in RETRY: return resp wait = float(resp.headers.get("Retry-After", 2 ** attempt)) time.sleep(wait + random.random()) return resp ``` **bash** ```bash for attempt in 1 2 3 4 5; do code=$(curl -s -o /tmp/out.json -w '%{http_code}' "$URL" -H "Authorization: Bearer $ARIANET_TOKEN") case "$code" in 429|502|503) sleep $((2 ** attempt)) ;; *) break ;; esac done cat /tmp/out.json ``` The CLI retries rate-limited reads by itself; it never retries changes automatically. ## Pagination | API | Parameters | Page information in the response | |---|---|---| | Cloud | `page`, `per_page` (1 to 100, default 25); without them the whole list comes in one page | `meta.pagination`: `page`, `per_page`, `previous_page`, `next_page`, `last_page` | | SMS | `page`, `per_page` (up to 200) | `meta`: `total`, `current_page`, `per_page` | | VPS (`/api/v1`) | `page`, `limit` (1 to 100, default 15) | `pagination`: `current_page`, `per_page`, `total`, `last_page` | | Regional VPS, hosting, dedicated servers | Lists come back whole; action lists take `limit` | - | ## Asynchronous operations Work that takes time (creating, deleting, reinstalling, resizing, power) answers `201` or `202` at once and runs in the background. Follow it to the end like this: | API | What to poll | Final state | |---|---|---| | Cloud | `GET /actions/{id}` with the response's `action_id` | `status`: `success` or `error` | | Regional VPS, hosting | `GET /actions/{id}` | `state`: `success` or `error` | | Dedicated servers | `GET /orders/{id}` (delivery steps) | Order delivered or cancelled | | SMS | `GET /batches/{id}` or the [webhook](https://docs.ariaservice.net/en/sms/api#webhooks) | `completed`, `partial` or `failed` | | VPS (`/api/v1`) | `GET /servers/{id}/status` or `GET /servers/{id}/actions` | `status` is `active` / action `success` or `failed` | Poll every few seconds (every 5 seconds, say) and cap the total wait. The CLI does this with `--wait` and `actions wait`. ## Safe retries (idempotency) If the answer to an order never reaches you (a dropped connection, a `504`), you cannot know whether it was placed. With an **idempotency key** you can safely send the same request again: no second order is made and the first answer comes back. | API | Requests | How | |---|---|---| | VPS (`/api/v1`) | `POST /servers` | `Idempotency-Key` header, **required** ([details](https://docs.ariaservice.net/en/api-endpoints#idempotency)) | | Regional VPS | `POST /servers` | `Idempotency-Key` header | | Hosting | `POST /accounts` | `Idempotency-Key` header | | Dedicated servers | `POST /orders`, `POST /servers/{id}/renew` | `Idempotency-Key` header | | SMS | `POST /messages` | `client_reference` field (or the `Idempotency-Key` header) | Make a new key (a UUID, for example) for every new order, and reuse it for retries until you have a definite answer. ```bash curl -s -X POST https://api.ariaservice.net/vps/v1/servers \ -H "Authorization: Bearer $ARIANET_TOKEN" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"datacenter":"thr-1","plan_id":4,"image":"ubuntu-24.04","hostname":"web-1","billing_mode":"hourly"}' ``` ## Regions Regional VPS and hosting have a separate install per region. Pick the region with the `Arianet-Region` header; without it, the request goes to the product's default region: ```bash curl -s https://api.ariaservice.net/hosting/v1/accounts \ -H "Authorization: Bearer $ARIANET_TOKEN" \ -H "Arianet-Region: iran-1" ``` An unknown region answers `404 region_not_found`. SMS runs only in `iran-1` and dedicated servers have a single install; neither needs the header. ## Timeouts and 504 Requests that travel to another region can end with `504 gateway_timeout` even though the work was done. Before retrying, read the state (the resource list or the actions) or use an [idempotency key](#safe-retries-idempotency). --- title: "Concepts and glossary" description: "Plain-language explanations of the terms in the Arianet docs - API, token, scope, region, datacenter, plan, image, snapshot, floating IP, load balancer, hosting, SMS line and hourly billing." url: https://docs.ariaservice.net/en/concepts markdown: https://docs.ariaservice.net/en/concepts.md language: en --- # Concepts and glossary This page is for readers who are not developers, or are just starting: every term you meet in these docs, explained in plain language. ## Basics - **API:** a way for a program to ask Arianet for something without the panel: "create a server", "give me my invoices". The program sends an HTTP request and gets the answer back as JSON. - **Endpoint:** one address of an API together with its method, such as `GET /servers` (list servers) or `POST /servers` (create a server). Methods: `GET` reads, `POST` creates or performs, `PUT` / `PATCH` change, `DELETE` removes. - **JSON:** a simple text format of keys and values, like `{"name": "web-1"}`. - **OpenAPI:** a machine-readable file that describes every endpoint of an API. Tools build interactive docs or client code from it ([API reference](https://docs.ariaservice.net/en/api-reference)). - **CLI:** the `arianet` command-line program; it does what the panel does, by typing commands in a terminal ([CLI](https://docs.ariaservice.net/en/cli)). - **Terraform:** a tool that describes infrastructure (servers, networks, firewalls) in text files and builds exactly that: "infrastructure as code" ([Terraform](https://docs.ariaservice.net/en/terraform)). ## Account and access - **API token:** a password made for programs. Instead of a username and password, a program identifies itself with a token. Treat it like a password ([Authentication](https://docs.ariaservice.net/en/authentication)). - **Scope:** what a token is allowed to do. A token with only `cloud:servers:read` can see servers but cannot create or delete anything. - **Wallet:** your account balance. Orders and hourly billing are charged to it; when it runs short you get a `402`. - **Project and label:** ways to organise cloud resources, for example all of one customer's servers in one project, or the label `env=prod` on production servers. ## Location - **Region:** a geographic area with its own install of a service, such as `iran-1`. Some APIs pick it with the `Arianet-Region` header. - **Datacenter:** the building and hardware your server actually runs in. Each region has one or more datacenters, each with a code such as `ovh` or `thr-1`. ## Servers and compute - **Cloud server / VPS:** a virtual computer with its own operating system, connected to the internet. Cloud servers are billed by the hour, and their resources (disks, networks, IPs) are managed separately. - **Dedicated server:** a whole physical server that is yours alone; billed monthly, delivered in several steps. - **Plan:** the size of a server: CPU cores, memory, disk and price. - **Image:** a ready operating system a server is installed from, such as `ubuntu-24.04`. - **cloud-init (user data):** a script that runs the first time a server boots, for example to install software automatically. - **Rescue:** the server boots a temporary operating system so you can repair its main disk. - **Asynchronous operation (action):** work that takes seconds or minutes (like creating a server). The API answers "started" at once and you ask for the state later. ## Storage and backups - **Volume:** separate storage attached to a server; it can be detached and attached to another server. - **Snapshot:** a full picture of a server's disk at one moment, to create a new server from it or go back to it. - **Backup:** automatic daily copies of a server, kept for a limited time. ## Networking - **Primary, floating and elastic IPs:** the primary IP is the server's own public address. Floating and elastic IPs are kept independently of any server, so you can move them from one server to another. - **Private network:** a network only your servers are on, so they talk to each other without crossing the internet. - **Firewall:** rules that decide which traffic reaches a server, for example only ports 22 and 443. - **Load balancer:** spreads incoming traffic over several servers, so the site stays up when one of them fails. - **NAT gateway:** lets servers without a public IP reach the internet. ## Hosting and SMS - **Shared hosting:** website hosting on a server shared with others, with a control panel (cPanel or DirectAdmin), email, databases and DNS. - **Reseller hosting:** an account that can create and sell hosting accounts to its own customers. - **DNS:** the internet's phone book; it says which IP your domain name points to. - **SMS line:** the number messages are sent from; a shared line or your own dedicated line. - **Webhook:** an address in your application that Arianet calls when something happens (an SMS is delivered, for example). ## Billing - **Hourly billing:** you pay for every hour a resource exists; a month counts at most 730 hours. - **Idempotency:** the guarantee that sending an order again after a dropped connection does not run or charge it twice ([details](https://docs.ariaservice.net/en/api-conventions#safe-retries-idempotency)). - **Rate limit:** the cap on requests per minute or hour; over it you get a `429` and should wait a little. --- title: "Docs for AI tools" description: "Using the Arianet docs in ChatGPT, Claude, Cursor and autonomous agents - llms.txt, llms-full.txt, a Markdown version of every page, the OpenAPI documents and safe rules for agents." url: https://docs.ariaservice.net/en/ai markdown: https://docs.ariaservice.net/en/ai.md language: en --- # Docs for AI tools These docs are published so that language models, coding assistants (Claude, ChatGPT, Cursor, Copilot) and autonomous agents can read them completely and accurately. ## Files | File | Contents | |---|---| | [`/en/llms.txt`](pathname:///en/llms.txt) | Every page with a short description and a link to its Markdown version, in the [llmstxt.org](https://llmstxt.org) format | | [`/en/llms-full.txt`](pathname:///en/llms-full.txt) | The whole documentation in one text file, in sidebar order | | `/en/.md` | The Markdown version of any page, e.g. [`/en/cloud-api.md`](pathname:///en/cloud-api.md) | | [`/llms.txt`](pathname:///llms.txt) and [`/llms-full.txt`](pathname:///llms-full.txt) | The same files in Persian, the site's default language | | OpenAPI documents | The machine-readable description of each API; listed in the [API reference](https://docs.ariaservice.net/en/api-reference) | Both languages say the same thing; English tends to work best with most models. ## The "Copy page" button At the top of every page, **Copy page** copies the page's Markdown so you can paste it into a chat. The menu next to it opens the page directly in Claude or ChatGPT, or shows the Markdown version. ## Example prompt ```text Read https://docs.ariaservice.net/en/llms.txt and the pages it links that you need. Using the Arianet Cloud API, write a Python script that creates a server named web-1 in datacenter ovh with plan 3 and image ubuntu-24.04, waits for the create action to finish, and prints its public IPv4. Read the token from ARIANET_TOKEN. ``` ## Rules for autonomous agents If you build an agent that works on Arianet with your token: - **Least privilege:** give the agent its own token with the fewest [scopes](https://docs.ariaservice.net/en/authentication#scopes) it needs; only `read` scopes for read-only work. - **Keep the token away from the model:** hold it in the tool's environment, not in the prompt or chat history. - **A human approves costly or irreversible actions:** creating, deleting, reinstalling, renewing and sending SMS cost money or erase data; ask before running them. - **Retry safely:** send an [idempotency key](https://docs.ariaservice.net/en/api-conventions#safe-retries-idempotency) with orders, and read the state before retrying after a `504`. - **Wait for the end:** `201`/`202` means the work started, not that it finished; [follow the action](https://docs.ariaservice.net/en/api-conventions#asynchronous-operations). - **Respect rate limits:** honour the `RateLimit-*` and `Retry-After` headers. - **Source of truth:** rely on the API's OpenAPI document for exact field names, not on the model's guess. --- title: "Getting to know the user panel" description: "A quick tour of the Arianet user panel — the sidebar and switching between products, the top bar, search, notifications, dark mode, the account menu and switching between accounts." url: https://docs.ariaservice.net/en/panel markdown: https://docs.ariaservice.net/en/panel.md language: en --- # Getting to know the user panel The Arianet user panel is at [panel.ariaservice.net](https://panel.ariaservice.net). All products (VPS, cloud, dedicated servers, hosting, domains and SMS), your wallet, bills, tickets and account settings are managed from this one panel. This guide walks through every part of the panel step by step, with screenshots. The panel itself is in Persian, so each UI label is given in English followed by the Persian label in quotes. If you are just starting, go in this order: 1. [Sign up and sign in](https://docs.ariaservice.net/en/panel/login) 2. [Identity verification](https://docs.ariaservice.net/en/panel/identity) 3. [Top up your account](https://docs.ariaservice.net/en/panel/wallet) 4. Buy your first service: a [VPS](https://docs.ariaservice.net/en/panel/vps), [cloud](https://docs.ariaservice.net/en/panel/cloud), [hosting](https://docs.ariaservice.net/en/panel/hosting) or a [dedicated server](https://docs.ariaservice.net/en/panel/baremetal) ![User panel dashboard](https://docs.ariaservice.net/en/img/panel/dashboard-1.jpg) ## Sidebar The sidebar (on the right, since the panel is right-to-left) has three parts: - **Top**: the account name and **Customer ID** («شناسه مشتری»), and the Current service («سرویس فعلی») box, which you use to switch between products. - **Middle**: the pages of the current product. On the dashboard it shows Recent («اخیراً», products you opened recently) and Services («سرویس‌ها», all products). When you open a product, the menu changes to that product's pages; All services («همهٔ سرویس‌ها») takes you back to the dashboard. - **Bottom** (always shown): - **Support** («پشتیبانی»): [tickets](https://docs.ariaservice.net/en/panel/tickets) - **Finance and billing** («مالی و صورتحساب»): [top up](https://docs.ariaservice.net/en/panel/wallet), automatic payment, bank receipt submission, [transactions and bills](https://docs.ariaservice.net/en/panel/billing) - **Account settings** («تنظیمات حساب»): [profile and security](https://docs.ariaservice.net/en/panel/profile), [SSH keys and API tokens](https://docs.ariaservice.net/en/panel/ssh-keys-api), organizations, and [team and access](https://docs.ariaservice.net/en/panel/team) ## Top bar From left to right: - **Account menu** (the account name): Customer ID (with a copy button), profile, change password, sign-in security, API tokens, transactions, bills, resource quota and sign out - **Wallet balance**: click it to go to the [top-up](https://docs.ariaservice.net/en/panel/wallet) page - **Support**: a shortcut to tickets - **Notifications** (the bell): system messages, such as a service being created or your balance running low; the red number is the count of unread notifications - **Light / dark mode** - **Search** (shortcut `Ctrl+K`): quickly find services and pages - **Create** (only on cloud pages): quickly create a server, volume, network and more ![Account menu](https://docs.ariaservice.net/en/img/panel/overview-usermenu.jpg) ![Notifications](https://docs.ariaservice.net/en/img/panel/overview-notifications.jpg) > **tip** - Use Mark all as read («علامت‌گذاری همه به‌عنوان خوانده‌شده») to mark every notification as read at once. - Choose the channels you receive notifications on (SMS, email, Telegram, panel) in [Profile → Notifications](https://docs.ariaservice.net/en/panel/profile#notifications). - When you contact support, copy your **Customer ID** from the account menu and give it to them. ## Switching between accounts If you are a member of an organization, or someone has invited you to their account, use the account menu to switch between Personal account («حساب شخصی»), My organizations («سازمان‌های من») and Other people's accounts («حساب‌های دیگران»). Each account has its own wallet, services and bills. The full guide is in [Team, organizations and access](https://docs.ariaservice.net/en/panel/team). --- title: "Sign up and sign in" description: "Sign up and sign in to the Arianet panel with a mobile number or email, an SMS code, a password, an authenticator app or a passkey." url: https://docs.ariaservice.net/en/panel/login markdown: https://docs.ariaservice.net/en/panel/login.md language: en --- # Sign up and sign in Signing up and signing in use the same page at Arianet. If you sign in with a number that has no account yet, a new account is created automatically. ## Step 1: mobile number or email Go to [panel.ariaservice.net](https://panel.ariaservice.net). On the Sign in | Sign up («ورود | ثبت‌نام») page, enter your mobile number or email and click Continue («ادامه»). ![Sign-in and sign-up page](https://docs.ariaservice.net/en/img/panel/login-1.jpg) > **note** - By signing in you accept Arianet's terms and privacy policy. - At the top of the page there is also a Sign in («ورود») link to the old panel, for buying Iran services and legacy hosting; all new services are in this panel. ## Step 2: password or SMS code - **If you have set a password for your account**, the Sign in to your account («ورود به حساب کاربری») page opens. Enter your password and click Sign in («ورود»). - **If you have no password** (or the account is new), a verification code is sent to your mobile by SMS. Enter the code. If the SMS does not arrive, click Resend code («ارسال مجدد کد»), or correct the number with Change mobile number («تغییر شماره موبایل»). ![Signing in with a password](https://docs.ariaservice.net/en/img/panel/login-password.jpg) If you tick Keep this system signed in for 30 days («این سیستم را برای ۳۰ روز نگهدار»), this browser will not ask for a code or password again for 30 days. You can see and remove remembered devices in [Profile → Devices](https://docs.ariaservice.net/en/panel/profile#devices). > **caution** Only turn this option on for a personal device, never on a shared or public computer. ## Step 3: complete your profile (first time only) After your first sign-in, the Complete your user profile («تکمیل پروفایل کاربری») form opens. Enter your first name, last name, email and a password, then click Save and continue («ثبت اطلاعات و ادامه»). Until this form is complete, only the ticket pages are available. ## Sign in with a passkey or authenticator app - If you have registered a [passkey](https://docs.ariaservice.net/en/panel/profile#passkey), click Sign in with a passkey («ورود با کلید عبور (Passkey)») on the first page to sign in with your fingerprint, face recognition or device lock. - If you have enabled an [authenticator app](https://docs.ariaservice.net/en/panel/profile#authenticator-app), after step 2 you are asked for the app's 6-digit code (or one of your recovery codes). > **tip** If SMS messages are not reaching you because of a disruption, you can still sign in to the panel with a passkey or an authenticator app. We recommend enabling at least one of them. ## Forgotten password - **If you are still signed in** (for example on a remembered device), open Change password («تغییر رمز عبور») from the user menu and click Forgot your current password? («رمز عبور فعلی را فراموش کرده‌اید؟»); you set a new password with an SMS code. - **If you are not signed in**, sign in with a [passkey](#sign-in-with-a-passkey-or-authenticator-app), or call the support phone number shown at the bottom of the sign-in page. --- title: "Identity verification" description: "Verifying your identity at Arianet, the 24-hour deadline after a purchase, limits on unverified accounts, legal (company) details and registering a server IP in the Shahkar system." url: https://docs.ariaservice.net/en/panel/identity markdown: https://docs.ariaservice.net/en/panel/identity.md language: en --- # Identity verification By law, services only stay active for accounts whose identity has been verified. Your verification status is shown at the top of your [profile](https://docs.ariaservice.net/en/panel/profile) with the label Identity verified («هویت تأیید شده») or Identity not verified («هویت تأیید نشده»). > **Until you verify your identity** - You can create only **one server**. - After buying your first service you receive an SMS reminder and have **24 hours**. After that, **your services are turned off and locked until verification is complete**, and they are released automatically once you are verified. - Services are still charged during this time. ## Verification steps 1. Click Verify identity («احراز هویت»), either from the message To keep using the service, verify your identity («برای ادامهٔ استفاده، هویت خود را احراز کنید», shown after a purchase) or from the Identity verification («تایید هویت») page. 2. Have these ready: - national ID number (کد ملی) - date of birth - a mobile number that is registered **under that same national ID** 3. Click Start verification («شروع احراز هویت»). You are taken to the secure verification page. 4. Complete the steps. When you finish, you return to the panel and see the result. If it failed, click Try again («تلاش دوباره»). ![Identity verification page](https://docs.ariaservice.net/en/img/panel/identity-1.jpg) > **tip** - If the account's mobile number is registered to someone else, verification fails; to change the number, open a [ticket](https://docs.ariaservice.net/en/panel/tickets) (Identity verification department, «احراز هویت»). - The verification page link only works for you; it will not work for anyone else. - I'll do it later («بعداً انجام می‌دهم») lets you skip for now, but the limits above still apply. ## Legal details and official invoices To buy in a company's name, open the Identity and legal («هویتی و حقوقی») tab in your profile, tick I have legal (company) details («اطلاعات حقوقی دارم») and enter the company's details and address. See the [full guide](https://docs.ariaservice.net/en/panel/profile#identity-and-legal). ![Identity and legal tab](https://docs.ariaservice.net/en/img/panel/profile-identity.jpg) ## Registering in the Shahkar system For servers with an Iranian IP, the IP must be registered in the **Shahkar** system under the owner's name. After you create such a server, a Register in Shahkar («ثبت در شاهکار») button appears: 1. Choose the person type: Individual («شخص حقیقی») or Legal entity («شخص حقوقی»). The details are read from the Identity and legal tab of your profile. 2. Click Send request and get SMS code («ارسال درخواست و دریافت کد پیامکی»). 3. Enter the SMS code (two codes are sent for a legal entity) and click Confirm and complete registration («تأیید و تکمیل ثبت»). > **note** Complete the Identity and legal tab before registering in Shahkar; otherwise the registration request is not sent. --- title: "Dashboard" description: "The Arianet panel dashboard — a summary of your servers, balance, this month's estimated cost and quick links." url: https://docs.ariaservice.net/en/panel/dashboard markdown: https://docs.ariaservice.net/en/panel/dashboard.md language: en --- # Dashboard The dashboard is the first page you see after signing in. It summarizes the state of your account. ![User panel dashboard](https://docs.ariaservice.net/en/img/panel/dashboard-1.jpg) - **Add credit** («افزایش اعتبار») and **New service** («سرویس جدید»): the two buttons at the top of the page, for topping up your account and buying a service - **Summary cards**: the number of active servers, suspended services and your account balance - **Services / apps**: the products you have activated. A Trial («آزمایشی») label means the product is in its trial period. - **Usage and estimated cost for this month**: the cost recorded so far and an estimate up to the end of the month - **Quick access**: manage servers, bills, profile and tickets - **Recent activity**: the latest actions taken in the account ![Usage chart, quick access and recent activity](https://docs.ariaservice.net/en/img/panel/dashboard-2.jpg) ## Dashboard sidebar On the dashboard the sidebar has two parts: **Recent** («اخیراً», products you opened recently) and **Services** («سرویس‌ها», all products). Click a product to open its page; the menu then changes to that product's menu. All services («همهٔ سرویس‌ها») takes you back to the dashboard. > **tip** - More details («جزئیات بیشتر») on the usage card opens the [bills](https://docs.ariaservice.net/en/panel/billing) page with the cost of each service. - If the Suspended services («سرویس‌های مسدود») count is not zero, your balance has usually run out; [top up your account](https://docs.ariaservice.net/en/panel/wallet) to reactivate the services. - The Estimated cost to the end of the month («برآورد هزینه تا پایان ماه») is based on your current usage; keep your balance above this figure. --- title: "Top-up and wallet" description: "Topping up your Arianet balance through a bank gateway, USDT cryptocurrency, a bank receipt and automatic payment (smart payment), and managing wallets." url: https://docs.ariaservice.net/en/panel/wallet markdown: https://docs.ariaservice.net/en/panel/wallet.md language: en --- # Top-up and wallet The cost of every service is deducted from your wallet balance. Hourly services (such as VPS and cloud) are charged every hour, and monthly services (such as dedicated servers) are charged when ordered and when renewed. > **caution** If your balance runs out, hourly services are **suspended** and, after a while, deleted. Always keep a little more than the next few days' usage in your balance, or turn on [automatic payment](#automatic-payment-smart-payment). All pages in this section are in the **Finance and billing** («مالی و صورتحساب») menu (at the bottom of the sidebar). Your current balance is always shown in the panel's top bar; click it to go to the top-up page. ## Top up through a bank gateway 1. In Finance and billing, open Top up («افزایش موجودی») (or click Add credit, «افزایش اعتبار», on the dashboard). 2. In Amount in Rials («مبلغ به ریال»), enter an amount or click one of the preset amounts (10, 30 or 100 million Rials). The amount is written out in words below the field so you can check it. 3. In Choose payment gateway («انتخاب درگاه پرداخت»), choose a bank gateway. 4. Click the Pay … Rials («پرداخت … ریال») button. You are taken to the bank's page; pay with your bank card. 5. After a successful payment you return to the panel and your balance increases immediately. ![Top-up page](https://docs.ariaservice.net/en/img/panel/wallet-1.jpg) ![Choosing the amount and payment gateway](https://docs.ariaservice.net/en/img/panel/wallet-2.jpg) > **danger** Top-ups are **non-refundable**. Make sure of the amount before you pay. > **tip** - If the bank page does not open, **turn off your VPN**; Iranian bank gateways only open from an Iranian IP. - If money was taken from your account but your panel balance did not increase, the bank returns it within 72 hours. If it is not returned, open a [ticket](https://docs.ariaservice.net/en/panel/tickets) with the bank's tracking number. ## Other payment methods On the left of the top-up page, the Other payment methods («سایر روش‌های پرداخت») box offers: - **Smart payment** («پرداخت هوشمند»): automatic top-up of your account ([below](#automatic-payment-smart-payment)) - **Pay with cryptocurrency** («پرداخت با رمز ارز»): USDT on the TRC20 network, with low fees - **Bank deposit** («واریز به حساب»): coming soon ## Pay with cryptocurrency (USDT TRC20) 1. In Other payment methods, click Pay with cryptocurrency («پرداخت با رمز ارز»). 2. Enter an amount in dollars or click one of the preset amounts (5 to 100 dollars). The minimum is 1 dollar. 3. Click Get payment address («دریافت آدرس پرداخت»). The wallet address, a QR code and the payment deadline are shown. 4. Send **exactly that amount** of USDT to the address before the deadline. Once the network confirms it, a Payment successful («پرداخت موفق») message is shown and your balance is topped up. ![Paying with USDT TRC20](https://docs.ariaservice.net/en/img/panel/wallet-crypto-1.jpg) > **danger** Only send **USDT on the TRON (TRC20) network**. Sending from the ERC20 or BEP20 network, or sending any other cryptocurrency, will **lose the funds** and cannot be reversed. ## Submit a bank receipt (card-to-card transfer or deposit) If you paid directly into the company's bank account: 1. In Finance and billing, open Submit bank receipt («ثبت فیش بانکی») and click New receipt («ثبت فیش جدید»). 2. In Destination account («حساب مقصد»), choose the account you paid into. Its card number, account number and account holder's name are shown. 3. Enter the Deposit amount (Rials) («مبلغ واریزی (ریال)»), the Bank tracking code («کد پیگیری بانکی», the tracking ID on the receipt) and the Deposit date («تاریخ واریز»). Add a Description («توضیحات») if needed and submit the receipt. 4. The receipt appears in the Deposit receipts («فیش‌های واریزی») table with the status Pending review («در انتظار بررسی»). Once the finance team approves it, the status becomes Approved («تایید شده») and your wallet is topped up. ![Submitting and tracking a bank receipt](https://docs.ariaservice.net/en/img/panel/wallet-deposit-1.jpg) ![Bank deposit receipt form](https://docs.ariaservice.net/en/img/panel/wallet-deposit-2.jpg) > **tip** - **Pay first, then submit the receipt.** Only pay into the accounts listed under Destination account in the panel. - Enter the tracking code exactly as it appears on the bank receipt; a receipt with a wrong tracking code is rejected. - The deposit date cannot be in the future. - Receipt top-ups are approved manually and may take some time; for an instant top-up, use the bank gateway. ## Automatic payment (smart payment) With automatic payment, whenever your balance drops below a set level, a fixed amount is automatically withdrawn from your bank account and added to your wallet. This keeps your services from being suspended because your balance ran out. 1. In Finance and billing, open Automatic payment («پرداخت خودکار»). The list of Active agreements («قراردادهای فعال») shows the bank, minimum withdrawal, maximum amount, daily limit, status and expiry date. 2. Click Create new agreement («ایجاد قرارداد جدید»). 3. Fill in the Automatic top-up («شارژ خودکار») form: - **Choose bank** («انتخاب بانک»): the bank your account is with. - **Withdrawal threshold (Rials)** («حد آستانه برداشت (ریال)»): if your balance falls below this amount, a withdrawal is made. - **Maximum withdrawals per day** («بیش‌ترین تعداد برداشت در هر روز») - **Agreement period** («بازه زمانی قرارداد برداشت»): how long the agreement is valid (for example 1 year). - **Amount withdrawn per transaction (Rials)** («مبلغ برداشتی در هر تراکنش (ریال)») 4. Click Register automatic payment agreement («ثبت قرارداد پرداخت خودکار») and confirm the agreement on the bank's page. ![Automatic payment agreements](https://docs.ariaservice.net/en/img/panel/wallet-autopay-1.jpg) ![Automatic top-up agreement form](https://docs.ariaservice.net/en/img/panel/wallet-autopay-2.jpg) > **tip** Set the amount of each withdrawal to at least one day's usage of your services, so that repeated withdrawals are not needed. The bank also limits the daily withdrawal cap and the agreement period. ## Managing wallets In Finance and billing → Top up, follow the wallets link to the Manage wallets («مدیریت کیف پول‌ها») page: - **Default wallet** («کیف پول پیش فرض»): the wallet service costs are deducted from, with its balance and status. - **Notification bell**: turn it on to be notified when your balance is low. Be sure to turn this on. - **Online top-up** («افزایش آنلاین موجودی»): top up this wallet directly. - **Create wallet** («ایجاد کیف پول»): create a wallet in another currency. Use Set as default («تنظیم پیش‌فرض») to change the default wallet. ![Managing wallets](https://docs.ariaservice.net/en/img/panel/wallet-wallets.jpg) --- title: "Transactions and bills" description: "Viewing transactions, the consolidated usage report, monthly bills, per-service usage details, downloading invoice PDFs and resource quotas in the Arianet panel." url: https://docs.ariaservice.net/en/panel/billing markdown: https://docs.ariaservice.net/en/panel/billing.md language: en --- # Transactions and bills All pages in this section are in the **Finance and billing** («مالی و صورتحساب») menu (at the bottom of the sidebar). ## Transactions Transactions («تراکنش‌ها») lists every deposit to and withdrawal from your wallet, with description, amount, status and date. Find a transaction with the All («همه»), Today («امروز»), This week («این هفته») and This month («این ماه») filters or the search box. The eye button shows the transaction's details and the download button downloads its receipt. ![Transaction list](https://docs.ariaservice.net/en/img/panel/billing-transactions.jpg) ## Bills A bill is created every month that adds up all the costs of that month. At the top of the Bills («صورتحساب‌ها») page is the **consolidated usage report** («گزارش تجمیعی مصارف»; choose the month from the list above it): - **Total usage for the period**, **amount invoiced** and **discount applied** - **Credit sufficient until** («اعتبار کافی تا»): roughly how many more days your balance will last, given your current balance and daily usage - a chart of daily usage for the month - **Usage by product**: each product's share (hosting, VPS, cloud and so on) of the cost - **Invoice payment status** ![Consolidated usage report](https://docs.ariaservice.net/en/img/panel/billing-invoices-1.jpg) > **tip** Keep an eye on the Credit sufficient until figure. When it gets down to a few days, [top up your account](https://docs.ariaservice.net/en/panel/wallet) or turn on [automatic payment](https://docs.ariaservice.net/en/panel/wallet#automatic-payment-smart-payment) so your services are not suspended. At the bottom of the page is the **invoice list**, with the number, period, total amount and status of each invoice. The eye button (View details, «مشاهده جزئیات») opens the invoice. ![Invoice list](https://docs.ariaservice.net/en/img/panel/billing-invoices-2.jpg) ### Bill details Each bill's page shows: - the number, period (start and end), currency, status (Current period «دوره جاری», Open «باز», Collecting «درحال دریافت» and so on) and the days left in the period - **Amount so far** («مبلغ تا این لحظه», with its equivalent in Tomans) - a chart of **each resource type's share** of the bill - **Usage details**: click a resource type to see its itemized usage - **Print** («چاپ») and **Download PDF** («دریافت PDF») buttons ![Bill details](https://docs.ariaservice.net/en/img/panel/billing-invoice-detail.jpg) > **note** The current month's bill stays open until the end of the month, and its amount goes up with every hour of hourly-service usage. Costs are deducted from your wallet as they occur; the bill is a report of those deductions, not a separate debt. ## Costs of one service On each cloud server's page, the Costs («هزینه‌ها») tab shows that server's hourly and monthly cost ([Arianet Cloud](https://docs.ariaservice.net/en/panel/cloud#costs)). For hosting, Billing → View this service's costs («صورتحساب ← مشاهده هزینه‌های این سرویس») does the same. ## Resource quota Each account has a limit on the number of each type of resource (servers, IPs, volumes, firewalls, snapshots and so on). Account settings → Resource quota («تنظیمات حساب ← سهمیهٔ منابع») shows the limit and current usage of each resource. If a limit is not enough, submit a Request a quota increase («درخواست افزایش سهمیه»). ![Resource quota](https://docs.ariaservice.net/en/img/panel/quota.jpg) > **tip** Check your quota before creating a large number of servers. If a quota is full, creating a new resource fails with an error. Quota increase requests are reviewed by support. --- title: "Profile and security" description: "Editing your profile, identity and legal details, changing your password, two-step sign-in with an authenticator app and passkeys, trusted devices and notification settings in the Arianet panel." url: https://docs.ariaservice.net/en/panel/profile markdown: https://docs.ariaservice.net/en/panel/profile.md language: en --- # Profile and security All of these pages are in the **Account settings** («تنظیمات حساب») menu (at the bottom of the sidebar) and in the user menu (your name in the top corner of the panel). ## Profile Open Account settings → Profile («تنظیمات حساب ← پروفایل»). The top of the page shows an account summary: name, email, mobile, **Customer ID** («شناسه مشتری»), status labels (Account active «حساب فعال», Identity verified / not verified «هویت تأیید شده / نشده», Email verified «ایمیل تأیید شده») and the account balance. The profile page has four tabs. ### Details ![Profile details tab](https://docs.ariaservice.net/en/img/panel/profile-1.jpg) - **Personal details** («مشخصات فردی»): first name, last name, gender and date of birth. After making changes, click Save changes («ذخیره تغییرات»). This name appears on invoices and in support correspondence. - **Contact details** («اطلاعات تماس»): mobile number and email. - **Last sign-in** («آخرین ورود»): the time, device and IP of the last sign-in to the account. > **note** **The mobile number cannot be edited.** To change it, open a [ticket](https://docs.ariaservice.net/en/panel/tickets) (Identity verification department, «احراز هویت»). > **tip** If Last sign-in shows a time or IP that was not you, immediately [change your password](#change-password) and turn on [two-step sign-in](#sign-in-security). ### Identity and legal The details needed to register Iran services in the **Shahkar** system (a regulatory requirement) and to issue invoices: - **Individual details** («اطلاعات شخص حقیقی»): national ID number and mobile number. Until these are complete the section is labelled Incomplete («ناقص»). - **Legal entity (company) details** («اطلاعات شخص حقوقی»): if you buy in a company's name, tick I have legal (company) details («اطلاعات حقوقی دارم») and enter the company's details. - **Address** («نشانی»): province, county, street, building number, 10-digit postal code, landline and full address. When you are done, click Save details («ذخیره اطلاعات»). ![Identity and legal tab](https://docs.ariaservice.net/en/img/panel/profile-identity.jpg) > **tip** You can save both individual and legal entity details at the same time and choose one when registering each server. Account identity verification is separate; see [Identity verification](https://docs.ariaservice.net/en/panel/identity). ### Devices Devices on which you chose Remember this device for 30 days («این دستگاه را برای ۳۰ روز به خاطر بسپار») when signing in are listed under Trusted devices («دستگاه‌های مورد اعتماد»). These devices can sign in without a code for 30 days. If you do not recognize a device, or no longer use it, remove it. ![Trusted devices tab](https://docs.ariaservice.net/en/img/panel/profile-devices.jpg) ### Notifications In Notification settings («تنظیمات اعلان‌ها»), choose which channel each service event (such as connecting a domain to Cloudflare, a low balance or a server being created) is delivered on. Events are grouped by service. The icons next to each event show which channels are on; click an event to turn each channel on or off: | Channel | Cost | |---|---| | SMS | the cost per message is shown next to it (for example 2,000 Rials) | | Email | free | | Telegram | free; you must connect your Telegram account first | | Panel notification | free | ![Notification settings](https://docs.ariaservice.net/en/img/panel/profile-notifications.jpg) ![The channels of one event](https://docs.ariaservice.net/en/img/panel/profile-notifications-2.jpg) To receive notifications in Telegram, click Connect to Telegram («اتصال به تلگرام») and press Start on the bot in Telegram. > **tip** Always keep financial notifications (low balance, bill issued) on for at least one free channel such as email or Telegram, so that your services are not suspended because your balance ran out. ## Change password Open Account settings → Change password («تنظیمات حساب ← تغییر رمز عبور»), enter your current password and the new password twice, then click Change password («تغییر رمز عبور»). The new password must have: - at least 8 characters - at least one uppercase and one lowercase English letter - at least one digit - at least one special character (such as `!@#$`) ![Change password](https://docs.ariaservice.net/en/img/panel/profile-password.jpg) If you have forgotten your current password, click Forgot your current password? («رمز عبور فعلی را فراموش کرده‌اید؟»); you set a new password with an SMS code. ## Sign-in security Open Sign-in security («امنیت ورود») from the user menu. The Sign-in methods («روش‌های ورود») page manages two ways to sign in without SMS. If SMS does not reach you for any reason (such as a disruption of international internet), you can still sign in to the panel with these methods. **We recommend enabling at least one of them.** ![Sign-in methods](https://docs.ariaservice.net/en/img/panel/profile-security.jpg) ### Authenticator app An authenticator app (such as Google Authenticator or Microsoft Authenticator) generates a 6-digit code every 30 seconds and needs neither internet nor SMS to work. 1. On the Authenticator app («اپلیکیشن احراز هویت») card, click Enable («فعال‌سازی»). 2. Install the app on your phone and scan the QR code with it (or enter the displayed key manually). 3. Enter the 6-digit code shown in the app and click Confirm and enable («تایید و فعال‌سازی»). 4. Store the **recovery codes** that are shown in a safe place. ![Enabling the authenticator app](https://docs.ariaservice.net/en/img/panel/profile-totp.jpg) > **danger** Never share the QR code or key with anyone. If you lose your phone, you can only sign in with the **recovery codes**; keep them separate from your phone. ### Passkey With a passkey you sign in without any code or SMS, using only your device lock (fingerprint, Face ID, Windows Hello or a security key). 1. On the Passkey («کلید عبور (Passkey)») card, click Add passkey («افزودن کلید عبور»). 2. Confirm the browser or operating system prompt with your fingerprint or device lock. 3. Register a separate passkey for each device (laptop, phone). You can rename or delete each passkey. --- title: "SSH keys and API tokens" description: "Adding SSH keys for secure server login and creating API tokens with limited permissions for the Arianet CLI, Terraform and API." url: https://docs.ariaservice.net/en/panel/ssh-keys-api markdown: https://docs.ariaservice.net/en/panel/ssh-keys-api.md language: en --- # SSH keys and API tokens ## SSH keys With an SSH key you sign in to servers without a password, more securely. A key you save here can be selected with one click whenever you create a VPS or cloud server. ![SSH keys page](https://docs.ariaservice.net/en/img/panel/keys-empty.jpg) ### Creating a key on your computer If you don't have a key, create one in a terminal (macOS, Linux or Windows PowerShell) and display the public key: ```bash ssh-keygen -t ed25519 cat ~/.ssh/id_ed25519.pub ``` ### Adding the key to the panel 1. Open Account settings → SSH keys («تنظیمات حساب ← کلیدهای SSH») and click Add key («افزودن کلید»). 2. Paste the output of the `cat` command (the text starting with `ssh-ed25519`) into Public key («کلید عمومی»), or upload the public key file with Choose .pub file («انتخاب فایل pub.»). 3. In Key name («نام کلید»), enter a recognizable name (for example `my-laptop`). 4. If Default («پیش‌فرض») is ticked, this key is preselected when you create new servers. 5. Click Add key («افزودن کلید»). ![Add SSH key form](https://docs.ariaservice.net/en/img/panel/keys-add.jpg) The key is listed with its name, type, fingerprint and the time it was added. Each key has these buttons: Remove default («لغو پیش‌فرض») or Make default («پیش‌فرض کردن»), Rename («تغییر نام»), Copy public key («کپی کلید عمومی») and Delete («حذف»). ![SSH key list](https://docs.ariaservice.net/en/img/panel/keys-list.jpg) > **danger** Only enter the **public key** (the `.pub` file). Never enter your private key (the file without the `.pub` extension) on any site, and never give it to anyone. > **note** Deleting a key from the panel does not remove it from servers that were already created with it. To revoke access, also remove the key from the `~/.ssh/authorized_keys` file on the server itself. ## API tokens An API token is needed for the [CLI](https://docs.ariaservice.net/en/cli), [Terraform](https://docs.ariaservice.net/en/terraform), scripts and the [API](https://docs.ariaservice.net/en/authentication). Open the page from Account settings → API tokens («تنظیمات حساب ← توکن‌های API», or from the user menu). Total tokens («کل توکن‌ها») and Active tokens («توکن‌های فعال») are counted at the top of the page, and the CLI guide («راهنمای CLI») and API documentation («مستندات API») links are here too. ![API tokens page](https://docs.ariaservice.net/en/img/panel/tokens-1.jpg) ### Creating a token 1. Click Create new token («ساخت توکن جدید»). 2. In Token name («نام توکن»), describe what it is for (for example "My laptop" or "Web server CI"). 3. Choose the Access («دسترسی»): - **All permissions** («همهٔ دسترسی‌ها»): anything you can do in the panel. Only for personal use in the CLI. - **Limited to selected sections** («محدود به بخش‌های انتخابی»): for scripts and CI. Tick only the permissions you need, for example `servers:read` (view servers) or `servers:write` (create, delete, restart and reinstall servers). The Read only («فقط خواندن») button selects all view permissions at once. 4. Set the Expiry date (optional) («تاریخ انقضا (اختیاری)»). 5. In Allowed IPs (optional) («IP های مجاز (اختیاری)»), you can enter one IP (IPv4 or IPv6, not a range). Requests from any other IP are rejected with the `IP_NOT_ALLOWED` error. 6. Click Create token («ساخت توکن»). ![Create API token form](https://docs.ariaservice.net/en/img/panel/tokens-new.jpg) ![Choosing a token's limited permissions](https://docs.ariaservice.net/en/img/panel/tokens-scopes.jpg) > **danger** The full token is shown **only once**; after you close the window it cannot be viewed again. Copy it right away and store it somewhere safe (such as a password manager or a CI repository secret). > **tip** - Create a separate token for each use, so that if one leaks you only delete that one. - Give script and CI tokens the minimum permissions needed, an expiry date and an allowed IP; if a limited token leaks, only those sections are at risk. - Delete any token that has leaked or is no longer used immediately. --- title: "Support tickets" description: "Opening and following up support tickets in the Arianet panel, choosing the department and service, attaching files and sending confidential information securely." url: https://docs.ariaservice.net/en/panel/tickets markdown: https://docs.ariaservice.net/en/panel/tickets.md language: en --- # Support tickets All support pages are in the **Support** («پشتیبانی») menu (at the bottom of the sidebar) or behind the Support button in the panel's top bar. ## My tickets Support → My tickets («پشتیبانی ← تیکت‌های من») shows all your tickets with their number, subject, status, department and creation time. Find a ticket with the Search («جستجو») box and the Status («وضعیت») filter. ![Ticket list](https://docs.ariaservice.net/en/img/panel/tickets-list.jpg) Ticket statuses: | Status | Meaning | |---|---| | Open («باز») | submitted and waiting to be reviewed | | Under review («در حال بررسی») | an agent is working on it | | Customer action required («نیازمند اقدام مشتری») | support is waiting for a reply or an action from you | | Answered («پاسخ داده شده») | support has replied | | Closed («بسته شده») | the ticket is finished | ## Opening a new ticket 1. Click Create new ticket («ایجاد تیکت جدید») (or Support → New ticket, «پشتیبانی ← تیکت جدید»). 2. **Subject** («موضوع»): the problem in one sentence (for example "No SSH access to the server"). 3. **Department** («بخش»): choose the relevant department: - **Support** («پشتیبانی»): technical problems with services - **Sales** («فروش»): pre-sales questions, prices and plans - **Identity verification** («احراز هویت»): verification problems, changing your mobile number - **Management** («مدیریت»): complaints and suggestions - **Marketing** («بازاریابی»): partnerships and advertising 4. **Which service is this about** («درباره کدام سرویس», optional): choose the service with the problem so the agent can access it directly. 5. **Description** («توضیحات»): describe the problem fully (at most 1,000 characters). 6. **Attachments** («پیوست‌ها»): add screenshots or files if needed. 7. Click Send ticket («ارسال تیکت»). ![New ticket form](https://docs.ariaservice.net/en/img/panel/tickets-new.jpg) > **Writing a good ticket** You get a faster answer if you include: - what you did and what you expected - exactly what error you saw (the error text or a screenshot) - when the problem started - what you have already tried (for example "I also tried from the VNC console") > **Attachments** Allowed formats: PNG, JPG, PDF, ZIP and RAR. At most 5 files, each up to 20 MB. > **danger** **Do not write passwords or server login details in the ticket text.** After submitting the ticket, use the [confidential information for support](#confidential-information-for-support) section on that ticket's page. Each service's page also has a Support ticket («تیکت پشتیبانی») button that fills in the form with that service. This is the faster way. ## Following up and replying to a ticket When you open a ticket you see its number, subject, department and status, and the conversation with support. On this page you can: - write a reply in the box at the bottom, attach files and click Send reply («ارسال پاسخ») - rate each support reply (Submit rating, «ثبت امتیاز») - give or withdraw support's permission to access the server or hosting (Save permissions, «ذخیره‌ی اجازه‌ها») - click Close ticket («بستن تیکت») once the problem is solved ![A ticket's page](https://docs.ariaservice.net/en/img/panel/tickets-detail.jpg) ## Confidential information for support If the agent needs a password or server login details to investigate, do not write them in the ticket text: 1. On the ticket page, click Add confidential information («افزودن اطلاعات محرمانه»). 2. Enter a **Title** («عنوان», for example "Server SSH" or "Panel login"), the address or IP, port, username, password and, if needed, a note. 3. Click Save encrypted («ثبت رمزنگاری‌شده»). ![Confidential information form](https://docs.ariaservice.net/en/img/panel/tickets-secrets.jpg) > **info** This information is stored **encrypted**. Each time an agent views it, you are shown this on the same page, and **it is permanently deleted when the ticket is closed**. Once the problem is solved, change the passwords you sent. ## Closing a ticket When the problem is solved, click Close ticket («بستن تیکت»), then click Close ticket again in the confirmation window. ![Confirming ticket closure](https://docs.ariaservice.net/en/img/panel/tickets-close.jpg) > **note** - You cannot send a new reply to a closed ticket; if the problem comes back, open a new ticket. - When a ticket's status is Customer action required, support is waiting for you; nothing moves forward until you reply. --- title: "Team, organizations and access" description: "Inviting team members, defining IAM-style access policies, grouping services into Workspaces with budgets, and creating organizations with separate wallets in the Arianet panel." url: https://docs.ariaservice.net/en/panel/team markdown: https://docs.ariaservice.net/en/panel/team.md language: en --- # Team, organizations and access These features let you add colleagues to your account without giving them your account password, and decide exactly what each of them can access. > **note** The Team and access («تیم و دسترسی‌ها») section is only shown to the **account owner**. When you have switched into someone else's account, this section is not shown. ## Team members Open Account settings → Team members («تنظیمات حساب ← اعضای تیم»). Each member signs in with their own mobile number, but acts within this account and only according to the access policies attached to them. ![Team members](https://docs.ariaservice.net/en/img/panel/team-members.jpg) ### Inviting a new member 1. Click Invite new member («دعوت عضو جدید»). 2. Enter the member's **mobile number**. 3. **Access policies (optional)** («سیاست‌های دسترسی (اختیاری)»): the policies the member should have. You can also set these later. 4. **Access expiry date (optional)** («تاریخ انقضای دسترسی (اختیاری)»): for temporary collaboration (for example a contractor), set an end date; the default is Unlimited («نامحدود»). 5. Click Invite («دعوت»). ![Invite new member form](https://docs.ariaservice.net/en/img/panel/team-invite.jpg) The member signs in to the panel with that mobile number and an SMS code, and selects your account from the account menu (top corner of the panel) under Other people's accounts («حساب‌های دیگران»). > **caution** A member with no policy has no access to anything. After inviting someone, be sure to attach a suitable policy to them. ## Access policies Access policies work like IAM policies in AWS: each policy allows a set of actions on one or more resources (services) and is attached to team members. ![Access policies](https://docs.ariaservice.net/en/img/panel/policies.jpg) 1. Click Create new policy («ایجاد سیاست جدید»). 2. Enter a **Policy name** («نام سیاست», for example "Finance read-only access") and, optionally, a **Description** («توضیحات»). 3. In Permissions («دسترسی‌ها»), add a service with Add service («افزودن سرویس») and choose its allowed actions. Also set the policy's scope: all resources, one Workspace or specific services. 4. Click Save («ذخیره»). ![Creating a new access policy](https://docs.ariaservice.net/en/img/panel/policy-new.jpg) > **tip** - The **least privilege** principle: give each member only the actions they need. For example, an accountant gets view-only access to finance, and a developer gets only the servers of one Workspace. - Until you add a service and choose its permissions, a policy grants no access at all. ## Workspaces A Workspace is a group of services, for example for one project or one client. With a Workspace you can: - limit a team member to only that group's services, with a single access policy - set a **monthly budget** and an alert threshold for the group - see each group's Current month usage («مصرف ماه جاری») and Usage report («گزارش مصرف») separately ![Workspaces](https://docs.ariaservice.net/en/img/panel/workspaces.jpg) Click Create new Workspace («ایجاد Workspace جدید»), give it a name and description, then add services to it from Manage services («مدیریت سرویس‌ها»). ## Organizations An organization is a completely separate account: it has **its own wallet, bills, services and team**. To keep the costs and access of several businesses apart, create an organization for each one. 1. Open Account settings → Organizations («تنظیمات حساب ← سازمان‌ها») and click New organization («سازمان جدید»). 2. Enter the organization's name. 3. Switch between your organizations and your personal account from the account menu at the top of the page (account switcher). ![Organizations](https://docs.ariaservice.net/en/img/panel/organizations.jpg) > **note** The personal account's wallet balance cannot be used in an organization, and vice versa; [top up](https://docs.ariaservice.net/en/panel/wallet) each organization separately. --- title: "Virtual private server (VPS)" description: "Buying an hourly VPS in the Arianet panel step by step, and managing it — VNC console, login details, rescue mode, reverse DNS, reinstalling, plan upgrades, IP change, backups, firewalls and deletion." url: https://docs.ariaservice.net/en/panel/vps markdown: https://docs.ariaservice.net/en/panel/vps.md language: en --- # Virtual private server (VPS) Arianet VPS is billed **hourly**: each hour's cost is deducted from your wallet balance, and whenever you delete the server, the charges stop too. > **Before you buy** - To buy, your wallet balance must cover at least a few hours of server time. [Top up your account](https://docs.ariaservice.net/en/panel/wallet) - If your balance runs out, the server is suspended. Keep balance notifications turned on in your [profile](https://docs.ariaservice.net/en/panel/profile#notifications). - For more secure login, add an [SSH key](https://docs.ariaservice.net/en/panel/ssh-keys-api) to the panel before you buy. ## Buying a VPS In the VPS («سرور مجازی / VPS») menu, click New service («سرویس جدید») (or New service on the dashboard). All steps are on one page, and the **Order summary** («خلاصه سفارش») box at the side of the page always shows your choices, the **hourly cost** and the **approximate monthly cost**. ### 1. Region and data center In Choose region («انتخاب منطقه»), choose a country or continent (Iran, Europe, Turkey, America, Australia). Then pick a data center from the list in Available data centers («دیتاسنترهای موجود»). The data center's technical specifications («مشخصات فنی دیتاسنتر») are shown below the list. ![Choosing a region](https://docs.ariaservice.net/en/img/panel/vps-buy-1.jpg) ![The data centers of a region](https://docs.ariaservice.net/en/img/panel/vps-buy-2.jpg) > **tip** Data centers differ in their features; for example IP change, backups or unlimited traffic are available only in some data centers. If you need a particular feature, read the data center's specifications before you buy. ### 2. Operating system In Choose operating system («انتخاب سیستم عامل»), click an operating system (Ubuntu, Debian, AlmaLinux, Rocky Linux, CentOS, Fedora, Mikrotik and others) and choose the **version** from the list below it. The Marketplace («بازارچه») tab shows ready-made applications. ![Choosing the operating system and version](https://docs.ariaservice.net/en/img/panel/vps-buy-3.jpg) ### 3. Plan In Choose plan («انتخاب پلن»), open one of the groups Standard («استاندارد»), High memory («رم بالا») or High compute («پردازش بالا»). Each plan has its CPU, RAM, disk space and **hourly price**; click Details («جزئیات») to see its full specifications. The Recommended («پیشنهادی») label marks the most popular plan, and an Unavailable («ناموجود») plan cannot be bought right now. You can change the price currency with Currency («ارز») above the table. ![Plan table](https://docs.ariaservice.net/en/img/panel/vps-buy-4.jpg) ### 4. Server login method In Choose server login method («انتخاب روش ورود به سرور»), choose one: - **SSH key** («کلید (SSH Key)», recommended): choose one of your saved keys or add one right here with Add new key («افزودن کلید جدید»). It is more secure and needs no password. - **Password** («پسورد (Password)»): enter a password yourself or generate a random one. ![Choosing an SSH key for login](https://docs.ariaservice.net/en/img/panel/vps-buy-5.jpg) ### 5. Create the service Check the order summary and click Create service («ساخت سرویس»). The Data center terms and rules («شرایط و قوانین دیتاسنتر») window opens; read it, tick I have read and accept this data center's rules («قوانین این دیتاسنتر را خواندم و می‌پذیرم») and click Confirm and continue («تایید و ادامه»). ![Data center rules before creating the server](https://docs.ariaservice.net/en/img/panel/vps-buy-rules.jpg) > **Important data center rules** - **Port 25** (sending email directly) is closed by default to prevent spam. Ports 465 and 587 are open. If you need port 25 for a mail server, open a [ticket](https://docs.ariaservice.net/en/panel/tickets). - If you attach a second network card to the server, its address is obtained automatically by DHCP. - An **empty** disk (volume) attached to the server is automatically formatted with ext4 and mounted at `/mnt/volume-…`. A disk that has data on it is never formatted. If you want to partition the disk yourself, do not attach it before the first boot. ### 6. The server is created The Preparing your service («در حال آماده‌سازی سرویس شما») page shows the steps live: request submitted, allocating resources and network address, creating and booting the server, and final activation. This usually takes a minute or two, and you do not need to refresh the page. ![Preparing the service](https://docs.ariaservice.net/en/img/panel/vps-creating-1.jpg) ![The final activation step](https://docs.ariaservice.net/en/img/panel/vps-creating-2.jpg) When the message Your service was created successfully! («سرویس شما با موفقیت ساخته شد!») appears, click Go to service management («رفتن به مدیریت سرویس»). ![Service created successfully](https://docs.ariaservice.net/en/img/panel/vps-created.jpg) ## Managing the server In VPS («سرور مجازی / VPS») the list of servers is shown with location, plan and IP. The monitor button opens the VNC console and the gear button opens the server management page. ![VPS list](https://docs.ariaservice.net/en/img/panel/vps-list.jpg) The top of the management page shows the server's name, status, IP, location and operating system, and the main buttons: Power off / Power on («خاموش کردن / روشن کردن»), Restart («راه‌اندازی مجدد»), VNC console («کنسول VNC»), Change plan («تغییر پلن»), Enable protection («فعال‌سازی محافظت»), Reinstall («نصب مجدد»), Change IP («تعویض آی‌پی»), Support ticket («تیکت پشتیبانی») and Delete service («حذف سرویس»). ![VPS management page](https://docs.ariaservice.net/en/img/panel/vps-manage-1.jpg) ### Details, login information and network The Service details («مشخصات سرویس») tab shows: - **Resources**: CPU, memory, disk and billing cycle (hourly) - **Details**: service name (editable with the pencil icon), plan, operating system and creation date - **Login information**: username `root` and password (or Login with SSH key, «ورود با کلید SSH»), plus the Reset root password («بازنشانی رمز root») and Rescue mode («حالت رسکیو») buttons - **Network**: IPv4, IPv6, Gateway, Subnet, MAC and **Reverse DNS** Copy any value with the copy button next to it. To connect: ```bash ssh root@IP-سرور ``` (replace `IP-سرور` with your server's IP). ![Server details, login information and network](https://docs.ariaservice.net/en/img/panel/vps-manage-2.jpg) ### Reverse DNS In the network section, type a domain name (for example `mail.example.com`) in the Reverse DNS box and click Save («ذخیره»). To remove it, empty the field and save. > **note** - First create an A record (or AAAA for IPv6) in the domain's DNS that points to this IP; otherwise the reverse DNS is not accepted. - For some IP ranges, setting reverse DNS is not currently possible, and a message saying so is shown next to the IP. - To send email from the server, the reverse DNS must match the mail server's name. ### Power on, power off and restart Control the server with Power off / Power on and Restart at the top of the page. To prevent mistakes, powering off asks for confirmation. > **note** A powered-off server is still charged, because its resources (disk, IP and so on) stay reserved for you. To stop the charges, [delete the service](#deleting-a-server). ### VNC console The VNC console («کنسول VNC») tab (or the VNC console button at the top of the page) shows the server's own screen directly in your browser. Click "Connect". With the button in the top corner you can open the console in a new window. ![VNC console in the browser](https://docs.ariaservice.net/en/img/panel/vps-vnc.jpg) > **tip** When SSH is not reachable (for example a firewall was closed by mistake or the server's network is broken), sign in through the VNC console and fix the problem. ### Rescue mode If the server does not boot or you have lost the password, click Rescue mode («حالت رسکیو»). The server boots into a temporary system, and you can mount and repair the main disk. When you are done, click Exit rescue («خروج از رسکیو») so the server boots from the main disk again. ### Action history The Action history («تاریخچه عملیات») tab shows every action taken on the server (creation, power off and on, reinstall and so on) with time, duration and result (Successful «موفق», Pending «در انتظار» or Failed «ناموفق»). ![Server action history](https://docs.ariaservice.net/en/img/panel/vps-history.jpg) ### Automatic backups With automatic backups, a copy of the server's disk is taken every night and kept for **7 days**. It costs **20% of the server's hourly cost**. 1. In the Backups («پشتیبان‌گیری») tab (or the green box at the top of the page), click Enable («فعال‌سازی»). 2. From then on, copies are taken every night at 2 a.m. 3. To roll the server back to one of the last 7 days, click Restore («بازگردانی») on the copy you want. ![Backups tab](https://docs.ariaservice.net/en/img/panel/vps-backup.jpg) > **tip** All of the account's backups are also shown in VPS → Backups («سرور مجازی / VPS ← نسخه‌های پشتیبان»). If you delete a server, its backups stay for up to 7 days and you can create a new server from them. ### Reinstalling the operating system Click Reinstall («نصب مجدد»), choose the new operating system and version, and confirm. ![Reinstalling the operating system](https://docs.ariaservice.net/en/img/panel/vps-reinstall.jpg) > **danger** Reinstalling permanently deletes **all data, files and settings on the disk**. Back up important data first. ### Upgrading the plan Click Change plan («تغییر پلن») and Select («انتخاب») a bigger plan. Each plan's hourly and monthly price is shown in the table, and the new cost applies from the moment the plan is changed. ![Upgrading the server plan](https://docs.ariaservice.net/en/img/panel/vps-change-plan.jpg) > **caution** - Only **upgrades** are possible; resources cannot be reduced. - An upgrade may power the server off and on once; plan for this, and back up your data before upgrading. ### Changing the IP In data centers that support it, Change IP («تعویض آی‌پی») gives the server a new IP. That data center's rules are shown at the top of the page. Example rules for one data center: - Each server has **one free change**; later changes have a cost, which is deducted from your wallet only after a successful change. - Each server has a maximum number of changes (for example 5); failed changes are not counted. - The change is automatic, with no ticket; the server restarts once and the new IP is available about a minute later. - **The previous IP does not come back to your server.** - A Protected server cannot change its IP; disable protection first. - Whether the new IP is filtered cannot be checked before it is assigned. ![IP change page](https://docs.ariaservice.net/en/img/panel/vps-ip-change.jpg) ### Protection Enable protection («فعال‌سازی محافظت») prevents accidental deletion or reinstallation of the server. While protection is on, deletion, reinstall and IP change are not possible. ### Firewall In VPS → Firewall («سرور مجازی / VPS ← دیوارآتش / Firewall»), create firewalls and control your servers' incoming and outgoing traffic: 1. Click Create firewall («ایجاد فایروال»), choose the data center and give it a name (for example `web-server-rules`). 2. Define the firewall rules (port, protocol and allowed IPs). 3. Attach the firewall to servers in the same data center. ![Firewall list](https://docs.ariaservice.net/en/img/panel/vps-firewalls.jpg) ![Creating a new firewall](https://docs.ariaservice.net/en/img/panel/vps-firewall-new.jpg) > **caution** Before closing ports, make sure the SSH port (usually 22) is open for your own IP; otherwise you will only be able to reach the server through the [VNC console](#vnc-console). ## Deleting a server 1. Click Delete service («حذف سرویس»). 2. In Why do you want to delete this service? («چرا می‌خواهید این سرویس را حذف کنید؟»), choose a reason and, if you like, add a note. 3. Read the warnings, enter the exact service name (using the Copy «کپی» button) in the confirmation box and click Confirm final deletion («تایید حذف نهایی»). ![Reason for deleting the service](https://docs.ariaservice.net/en/img/panel/vps-delete-1.jpg) ![Confirming final deletion](https://docs.ariaservice.net/en/img/panel/vps-delete-2.jpg) > **danger** - Deletion is **irreversible** and all the server's data is deleted. - The server's IP is released and may be given to another service. - Deletion is immediate and charges stop at that moment. > **Early deletion** If you delete an hourly server **less than 60 minutes** after creating it, it counts as an early deletion, and its minimum charge steps up with the number of early deletions you made in the past 24 hours: 1, 2, 5, 10, 24 and 48 hours of usage, in that order. If you go 24 hours without an early deletion, counting starts again from the first step. --- title: "Arianet Cloud" description: "Creating an hourly cloud server in the Arianet panel step by step, and managing it — networking and reverse DNS, snapshots, backups, costs, rescue mode, volumes, firewalls, projects and deletion." url: https://docs.ariaservice.net/en/panel/cloud markdown: https://docs.ariaservice.net/en/panel/cloud.md language: en --- # Arianet Cloud Arianet Cloud (Cloud Computing) provides **hourly** cloud servers with private networks, floating and elastic IPs, separate volumes, firewalls, snapshots and load balancers. You pay only for the hours a resource exists, and each month counts as 730 hours. ## Overview Cloud server / Cloud Computing → Overview («سرور ابری / Cloud Computing ← نمای کلی») summarizes your cloud account: the number of servers (running and stopped), volumes and firewalls, the **estimated cost** per month and per hour, shortcuts for creating a server, volume and firewall, your servers and recent activity, and the active data centers. ![Cloud overview](https://docs.ariaservice.net/en/img/panel/cloud-overview.jpg) The cloud sidebar has four sections: - **Compute** («محاسبات»): Projects, Limits, Servers, New server - **Storage** («ذخیره‌سازی»): Volumes, Snapshots, Backups - **Networking** («شبکه»): Private networks, Routers, Load balancers, Floating and elastic IPs - **Security** («امنیت»): Firewalls The Create («ساخت») button in the top bar (keyboard shortcut C) opens, from any cloud page, a menu for creating a server, volume, private network, firewall, floating IP, load balancer or snapshot. ## Creating a cloud server Click New server («سرور جدید»). The page has eight numbered sections, and the **Order summary** («خلاصه سفارش») box at the side shows all your choices and the cost of each part, the **hourly cost** and the **approximate monthly cost**. ### 1. Region and 2. Operating system Choose a region. Each region's card lists its features (IPv4, IPv6, private network, floating IP, elastic IP, NAT and so on). Then choose an operating system and its version. There are also Applications («اپلیکیشن‌ها»), My snapshots («اسنپ‌شات‌های من») and Backups («پشتیبان‌ها») tabs, which means you can create a new server from another server's snapshot or backup. ![Choosing the region and operating system](https://docs.ariaservice.net/en/img/panel/cloud-buy-1.jpg) ### 3. Plan Choose a plan from the Standard («استاندارد»), Compute-optimized («پردازشی») or High memory («رم بالا») group. Each plan lists its CPU, RAM, disk, traffic, and hourly and monthly price. The hourly cost is deducted from your wallet, and the monthly price is the **cap** on the cost. ![Choosing a cloud server plan](https://docs.ariaservice.net/en/img/panel/cloud-buy-2.jpg) > **note** The minimum requirements of the chosen operating system (for example 512 MB RAM and 10 GB disk) are shown above the table. Plans that do not meet this minimum are disabled. ### 4. Networking and 5. Firewall - **Public IP** («آی‌پی عمومی»): the server is reachable directly from the internet. Turn public IPv4 and IPv6 on or off separately (both are free). - **Private network only** («فقط شبکهٔ خصوصی»): no public IP; suitable for databases and internal services. - **Private networks (optional)** («شبکه‌های خصوصی (اختیاری)»): servers on the same private network connect to each other over internal IPs, with no traffic cost. - **Firewall** («فایروال»): choose an existing firewall or create one with Create firewall («ساخت فایروال»). ![Cloud server networking and firewall](https://docs.ariaservice.net/en/img/panel/cloud-buy-3.jpg) > **caution** A server with no firewall accepts **all incoming traffic**. Always put a firewall on public servers and open only the ports you need. ### 6. Volumes and backups and 7. Login method - **Additional volumes** («دیسک‌های اضافه»): the main disk comes with the plan. You can choose separate volumes in the same region to be attached once the server is running; they are charged separately. - **Automatic backups** («پشتیبان‌گیری خودکار»): a full copy of the server's disk is taken every day and the last few copies are kept. Cost: **20% of the plan cost**. - **Login method** («روش ورود»): SSH key («کلید SSH»: your saved keys, Add new key «افزودن کلید جدید», or a One-time key «کلید یک‌بارمصرف» for this server only) or Password («رمز عبور»). ![Volumes, backups and login method](https://docs.ariaservice.net/en/img/panel/cloud-buy-4.jpg) > **note** With an SSH key, password login over SSH is disabled, but the console still works with the root password. ### 8. Name and advanced settings - **Project** («پروژه»): the new resource is created in this project and its cost is attributed to it. - **Server name (hostname)** («نام سرور»): English letters, digits, dots and hyphens; up to 63 characters. Use the button next to it to generate a random name. - **Number of servers** («تعداد سرور»): create several identical servers at once. - **Labels (optional)** («برچسب‌ها (اختیاری)»): key/value pairs such as `env=prod`, for grouping and search. - **Startup script (cloud-init)** («اسکریپت راه‌اندازی»): runs on first boot; for example to install packages or create a user. - **Power on after creation** («روشن شدن پس از ساخت») ![Name and advanced settings](https://docs.ariaservice.net/en/img/panel/cloud-buy-5.jpg) > **caution** Until you complete [identity verification](https://docs.ariaservice.net/en/panel/identity), you can create only **one server**. ### Create Click Create server («ساخت سرور»). The creation page shows the steps live: request submitted, preparing network and firewall, creating the virtual machine, booting the operating system, attaching IPs and volumes, and ready. The Event log («گزارش رویدادها») also records the details of each step. Creation usually takes less than a minute, and **you are charged only once the server is ready**. ![Creating a cloud server and the root password](https://docs.ariaservice.net/en/img/panel/cloud-creating.jpg) > **danger** If a root password was generated, it is shown **only once**, on this page, and cannot be viewed later. Reveal it with the eye button and save it somewhere safe right away with Copy («کپی»). When the message Server created successfully («سرور با موفقیت ساخته شد») appears, click Manage server («مدیریت سرور»). ![Cloud server created successfully](https://docs.ariaservice.net/en/img/panel/cloud-created.jpg) > **Identity verification deadline** If you have not verified your identity, you receive an SMS reminder after creating your first server and have **24 hours**. After that, your services are turned off and locked until verification is complete, and they are released automatically once you are verified. ## The server page The top of the page shows the server's name and status, IPv4 and IPv6 (with copy buttons), region, project (Move to another project, «انتقال به پروژهٔ دیگر»), operating system, plan, and monthly and hourly cost. Action buttons: power off, restart, console, change plan, reinstall, rescue mode, protection, more, support ticket and delete server. ![Cloud server management page](https://docs.ariaservice.net/en/img/panel/cloud-server-1.jpg) | Tab | What it does | |---|---| | Details («مشخصات») | name, status, plan, operating system, data center, network and a ready-made SSH command | | Graphs («نمودارها») | CPU, network and disk usage | | Networking («شبکه») | public IPs, IP change, **reverse DNS** | | Firewall («فایروال») | attached firewalls | | Volumes («دیسک‌ها») | create and attach separate volumes | | Snapshots («اسنپ‌شات») | take and restore snapshots | | Backups («پشتیبان‌گیری») | daily automatic backups | | Rescue mode («حالت نجات») | boot into a temporary system for repairs | | Console («کنسول») | the server's screen in your browser | | Costs («هزینه‌ها») | the hourly and monthly cost of each part | | Action history («تاریخچه عملیات») | every action taken | | Settings («تنظیمات») | name, labels, protection, root password reset | ### Networking and reverse DNS The Networking («شبکه») tab shows the server's public addresses with the type, subnet, gateway and **reverse DNS** of each. Change the IPv4 address with Change IP («تغییر IP»). ![Cloud server networking tab](https://docs.ariaservice.net/en/img/panel/cloud-network.jpg) To set reverse DNS (PTR), click Edit («ویرایش») next to the IP, enter a domain name (for example `mail.example.com`) and click Save («ذخیره»). ![Setting reverse DNS](https://docs.ariaservice.net/en/img/panel/cloud-rdns.jpg) > **note** Before saving, create an A record in the domain's DNS that points this name to this IP; otherwise the data center will not accept the name. To restore the data center's default name, leave the box empty. Reverse DNS is required for a mail server. ### Snapshots A snapshot is a full copy of the server's main disk. Before important changes (updates, installing software), click Take snapshot («گرفتن اسنپ‌شات») so that if something goes wrong you can roll the server back to that moment or create a new server from it. ![Server snapshots](https://docs.ariaservice.net/en/img/panel/cloud-snapshots.jpg) > **caution** A snapshot **stays until you delete it, even after the server is deleted**, and is charged based on the actual size of each copy (the price per gigabyte per month is shown on this page). Delete old snapshots. ### Costs The Costs («هزینه‌ها») tab shows the current cost of each part of the server, hourly and monthly (excluding VAT). Billing is based on the actual hours used. ![Cloud server costs](https://docs.ariaservice.net/en/img/panel/cloud-costs.jpg) ### Rescue mode, console, reinstall and change plan - **Rescue mode** («حالت نجات»): the server boots into a temporary system so you can repair the main disk (for example after a forgotten password or a boot failure). Exit rescue mode when you are done. - **Console** («کنسول»): the server's screen in your browser; for when SSH is not reachable. - **Reinstall** («نصب مجدد»): a new operating system is installed and **all data on the main disk is deleted**. - **Change plan** («تغییر پلن»): make the server bigger. - **Protection** («محافظ»): prevents accidental deletion and reinstallation. ## Deleting a cloud server 1. Click Delete server («حذف سرور») (or the Delete server button in the Costs tab). 2. Choose the reason for deletion and, if you like, add a note. 3. Read the Will be deleted («پاک می‌شود») and Will remain («می‌ماند») lists. 4. Enter the exact server name and click Delete permanently («حذف برای همیشه»). ![Reason for deleting a cloud server](https://docs.ariaservice.net/en/img/panel/cloud-delete-1.jpg) ![Confirming cloud server deletion](https://docs.ariaservice.net/en/img/panel/cloud-delete-2.jpg) > **danger** - Deletion is irreversible: the server and its main disk are deleted with all their files, and its IPs are released and may be assigned to someone else. - The server's hourly cost stops immediately, but **snapshots, separate volumes and floating and elastic IPs remain and keep being charged**. If you don't need them, delete them separately from the cloud menu. ## Other cloud resources Each of these resources has its own page in the cloud menu: volumes, private networks, routers, floating and elastic IPs, firewalls, snapshots, backups, load balancers and projects. On each page, create a new resource with the create button, and delete it from that resource's page. Limits («محدودیت‌ها») shows the maximum number of each resource in your account. --- title: "Dedicated servers" description: "Ordering a dedicated server in the Arianet panel step by step, tracking the order's stages, one-time login details, installing an operating system, renewal and cancelling an order." url: https://docs.ariaservice.net/en/panel/baremetal markdown: https://docs.ariaservice.net/en/panel/baremetal.md language: en --- # Dedicated servers A dedicated server is a complete physical server in OVHcloud data centers (Canada, Europe, Asia and Australia) that is yours alone. It is rented **monthly and prepaid**. > **Before you order** - The server is bought from the data center after you pay, and delivery takes **up to 72 hours** (longer for some configurations). Instant delivery is not guaranteed. - The server is delivered **without an operating system**; you install the operating system yourself from the panel after delivery. - First payment = first month's rent + a **one-time setup fee**. This amount is deducted from your wallet when you place the order, so [top up your account](https://docs.ariaservice.net/en/panel/wallet) before ordering. - Renewal is **not automatic**; you must renew manually every month. ## Ordering a dedicated server In the Dedicated server («سرور اختصاصی») menu, click Order a dedicated server («سفارش سرور اختصاصی»). The order has ten steps; in each step Continue («ادامه») takes you to the next step and Previous step («مرحله قبل») to the previous one. You can also go back to any completed step by clicking its number in the top bar. The Order summary («خلاصهٔ سفارش») box at the side of the page always shows your choices and the price. ### 1. Data center provider Choose the provider (currently OVHcloud). Its card lists the available countries, the number of models and the lowest price. ![Ordering a dedicated server, step 1: choosing the data center provider](https://docs.ariaservice.net/en/img/panel/bm-order-1.jpg) ### 2. Category Each category is designed for a use case; for example Kimsufi and So you Start are budget lines, Game is for high-frequency game servers, Advance is for businesses, and Scale and High Grade are for virtualization and heavy computing. The price on each card is the price of the cheapest model in that category. ![Step 2: choosing a server category](https://docs.ariaservice.net/en/img/panel/bm-order-2.jpg) ### 3. Model and processor Use the filters (CPU manufacturer, country, minimum cores, minimum RAM, disk type, server type and maximum monthly price) to find a suitable model, then click it. You can sort the list by Cheapest («ارزان‌ترین»), Most cores («بیشترین هسته») or Highest frequency («بیشترین فرکانس»). ![Step 3: choosing a model and processor with filters](https://docs.ariaservice.net/en/img/panel/bm-order-3.jpg) > **tip** Turn on the Available models only («فقط مدل‌های موجود») switch. Unavailable models are shown too, but cannot be ordered. Even a model marked Available («موجود») may be unavailable in some data centers or with some disks; if an option is disabled in a later step, choose another data center or model. ### 4. Country and data center Data centers are grouped by continent and country. Under each data center the delivery time (Delivery within 72 hours, «تحویل تا ۷۲ ساعت») or Unavailable («ناموجود») is shown. ![Step 4: choosing the country and data center](https://docs.ariaservice.net/en/img/panel/bm-order-4.jpg) ### 5. RAM The model's base RAM is Included in the price («شامل قیمت»). More RAM has an extra monthly cost, shown next to the option. ![Step 5: choosing RAM](https://docs.ariaservice.net/en/img/panel/bm-order-5.jpg) ### 6. Disks Choose the number and type of disks (HDD, SSD or NVMe) and the RAID type. From this step on, the summary box shows the First month's rent («اجارهٔ ماه اول»), Setup (one-time) («راه‌اندازی (یک‌بار)») and First payment («پرداخت اول») amounts. ![Step 6: choosing disks and RAID](https://docs.ariaservice.net/en/img/panel/bm-order-6.jpg) ### 7. Network The server's public bandwidth. The base bandwidth is included in the price. ![Step 7: network bandwidth](https://docs.ariaservice.net/en/img/panel/bm-order-7.jpg) ### 8. Extras (optional) Operating system licenses (such as Windows Server), software licenses and other extras. Each option's monthly cost is shown next to it. If you don't need any, click Continue without selecting anything. ![Step 8: extras and licenses](https://docs.ariaservice.net/en/img/panel/bm-order-8.jpg) ### 9. Rules Read the dedicated server rules in full, tick I have read and accept the rules («قوانین را خواندم و می‌پذیرم») and click Continue. ![Step 9: dedicated server rules](https://docs.ariaservice.net/en/img/panel/bm-order-9.jpg) ### 10. Cart and payment The full order summary and amount are shown. Optionally enter a Server name (optional) («نام سرور (اختیاری)») and click Pay from wallet («پرداخت از کیف پول»). ![Step 10: cart](https://docs.ariaservice.net/en/img/panel/bm-order-10.jpg) ![Cart: amount breakdown, wallet balance and the pay button](https://docs.ariaservice.net/en/img/panel/bm-order-11.jpg) If your wallet balance is less than the First payment, the order is not placed and the message Your wallet balance is not enough for this order («موجودی کیف پول برای این سفارش کافی نیست») is shown with the amount needed. Top up with the Top up wallet («شارژ کیف پول») link and click Pay from wallet again; your choices are kept. ![Insufficient wallet balance message](https://docs.ariaservice.net/en/img/panel/bm-order-low-balance.jpg) ## Tracking the order After you pay, the order page opens. The same page is also available from Dedicated servers → Orders («سرورهای اختصاصی ← سفارش‌ها»), or from the server page with View order and its stages («مشاهدهٔ سفارش و مراحل آن»). The Order status («وضعیت سفارش») shows the same stages our staff see, and you are notified of every change: 1. **Paid, waiting to buy from the data center** («پرداخت شد، در انتظار خرید از دیتاسنتر») 2. **Buying from the data center** («در حال خرید از دیتاسنتر») 3. **Order placed with the data center** («سفارش در دیتاسنتر ثبت شد»): from this stage on the order cannot be cancelled. 4. **The data center is preparing the server** («دیتاسنتر در حال آماده‌سازی سرور») 5. **Received, final preparation in progress** («تحویل گرفته شد، در حال آماده‌سازی نهایی») 6. **Active** («فعال»): the login details are ready on the server page. Click Manage server («مدیریت سرور»). ![Dedicated server order status page](https://docs.ariaservice.net/en/img/panel/bm-order-status.jpg) > **Cancelling an order** Until the Order placed with the data center stage, the Cancel order and get a full refund («لغو سفارش و بازگشت کامل وجه») button is active and the whole amount is returned to your wallet. Once the server has been bought from the data center, the period's amount is non-refundable. > **Price difference** Before buying, the data center's current price and the exchange rate are checked again. If the current price is more than 1% above what you paid, the order is paused and the order page gives you two options: Pay the difference from wallet («پرداخت مابه‌التفاوت از کیف پول») or cancel the order with a full refund. ## Managing a dedicated server Dedicated servers («سرورهای اختصاصی») lists your servers with status, IP, location, model and period end date. Click a server. ![Dedicated server management page](https://docs.ariaservice.net/en/img/panel/bm-server-1.jpg) The top of the page shows the server's name, status, IP and location, and the main buttons: Reinstall operating system («نصب مجدد سیستم‌عامل»), Show login details («نمایش اطلاعات ورود»), Renew («تمدید»), Support ticket («تیکت پشتیبانی»), Power on / off («روشن / خاموش کردن») and Restart («راه‌اندازی مجدد»). The My offer («پیشنهاد من») card shows the start date, the **next payment date** and the renewal type. > **note** The screenshots on this page show a Test sample («نمونه آزمایشی») label because they were taken from a sample server. Your real server does not have this label. ### Login details The login details (IP, username `root` and password) are shown **only once**. 1. In the Login details («اطلاعات ورود») section, click Show login details (one time only) («نمایش اطلاعات ورود (فقط یک‌بار)») and click Show details («نمایش اطلاعات») in the confirmation window. 2. Copy each item with the copy button next to it and save it **right away** somewhere safe (for example a password manager). ![Dedicated server login details](https://docs.ariaservice.net/en/img/panel/bm-credentials.jpg) > **danger** Once you close or refresh the page, the login details are no longer shown. Change the root password after your first login. ### Installing an operating system 1. In the Install operating system («نصب سیستم‌عامل») section, choose an operating system (such as Ubuntu, Debian, AlmaLinux, Rocky Linux or Proxmox). 2. Optionally enter a Server name (optional) («نام سرور (اختیاری)») and an SSH public key (optional) («کلید عمومی SSH (اختیاری)»). With an SSH key you can sign in without a password. [Creating an SSH key](https://docs.ariaservice.net/en/panel/ssh-keys-api) 3. Click Install operating system («نصب سیستم‌عامل») and confirm Install operating system again in the warning window. ![Operating system install form for a dedicated server](https://docs.ariaservice.net/en/img/panel/bm-os-install.jpg) ![Data loss warning before installing the operating system](https://docs.ariaservice.net/en/img/panel/bm-os-confirm.jpg) The message The operating system is being installed; this takes a few minutes («سیستم‌عامل در حال نصب است؛ این کار چند دقیقه طول می‌کشد») is shown. > **danger** Installing or reinstalling the operating system deletes **all data on all disks** and cannot be undone. Back up your data before reinstalling. ### Renewal - The renewal bill is issued **7 days before the end of the period** and you are notified. - Renew («تمدید») on the server page pays the amount from your wallet. - If it is not paid by **3 days before the end of the period**, the server is not renewed. > **End of period** A server that is not renewed is suspended at the end of the period and deleted according to the data center's deadline. All data is deleted and cannot be recovered. Backups are your responsibility. ## Important notes - Any attack, spam, scanning, phishing or illegal content is prohibited and leads to the service being suspended **without a refund**. [Abuse center](https://docs.ariaservice.net/en/panel/abuse-center) - For any problem, use the Support ticket button on that server's page so the ticket is linked to the server. [Support tickets](https://docs.ariaservice.net/en/panel/tickets) - Keep track of the next payment date on the My offer card, and keep balance notifications turned on in your [profile](https://docs.ariaservice.net/en/panel/profile#notifications). --- title: "Hosting" description: "Buying shared or reseller hosting in the Arianet panel step by step, connecting a domain with name servers, signing in to the control panel, email, databases, CageFS security, renewal, extra traffic and deleting hosting." url: https://docs.ariaservice.net/en/panel/hosting markdown: https://docs.ariaservice.net/en/panel/hosting.md language: en --- # Hosting Arianet shared hosting runs on servers in a Tehran data center, with a **free SSL certificate** and a ready-to-use control panel. Hosting is **prepaid**: the cost of the chosen period (weekly to yearly) is deducted from your wallet. ## Buying hosting In the Hosting («هاستینگ») menu, click Buy hosting («خرید هاستینگ»). Buying has three steps: **Data center and plan**, **Domain** and **Final confirmation**. The Order summary («خلاصه سفارش») box at the side of the page shows your choices, the order amount and your wallet balance. ### 1. Data center, hosting type and plan 1. **Data center** («دیتاسنتر»): where the hosting server is (for example Tehran). 2. **Hosting type** («نوع هاست»): - **Shared hosting** («هاست اشتراکی»): ready-made hosting for your own site; suitable for personal, company and online-shop sites, with a ready management panel, email and databases. - **Reseller hosting** («نمایندگی هاست»): for selling hosting under your own brand; create accounts for your customers and manage them in WHM or DirectAdmin. 3. **Plan and billing period** («پلن و دوره پرداخت»): first choose the period (weekly, monthly, quarterly, six-monthly or yearly) so that every plan's price is shown for that period. Then click Select («انتخاب») on a plan. Each plan's card lists its space, bandwidth, number of subdomains, RAM and CPU. ![Choosing the data center and hosting type](https://docs.ariaservice.net/en/img/panel/host-buy-1.jpg) ![Choosing the billing period and plan](https://docs.ariaservice.net/en/img/panel/host-buy-2.jpg) > **tip** Longer periods are cheaper: quarterly has a 5% discount, six-monthly 10% and yearly 17%. To try it out, choose the weekly period. Click Continue («ادامه»). ### 2. Domain and account details - **Domain** («دامنه»): if you already have a domain, choose I already have a domain («دامنه از قبل دارم») and enter its name; otherwise choose Register a new domain («ثبت دامنه‌ی جدید»). - **cPanel password** («رمز عبور cPanel»): the password for signing in to the control panel; at least 8 characters with one uppercase letter, one lowercase letter and one digit. Use Generate («تولید خودکار») to create a strong password. - **Contact email (optional)** («ایمیل تماس (اختیاری)») ![Domain and cPanel password](https://docs.ariaservice.net/en/img/panel/host-buy-3.jpg) ### 3. Final confirmation Check the domain and email in Order review («مرور سفارش») and click Place hosting order («ثبت سفارش هاستینگ»). The cost of the period is deducted from your wallet. ![Reviewing and placing the hosting order](https://docs.ariaservice.net/en/img/panel/host-buy-4.jpg) The Preparing your hosting («در حال آماده‌سازی هاستینگ شما») page opens. Creating the account usually takes less than a minute. After the message Your hosting was created successfully! («هاستینگ شما با موفقیت ساخته شد!»), click View my hosting («مشاهده هاستینگ من»). ![Preparing the hosting](https://docs.ariaservice.net/en/img/panel/host-creating.jpg) ![Hosting created successfully](https://docs.ariaservice.net/en/img/panel/host-created.jpg) ## Managing hosting Open the hosting in My hosting («هاستینگ‌های من»). The top of the page shows the domain, status, plan, location, username, IP and PHP version, the Sign in to control panel («ورود به کنترل‌پنل») and Ticket («تیکت») buttons, and the "…" menu (support ticket, change password, change plan, full reset, delete hosting). ![Hosting management page](https://docs.ariaservice.net/en/img/panel/host-manage-1.jpg) ### Overview - **Shortcuts**: file manager, terminal (command line in the browser), webmail, email accounts, databases, change password, change plan and full reset - **Resource usage**: disk space, number of email accounts and databases - **Traffic**: download and upload for this period, the download quota and a daily usage chart (upload is free) - **Hosting IP address** - **Domain connection (Name Server)** and **Recent activity** ![Name servers, hosting IP and traffic](https://docs.ariaservice.net/en/img/panel/host-manage-2.jpg) ### Connecting a domain to the hosting 1. In the Domain connection (Name Server) («اتصال دامنه (Name Server)») section, click Copy all («کپی همه»). 2. Sign in to your domain registrar's panel and open its "Name Server / DNS" section. 3. Replace the current name servers with Arianet's name servers (for example `ns1.ariaservice.net` and `ns2.ariaservice.net`) and save. > **note** A name server change can take **24 to 48 hours** to take effect. If you got the domain from Arianet, change the name servers on the [domain](https://docs.ariaservice.net/en/panel/domains) page. > **tip** Use the hosting IP when registering your site with a bank or payment gateway. ### Email The Email («ایمیل») tab shows the domain's business email accounts (such as `info@example.com`). Create an email account with New account («حساب جدید») and read and send email in your browser with Webmail («وب‌میل»). ![Hosting email accounts](https://docs.ariaservice.net/en/img/panel/host-email.jpg) ### Database In the Database («دیتابیس») tab, create a MySQL database and its user; enter the database name, username and password in your site's settings (for example WordPress's `wp-config.php`). ### Security and resources - **Account isolation (CageFS)** («ایزوله‌سازی حساب»): your site's files and processes are not visible to other users on the server. - **Link protection (LinkSafe)** («محافظت از لینک‌ها»): blocks symlink and hardlink attacks on other users' files. - **Alerts** («هشدارها»): events such as blocked attacks, the disk filling up and reaching the resource limit. - **Dedicated resources and usage** («منابع اختصاصی و مصرف»): the plan's resource limits and peak usage over the chosen range (one hour to 30 days). ![Hosting security and resources](https://docs.ariaservice.net/en/img/panel/host-security.jpg) > **tip** If your site is slow or returns a 508 error, check in Dedicated resources and usage whether you have hit the CPU or RAM limit. If so, [upgrade your plan](#settings). ### Redis cache In the Redis cache («کش Redis») tab you can turn on Redis to speed up your site (for example with a WordPress caching plugin). ### Billing and renewal The Billing («صورتحساب») tab shows the billing period, the **next renewal date**, the cost per period and the **auto-renewal** switch. View this service's costs («مشاهده هزینه‌های این سرویس») shows every payment for this hosting. ![Hosting billing and renewal](https://docs.ariaservice.net/en/img/panel/host-billing.jpg) > **caution** Turn on auto-renewal and keep enough wallet balance before the renewal date so that the hosting is not suspended. ### Settings - **Password** («رمز عبور»): change the control panel password - **Plan** («پلن»): upgrade to a higher plan - **Change primary domain** («تغییر دامنه‌ی اصلی»): the first change is free - **Control panel** («کنترل‌پنل»): sign in directly to the hosting management panel - **Extra traffic** («ترافیک مازاد»): if Pay for extra traffic («پرداخت ترافیک مازاد») is on, once the period's download quota runs out, the cost of each extra gigabyte is deducted from your wallet and the site stays online. ![Hosting settings](https://docs.ariaservice.net/en/img/panel/host-settings.jpg) ### Full reset Full reset («بازنشانی کامل») returns the hosting to its day-one state. > **danger** A full reset deletes **all the hosting's files, emails and databases**. Take a backup first. ## Deleting hosting 1. From the "…" menu at the top of the page, click Delete hosting («حذف هاست»). 2. Type the domain name to confirm. 3. Tick I understand that all data will be permanently deleted and cannot be recovered («می‌دانم که همه‌ی داده‌ها برای همیشه حذف می‌شود و قابل بازگشت نیست») and click Delete hosting permanently («حذف همیشگی هاست»). ![Hosting's more-actions menu](https://docs.ariaservice.net/en/img/panel/host-menu.jpg) ![Confirming hosting deletion](https://docs.ariaservice.net/en/img/panel/host-delete.jpg) > **danger** Deleting hosting is irreversible: all files, databases and emails are deleted, and **the cost of the paid period is not refunded**. --- title: "Domains, SSL and Cloudflare" description: "Registering, transferring and renewing domains in the Arianet panel, domain profiles, name servers, domain lock, DNSSEC, SSL certificates and connecting Cloudflare." url: https://docs.ariaservice.net/en/panel/domains markdown: https://docs.ariaservice.net/en/panel/domains.md language: en --- # Domains, SSL and Cloudflare In the Domains and DNS («دامنه و DNS») menu, the My domains («دامنه‌های من») page shows all your domains with their status, expiry date, auto-renewal and name servers. The Register new domain («ثبت دامنه جدید»), Transfer domain («انتقال دامنه») and SSL certificate («گواهی SSL») buttons are at the top of this page. ![My domains](https://docs.ariaservice.net/en/img/panel/domains-list.jpg) ## Domain profile To register a domain you first need a **domain profile** («پروفایل دامنه»): the owner's details and default name servers, which are sent to the registry with the same details for every domain. 1. In Domains and DNS → Domain profile («دامنه و DNS ← پروفایل دامنه»), click New profile («پروفایل جدید»). 2. Fill in the form **in Latin characters**: - **Profile name** (to recognize it in the panel) and, optionally, Default profile («پروفایل پیش‌فرض») - the owner's **full name** and **email** - **Phone** in the format `+countrycode.number`, for example `+98.2112345678` - **Organization** (optional), **Country** (two-letter uppercase code, for example `IR`), **State/province**, **City**, **Postal code** and **Full address** - **Name servers**: at least 2 and at most 6; add more with Add name server («افزودن نیم‌سرور») 3. Click Save profile («ذخیره پروفایل»). ![Creating a domain profile](https://docs.ariaservice.net/en/img/panel/domains-profile-new.jpg) Profiles are listed with their contact name, phone, address and name servers, and are managed with Edit («ویرایش»), Default («پیش‌فرض») and the delete button. ![Domain profile list](https://docs.ariaservice.net/en/img/panel/domains-profiles.jpg) > **caution** Enter the domain owner's details correctly and in your own name; legal ownership of the domain is based on these details, and they are needed to transfer or recover the domain. The owner's email must be reachable; the registry's confirmation messages are sent to it. ## Registering a domain 1. In Domains and DNS → Register new domain («دامنه و DNS ← ثبت دامنه جدید»), type the full domain name (for example `example.com`) and press Enter or click Add and check («افزودن و بررسی»). You can add up to 10 domains in a row to the check queue; each domain is checked 5 seconds apart. 2. Domain check results («نتایج بررسی دامنه‌ها») shows each domain's status (Available «قابل ثبت», Registered «ثبت شده» or Premium «پرمیوم») and its yearly price in Rials. Add («افزودن») the available domains. ![Domain search](https://docs.ariaservice.net/en/img/panel/domains-register.jpg) ![Domain check results](https://docs.ariaservice.net/en/img/panel/domains-search.jpg) 3. In Selected domains («دامنه‌های انتخاب شده»), set the **name servers**, **registration period** (1 to 10 years) and **profile** for each domain. Each domain's price and the **total price** at the bottom of the table are updated. 4. Click Continue and submit request («ادامه و ثبت درخواست»). The amount is deducted from your wallet and the registration status is updated in Domain registration status («وضعیت ثبت دامنه‌ها»). ![Domain cart](https://docs.ariaservice.net/en/img/panel/domains-cart.jpg) > **tip** - [Top up your account](https://docs.ariaservice.net/en/panel/wallet) before registering; your balance must be at least the total price. - If the domain is for [Arianet hosting](https://docs.ariaservice.net/en/panel/hosting), use Arianet's name servers so the domain connects to the hosting with no extra work. - Domains are sent for registration in groups of at most 10. ## Transferring a domain to Arianet In Transfer domain («انتقال دامنه»), enter the domain name and the transfer code (EPP / Auth Code), choose a profile and click Submit transfer request («ثبت درخواست انتقال»). Get the transfer code from your current registrar and remove the domain lock there. ## Managing a domain - **Domain renewal** and **auto-renewal** - **Name servers**: change the domain's DNS - **Privacy protection**: hide the owner's details in WHOIS - **Security and operations**: domain lock, requesting an EPP code for a transfer - **DNSSEC management** - **Events**: the history of actions taken on the domain ## SSL certificate 1. In SSL certificate («گواهی SSL»), click Request SSL («درخواست SSL») and choose a plan (to cover all subdomains, choose a plan with Wildcard support). 2. Enter the domain. Validation is done through DNS. 3. After you place the order, the required DNS records are shown. Add them to the domain's DNS and click Check DNS and issue certificate («بررسی DNS و صدور گواهی»). 4. Once issued, download the certificate. ## Cloudflare In Cloudflare management («مدیریت Cloudflare»), connect your Cloudflare account with an API token and click Test connection («تست اتصال»). You can then add domains to Cloudflare and manage their DNS records from this panel. --- title: "SMS" description: "Sending single and bulk SMS in the Arianet panel, cost estimates, scheduling, sender lines, templates, received messages, webhooks and connecting through the API." url: https://docs.ariaservice.net/en/panel/sms markdown: https://docs.ariaservice.net/en/panel/sms.md language: en --- # SMS With the Arianet SMS service you can send single and bulk SMS, see received messages, and send SMS from your own software through the API. **SMS costs are deducted from the same account wallet.** ## Overview SMS → Overview («پیامک ← نمای کلی») shows statistics for the last 30 days: the number sent, delivered, failed and the cost, along with your wallet balance. ![SMS overview](https://docs.ariaservice.net/en/img/panel/sms-dashboard.jpg) The SMS menu has three sections: - **Messages** («پیام‌ها»): Send SMS, Sends, Messages, Scheduled, Received - **Settings** («تنظیمات»): Sender lines, Templates, Blocked, Webhook, Web service - **Reports** («گزارش»): Reports ## Sending an SMS 1. Open Send SMS («ارسال پیامک»). 2. In **Recipients** («گیرندگان»), write each number on its own line (at most **100 numbers** per send). The number of valid numbers is shown below the box. 3. Choose the **Sender line** («خط ارسال»); recipients see this number as the sender. 4. If needed, choose a **Template** («قالب») or write the **Message text** («متن پیام»). 5. To send later, tick Send at a specific time («ارسال در زمان مشخص») and choose the time. 6. Check the **Cost estimate** («برآورد هزینه») box and click Send («ارسال»). ![SMS send form and cost estimate](https://docs.ariaservice.net/en/img/panel/sms-send.jpg) > **Message parts and cost** A long SMS is sent in several **parts**, and each part is charged: - Persian text: up to **70** characters per part - English text: up to **160** characters per part The number of characters and parts is shown below the text box. Cost estimate = number of recipients × parts per message × price per part. > **tip** - Before a bulk send, send the text once to your own number. - Write numbers in the format `09xxxxxxxxx`; invalid numbers are not counted. - To send to more than 100 people, do several separate sends or use the [API](#connect-via-api). ## Tracking sends - **Sends** («ارسال‌ها»): each group send with the delivery status of each number; get it as a file with CSV export («خروجی CSV»). - **Messages** («پیام‌ها»): every individual message sent - **Scheduled** («زمان‌بندی‌شده»): future sends; you can Cancel («لغو») them before the send time. - **Received** («دریافتی»): replies that have reached your lines - **Reports** («گزارش‌ها»): send and cost statistics for any date range ## Sender lines Sender lines («خطوط ارسال») shows your sender numbers with their status and request date. For a dedicated line, click Request new line («درخواست خط جدید»). ![Sender lines](https://docs.ariaservice.net/en/img/panel/sms-lines.jpg) ## Templates and blocked numbers - **Templates** («قالب‌ها»): ready-made texts for quick sending - **Blocked** («مسدودشده‌ها»): numbers that SMS is not sent to (for example people who have unsubscribed) ## Connect via API Web service («وب سرویس») shows the API address (`https://api.ariaservice.net/sms/v1`), the OpenAPI file, the token permissions needed and a sample send with `curl`. 1. Click Create SMS API token («ساخت توکن API پیامک») and give it only the permissions it needs, for example `sms:messages:write` to send and `sms:messages:read` to read delivery status. 2. Send the token in the `Authorization: Bearer ` header of every request. ![SMS web service](https://docs.ariaservice.net/en/img/panel/sms-api.jpg) In Webhook («وب‌هوک»), set an address so that delivery statuses and received messages are sent to your software. Full documentation: [SMS API](https://docs.ariaservice.net/en/sms/api). On token security: [API tokens](https://docs.ariaservice.net/en/panel/ssh-keys-api#api-tokens). --- title: "Abuse center" description: "Viewing abuse reports for your services in the Arianet panel, the abuse score, replying to a report and requesting reactivation." url: https://docs.ariaservice.net/en/panel/abuse-center markdown: https://docs.ariaservice.net/en/panel/abuse-center.md language: en --- # Abuse center If an abuse report is received about one of your services — for example spam, an attack, scanning or phishing — it is recorded in the Abuse center («مرکز سوءاستفاده») and you are notified. A service that has been suspended for abuse shows a link to this center on its page. Direct address: [panel.ariaservice.net/abuse-center](https://panel.ariaservice.net/abuse-center). ## Overview - **Abuse score** («امتیاز سوءاستفاده»): the overall state of the account (Healthy, «سالم», means you have no open reports) - The number of reports by **severity**: low, medium, high, critical and resolved - The total number of reports, and how many are open, resolved and pending - **The list of reports**, with ID, title, type, severity, status, date and **reply deadline**; with search and filters for status, severity and type ![Abuse center](https://docs.ariaservice.net/en/img/panel/abuse-1.jpg) ## Replying to a report 1. Open the report. You see its type, severity, reply deadline, the related service, Evidence and documents («مدارک و مستندات») and Report history («تاریخچه گزارش»). 2. Click Reply («پاسخ») and choose the reply type: **Explanation** («توضیح»), **Dispute** («اعتراض»), **Proof of fix** («مدرک رفع مشکل») or **Reactivation request** («درخواست فعال‌سازی»). 3. Write a full explanation (at least 20 characters) and, if needed, attach up to **5 files** (up to 5 MB each). 4. Send the reply and follow the report's status. > **tip** - Reply **before the reply deadline**; an unanswered report can lead to the service being suspended. - First fix the problem on the server (remove malware, change passwords, shut down the compromised service), then send a Proof of fix. A reply without a fix does not lead to reactivation. - If you believe the report is wrong, choose Dispute and attach evidence (for example logs). > **danger** Any attack, spam, scanning, phishing or illegal content is prohibited and may lead to the service being suspended **without a refund**. --- title: "Arianet Cloud API" description: "The Arianet Cloud API at api.ariaservice.net/cloud/v1 - servers, volumes, networks, firewalls, IPs, load balancers, images, pricing and rate limits." url: https://docs.ariaservice.net/en/cloud-api markdown: https://docs.ariaservice.net/en/cloud-api.md language: en --- # Arianet Cloud API The Cloud API manages **Arianet Cloud** resources: servers, volumes, private networks, NAT gateways, firewalls, floating, elastic and primary IPs, load balancers, images, snapshots and backups. The [`arianet cloud`](https://docs.ariaservice.net/en/cli#arianet-cloud) CLI commands and the [Terraform provider](https://docs.ariaservice.net/en/terraform) are built on it. - **Base URL:** `https://api.ariaservice.net/cloud/v1` - **Format:** JSON over HTTPS - **Auth:** a personal API token sent as a Bearer token ([Authentication](https://docs.ariaservice.net/en/authentication)) - **OpenAPI 3.1:** [`https://api.ariaservice.net/cloud/v1/openapi.json`](https://api.ariaservice.net/cloud/v1/openapi.json), browsable in the [interactive reference](https://docs.ariaservice.net/en/cloud-api-reference) > **VPS or Cloud?** VPS ordered through `/api/v1/servers` (the `arianet vps` commands) are documented in the [VPS API](https://docs.ariaservice.net/en/api-endpoints). This page covers Arianet Cloud only. Both APIs accept the same token. ## Quick start 1. Create a token in the panel at [cloud.ariaservice.net/users/api-tokens](https://cloud.ariaservice.net/users/api-tokens) with the scopes `cloud:servers:read` (every `GET`) and `cloud:servers:write` (every change). 2. Call the API: ```bash export ARIANET_TOKEN="paste-your-token-here" BASE=https://api.ariaservice.net/cloud/v1 AUTH="Authorization: Bearer $ARIANET_TOKEN" curl -s $BASE/datacenters -H "$AUTH" # datacenter codes, e.g. ovh curl -s "$BASE/plans?datacenter=ovh" -H "$AUTH" # plan ids and prices curl -s "$BASE/images?type=system" -H "$AUTH" # image slugs, e.g. ubuntu-24.04 curl -s -X POST $BASE/servers -H "$AUTH" -H "Content-Type: application/json" \ -d '{"name":"web-1","datacenter":"ovh","plan_id":3,"image":"ubuntu-24.04","ssh_key_ids":[5],"labels":{"role":"web"}}' ``` The create answers `201` with the server, the `action_id` of its create action and a `root_password` that is shown **once** (it is never stored in the clear). `count` (1-10) creates several servers in one call. Follow the action until it finishes (see [Actions](#asynchronous-actions)). ## Authentication ```text Authorization: Bearer ``` | Scope | Allows | |---|---| | `cloud:servers:read` | every `GET` | | `cloud:servers:write` | every `POST`, `PUT`, `PATCH` and `DELETE` | Resources are always those of the token's account. A missing, invalid or revoked token answers `401`; a token without the needed scope, or used from an address outside its IP allowlist, answers `403`. ## Public price list The price list needs **no token** and may be called from any origin (cached for a minute): ```bash curl -s https://api.ariaservice.net/cloud/v1/public/pricing curl -s "https://api.ariaservice.net/cloud/v1/public/pricing?datacenter=ovh" ``` ```json { "pricing": { "vat_included": false, "hours_per_month": 730, "server_types": [ { "id": 1, "name": "C1", "group": "shared", "cores": 1, "memory_mb": 2048, "disk_gb": 20, "included_traffic_gb": 20000, "minimum_usage_hours": 1, "prices": [ { "location": "ovh", "price_hourly": { "net": 900, "currency": "IRR" }, "price_monthly": { "net": 657000, "currency": "IRR" } } ] } ], "resources": [ { "sku": "volume_gb", "location": "ovh", "unit": "...", "price_hourly": { "net": 0, "currency": "IRR" }, "price_monthly": { "net": 0, "currency": "IRR" } } ] } } ``` `server_types` lists every plan with its price per location; `resources` lists every other price on sale (`primary_ipv4`, `floating_ipv4`, `floating_ipv6`, `elastic_ipv4`, `volume_gb`, `snapshot_gb`, `backup` as a percentage of the plan, load balancer types and `nat_gateway`). Prices exclude VAT and come from the same rows billing uses. `GET /pricing` (with a token) returns your account's own price rows. ## Lists, labels and projects Every resource list takes: | Parameter | Meaning | |---|---| | `label_selector` | Comma-separated terms that must all hold: `key=value`, `key!=value`, `key` (has the label) or `!key` (has not). Example: `env=prod,tier!=db`. A malformed selector answers `422 invalid_label_selector`. | | `project_id` | Only resources in this project | | `page`, `per_page` | Opt-in paging: `per_page` 1-100, default 25. Without `page` and `per_page` the whole list is returned as one page. | ```json { "data": [ { "id": 12, "name": "web-1" } ], "meta": { "pagination": { "page": 1, "per_page": 25, "previous_page": null, "next_page": null, "last_page": 1 } } } ``` Resources carry `labels` (key/value pairs) and belong to a project (the account's default project unless you pass `project_id` on create). `PATCH` changes name, labels, delete protection (`protection_delete`) and project; only the fields you send change. ## Asynchronous actions A change that takes time answers `202` (or `201` for a create) with an `action_id`. Poll the action until `status` is `success` or `error`: ```bash curl -s $BASE/actions/812 -H "$AUTH" # {"data":{"id":812,"command":"create","status":"running","progress":40,"resource":{...},"error":null,"started_at":"...","finished_at":null}} ``` `GET /actions` lists the account's actions (newest first) and `GET //{id}/actions` those of one resource. With the CLI: `arianet cloud actions wait `. ## Errors Every error uses one envelope: ```json { "error": "Human-readable message", "code": "not_found", "reason": "..." } ``` Branch on `code`, which is stable. `reason` narrows it when there is more than one way to hit it (for example the resource for `quota_exceeded`). The codes each HTTP status can carry are listed under `x-error-codes` in the OpenAPI document. | HTTP | Typical `code` | |---|---| | 400 | `invalid_input` | | 401 | `unauthorized` | | 402 | not enough balance for the order | | 403 | `forbidden`, `identity_needed` | | 404 | `not_found` | | 409 | the resource's state does not allow this now (`already_attached`, `ip_change_fee_not_confirmed`, ...) | | 422 | well-formed but refused (`datacenter_closed`, `invalid_label_selector`, `quota_exceeded`, `plan_sold_out`, ...) | | 423 | `locked`, `server_locked`, `lb_locked`: the resource is busy with another operation | | 429 | `rate_limit_exceeded` | | 503 | `unavailable`, `datacenter_unavailable`, ... (carries `Retry-After`) | ## Rate limits Each token's account and user may make **3600 requests an hour** and **60 a minute**. Every answer carries: | Header | Meaning | |---|---| | `RateLimit-Limit` | Requests allowed in the current window | | `RateLimit-Remaining` | Requests left in the window | | `RateLimit-Reset` | Seconds until the window resets | Over the limit the answer is `429` with code `rate_limit_exceeded` and a `Retry-After` header (seconds). Wait that long before retrying. A `503` also carries `Retry-After`. ```bash curl -s -D - -o /dev/null $BASE/servers -H "$AUTH" | grep -i -e ratelimit -e retry-after ``` ## Servers | Method and path | What it does | |---|---| | `GET /servers` | List servers | | `POST /servers` | Create one server, or up to 10 with `count` | | `GET /servers/{id}` | One server | | `PATCH /servers/{id}` | Change `name`, `labels`, `protection_delete`, `protection_rebuild` or `project_id` | | `DELETE /servers/{id}` | Delete a server (options below) | | `POST /servers/{id}/actions/{op}` | `poweron`, `poweroff` (hard), `shutdown` (ACPI), `reboot`, `reset`, `rebuild` (`{"image":"..."}`), `change_plan` (`{"plan_id":4}`), `enable_rescue`, `disable_rescue`, `reset_password`, `change_ipv4` (`{"confirm_paid":true}` for a paid change) | | `POST /servers/{id}/actions/attach_to_network`, `detach_from_network` | Private networks | | `POST /servers/{id}/actions/enable_backup`, `disable_backup`, `change_backup_window`, `create_backup`, `restore_backup` | Backups | | `POST /servers/{id}/actions/create_image` | Snapshot the server | | `GET /servers/{id}/costs` | What the server costs (below) | | `GET /servers/{id}/actions`, `/backups`, `/snapshots`, `/metrics`, `/networking`, `/storage`, `/events`, `/ip-changes` | Details and history | | `POST /servers/{id}/console` | A single-use VNC console link, valid for 60 seconds | Create body fields: `name`, `datacenter`, `plan_id`, `image` (required); `ssh_key_ids`, `ssh_keys`, `user_data` (cloud-init, at most 32 KiB), `start_after_create`, `firewall_ids`, `networks`, `volume_ids`, `backups`, `labels`, `project_id`, `count`. `image` is a slug such as `ubuntu-24.04`, or `snapshot:` / `backup:`. ### Deleting a server ```bash curl -s -X DELETE "$BASE/servers/12?keep_backups=true&delete_snapshots=true" -H "$AUTH" ``` | Query parameter | Default | Meaning | |---|---|---| | `keep_backups` | `false` | Keep the finished backups as snapshots, billed per GB until you delete them (`402` when the balance does not cover them) | | `delete_snapshots` | `false` | Delete the server's snapshots too; protected ones stay. By default snapshots survive the server and stay billed. | | `reason` | - | Why: `price`, `performance`, `ip_filtered`, `no_longer_needed`, `migrating`, `support` or `other` | | `note` | - | A few words why (required with `reason=other`, at most 500 characters) | A server with delete protection must have it turned off first (`PATCH /servers/{id}` with `{"protection_delete": false}`). ### Server costs `GET /servers/{id}/costs` returns the server's current hourly and monthly rate per billed piece and what its copies would cost after a delete: ```json { "data": { "server_id": 12, "hours_per_month": 730, "lines": [ { "type": "server", "id": 12, "name": "web-1", "sku": "...", "quantity": 1, "unit": "...", "hourly_price": 3300, "monthly_price": 2409000, "currency": "IRR" }, { "type": "volume", "id": 7, "name": "data", "sku": "volume_gb", "quantity": 50, "unit": "...", "hourly_price": 0, "monthly_price": 0, "currency": "IRR" } ], "totals": [ { "currency": "IRR", "hourly_price": 3300, "monthly_price": 2409000 } ], "snapshots": { "count": 1, "size_gb": 20, "hourly_price": 0, "monthly_price": 0, "currency": "IRR" }, "kept_backups": { "count": 0, "size_gb": 0, "hourly_price": 0, "monthly_price": 0, "currency": "IRR" } } } ``` Line `type` is `server`, `primary_ipv4`, `floating_ip`, `elastic_ip`, `volume` or `backup`; `quantity` is 1, a volume's GB, or the backup's percent of the plan. `totals` sums the lines per currency. `snapshots` stay billed after a delete; `kept_backups` only with `keep_backups=true`. (Numbers above are illustrative.) ## Other resources | Resource | Paths | |---|---| | Volumes | `/volumes`, `/volumes/{id}`, `POST /volumes/{id}/actions/{op}` (`attach` with `server_id`, `detach`, `resize` with `size_gb`, grow only), `GET /volume-prices` | | Private networks | `/networks`, `/networks/{id}`, `POST /networks/{id}/subnets`, `DELETE /networks/{id}/subnets/{subnet}`, `PUT /networks/{id}/routes` | | NAT gateways | `/nat-gateways`, `/nat-gateways/{id}` | | Firewalls | `/firewalls`, `/firewalls/{id}` (`PUT` replaces the rules), `PUT /firewalls/{id}/servers`, `POST /firewalls/{id}/actions/{op}` (`apply_to_resources`, `remove_from_resources`) | | Floating IPs | `/floating-ips`, `/floating-ips/{id}`, `POST /floating-ips/{id}/actions/{op}` (`assign`, `unassign`, `change_dns_ptr`) | | Elastic IPs | `/elastic-ips`, `/elastic-ips/{id}`, `POST /elastic-ips/{id}/actions/{op}` (`assign`, `unassign`) | | Primary IPs | `/primary-ips`, `/primary-ips/{id}`, `POST /primary-ips/{id}/actions/change_dns_ptr` | | Load balancers | `/load-balancers`, `/load-balancers/{id}`, `POST /load-balancers/{id}/actions/{op}` (services, targets, type, algorithm, private network), `GET /load-balancers/{id}/health`, `GET /load-balancer-types` | | Images | `GET /images`, `GET /images/custom`, `GET /datacenters/{code}/images` | | Snapshots and backups | `/snapshots`, `/snapshots/{id}`, `/backups`, `/backups/{id}`, `POST /backups/{id}/actions/convert` (keep a backup as a snapshot) | | Catalog and account | `GET /datacenters`, `GET /plans`, `GET /pricing`, `GET /public/pricing`, `GET /limits` | | Actions | `GET /actions`, `GET /actions/{id}`, `GET /actions/{id}/events` | Every field, body and answer is in the [interactive reference](https://docs.ariaservice.net/en/cloud-api-reference) and the [OpenAPI document](https://api.ariaservice.net/cloud/v1/openapi.json). ## Tools - [CLI](https://docs.ariaservice.net/en/cli#arianet-cloud): `arianet cloud ...` - [Terraform provider](https://docs.ariaservice.net/en/terraform): `ariaservice/arianet` --- title: "VPS API" description: "The Arianet VPS API at api.ariaservice.net/api/v1 - ordering servers with an Idempotency-Key, asynchronous operations, SSH keys, firewalls, balance, invoices, scopes and error codes." url: https://docs.ariaservice.net/en/api-endpoints markdown: https://docs.ariaservice.net/en/api-endpoints.md language: en --- # VPS API This page is for buying and managing **virtual private servers (VPS)** from code. The `arianet` CLI (the `arianet vps` commands), the Telegram bot and partner integrations all use it, and so can your own code. A machine-readable description is in `openapi.yaml`, published next to this documentation. - **Base URL:** `https://api.ariaservice.net/api/v1` - **Format:** JSON requests and responses over HTTPS - **Auth:** a personal API token sent as a Bearer token ([Authentication](https://docs.ariaservice.net/en/authentication)) - **OpenAPI 3.0:** [`openapi.yaml`](pathname:///openapi.yaml), browsable in the [interactive reference](https://docs.ariaservice.net/en/vps-api-reference) > **Arianet Cloud** This page covers the **VPS API** (`/api/v1`, the `arianet vps` commands). Arianet Cloud servers, volumes, networks, firewalls, IPs and load balancers have their own API at `https://api.ariaservice.net/cloud/v1`: see the [Cloud API](https://docs.ariaservice.net/en/cloud-api), its [interactive reference](https://docs.ariaservice.net/en/cloud-api-reference) and the [Terraform provider](https://docs.ariaservice.net/en/terraform). ## Quick start ### 1. Create a token Log in to the panel, open **Settings → API Tokens**, create a token, and copy it. It is shown once. You can limit a token to the scopes it needs and to the IP addresses it may be used from. ```bash export ARIANET_TOKEN="paste-your-token-here" ``` ### 2. Make a request ```bash curl https://api.ariaservice.net/api/v1/balance \ -H "Authorization: Bearer $ARIANET_TOKEN" ``` ### 3. Buy a server Find the ids you need (datacenter, plan, operating system), then create the server. The `Idempotency-Key` header is required, see [Idempotency](#idempotency). ```bash BASE=https://api.ariaservice.net/api/v1 AUTH="Authorization: Bearer $ARIANET_TOKEN" curl -s $BASE/regions -H "$AUTH" # datacenter ids curl -s $BASE/plans/datacenter/9 -H "$AUTH" # plan ids and prices curl -s $BASE/os/datacenter/9 -H "$AUTH" # os ids curl -s -X POST $BASE/servers \ -H "$AUTH" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{"plan_id":101,"datacenter_id":9,"os_id":55,"hostname":"web-1","auth_type":"password","auth_value":"Str0ng!Passw0rd"}' ``` The answer is `202 Accepted` while the server is being provisioned. Poll `GET /servers/{id}/status` until `status` is `active`. ## Authentication Send the token in the `Authorization` header of every request: ``` Authorization: Bearer ``` A missing, invalid, expired or revoked token answers `401 UNAUTHORIZED`. ### Scopes A token can carry a list of scopes. A token created without scopes is unrestricted. A request outside the token's scopes answers `403 INSUFFICIENT_SCOPE`. | Scope | Allows | |---|---| | `regions:read` | `GET /regions` | | `os:read` | `GET /os/datacenter/{id}` | | `plans:read` | `GET /plans/...` | | `servers:read` | `GET /servers`, `/servers/{id}`, `/servers/{id}/status`, `/servers/{id}/actions` | | `servers:write` | create, delete, restart, power on/off, rename, reinstall, protection | | `balance:read` | `GET /balance`, `/balance/transactions` | | `invoices:read` | `GET /invoices`, `/invoices/{number}` | | `ssh-keys:read` / `ssh-keys:write` | list and read / create, update and delete SSH keys | | `firewalls:read` / `firewalls:write` | list and read / manage firewalls, rules and attachments | | `tokens:read` / `tokens:write` | `GET /auth/tokens` / `DELETE /auth/tokens/{id}` | `GET /auth/me` and `DELETE /auth/logout` need no scope. ### IP allowlist A token can be limited to a list of source addresses. A request from any other address answers `403 IP_NOT_ALLOWED`. ### Token hygiene - Never put a token in client-side code or a repository; keep it in an environment variable or a secret store. - Create one token per application, with only the scopes it needs, so you can revoke one without breaking the others. - Rotate tokens regularly; revoke with `DELETE /auth/tokens/{id}`. ## Responses Every answer uses one envelope. ```json { "success": true, "data": { "id": 4821, "status": "active" } } ``` Lists add `pagination`: ```json { "success": true, "data": [ { "id": 4821 } ], "pagination": { "current_page": 1, "per_page": 15, "total": 40, "last_page": 3 } } ``` Errors: ```json { "success": false, "error": { "code": "INSUFFICIENT_BALANCE", "message": "Not enough balance. Required balance: 4.50" } } ``` Branch on `error.code`. `error.message` is written for people and may change. Lists take `page` (default 1) and `limit` (1-100, default 15; an out-of-range value falls back to 15). Timestamps are UTC, ISO 8601 (`2026-10-02T09:30:00Z`). ### Error codes | HTTP | `error.code` | Meaning | |---|---|---| | 400 | `VALIDATION_ERROR` | A field is missing or malformed; the message names it | | 400 | `INVALID_ID` | A path id is not a number | | 400 | `IDEMPOTENCY_KEY_REQUIRED` | `POST /servers` without an `Idempotency-Key` | | 400 | `INVALID_IDEMPOTENCY_KEY` | The key is not 8-128 characters of `A-Z a-z 0-9 _ - : .` | | 400 | `NO_DEFAULT_WALLET` | No `currency_id` was given and the account has no default wallet | | 400 | `BAD_REQUEST` | The platform rejected the request as malformed | | 401 | `UNAUTHORIZED` | Missing, invalid, expired or revoked token | | 402 | `INSUFFICIENT_BALANCE` | The wallet cannot cover the order | | 403 | `FORBIDDEN` | The account is not active or may not do this | | 403 | `INSUFFICIENT_SCOPE` | The token lacks the scope this endpoint needs | | 403 | `IP_NOT_ALLOWED` | The request comes from an address outside the token's allowlist | | 404 | `NOT_FOUND` | The resource does not exist in your account | | 409 | `CONFLICT` | A request with the same `Idempotency-Key` is still running; retry shortly | | 422 | `VALIDATION_ERROR` | Well formed but cannot be done now (server protected, plan sold out, key reused with a different body, ...) | | 422 | `FEATURE_NOT_SUPPORTED` | The datacenter does not offer this resource (for example a firewall or SSH key); check `supports` in `GET /regions` | | 429 | `RATE_LIMIT_EXCEEDED` | Too many requests | | 502 | `UPSTREAM_ERROR` | The platform could not complete the request; retry | | 503 | `UPSTREAM_UNAVAILABLE` / `WRITES_UNAVAILABLE` | The platform is temporarily unreachable; retry with the same key | | 500 | `INTERNAL_ERROR` | Unexpected error | Retry 429, 502 and 503 with back-off. Retrying a create is safe as long as you reuse the same `Idempotency-Key`. ## Rate limits Limits are per user, except creation which is per token. They are enforced independently by each API instance, so treat them as a floor, not an exact figure. | Group | Limit | |---|---| | Reads | 120 / minute, burst 20 | | Writes (actions, SSH keys, firewalls, tokens) | about 20 / minute, burst 5 | | `POST /servers` | burst 5, then 5 / hour per token; the platform also caps 10 / hour per account | When a limit is hit the API answers `429 RATE_LIMIT_EXCEEDED`. Creation also sends a `Retry-After` header (seconds). The API does not send `X-RateLimit-*` headers. ## Asynchronous operations Creating, deleting, reinstalling, restarting and powering a server on or off answer **`202 Accepted`**: the request was validated and started, the work is not finished. To know when it is: - poll `GET /servers/{id}/status` until `status` is `active` and `instance_status` is `RUNNING` (or `STOPPED` after a power-off), or - read `GET /servers/{id}/actions` for the operation history (`status` is `pending`, `running`, `success` or `failed`). A typical wait loop: ```bash until [ "$(curl -s $BASE/servers/4821/status -H "$AUTH" | jq -r .data.status)" = "active" ]; do sleep 5 done ``` Renaming and changing protection apply at once and answer `200`. ## Idempotency Creating a server spends money, so `POST /servers` requires an `Idempotency-Key` header: 8-128 characters of `A-Z a-z 0-9 _ - : .`, for example a UUID. - Retry with the **same key and the same body** and you never get a second server. The original answer is replayed for 24 hours and carries `Idempotent-Replayed: true`. - The **same key with a different body** answers `422`. - A retry while the first request is **still running** answers `409 CONFLICT`; wait a few seconds and try again. - Generate a new key for every new order, and keep it until you have a definite answer. The replayed answer contains the root password, so treat the key like a secret. ## Endpoint reference The sections below describe every endpoint, grouped by resource. The same information is in the [interactive VPS reference](https://docs.ariaservice.net/en/vps-api-reference). ## Account ### GET /auth/me The user the token belongs to. ```json { "success": true, "data": { "id": 17, "email": "user@example.com", "mobile": null, "status": "active", "verified": true } } ``` ### GET /auth/tokens Needs scope `tokens:read`. Your API tokens. The secret value is never returned, only a `prefix` to recognise it. ```json { "success": true, "data": { "tokens": [ { "id": 3, "name": "ci", "prefix": "ak_3f9c", "last_used": "2026-10-02T08:12:44Z", "expires": null, "created_at": "2026-09-01T10:00:00Z" } ] } } ``` ### `DELETE /auth/tokens/{id}` Needs scope `tokens:write`. Revoke one of your tokens. Answers `{"message": "Token revoked successfully"}`. ### DELETE /auth/logout Revoke the token used for this request. ## Catalog Catalogue data you need before buying a server. ### GET /regions Scope `regions:read`. Regions with their datacenters. A datacenter `id` is the `datacenter_id` used everywhere else. `supports` tells you which optional resources a datacenter offers: `ssh_keys` and `firewalls` are `true` when you can create them there. Creating one in a datacenter where it is `false` is refused with `422 FEATURE_NOT_SUPPORTED` before anything is sent to the platform. ```json { "success": true, "data": { "items": [ { "id": 2, "name": "Germany", "is_region": true, "status": "active", "is_default": false, "country_code": "DE", "flag": "https://.../de.svg", "datacenters": [ { "id": 9, "name": "Falkenstein", "is_default": false, "status": "active", "country_code": "DE", "flag": "https://.../de.svg", "features": [ { "name": "IPv6", "details": null, "quantity": 1 } ], "supports": { "ssh_keys": true, "firewalls": true } } ] } ] } } ``` ### `GET /os/datacenter/{datacenter_id}` Scope `os:read`. Operating systems grouped by family. The `id` of a template, or of one of its `children` (versions), is the `os_id` for creation and reinstall. ```json { "success": true, "data": { "groups": [ { "id": 1, "name": "Ubuntu", "type": "linux", "order": 1, "templates": { "data": [ { "id": 55, "name": "Ubuntu 24.04", "image_file": "ubuntu-24.04", "status": true, "datacenter": { "id": 9, "name": "fsn1", "display_name": "Falkenstein" }, "os_group": { "id": 1, "name": "Ubuntu", "type": "linux" }, "children": { "data": [] } } ] } } ] } } ``` ### `GET /plans/datacenter/{datacenter_id}` Scope `plans:read`. Plans orderable in a datacenter, grouped by family, with prices per currency. ```json { "success": true, "data": { "groups": [ { "id": 1, "name": "Standard", "plans": [ { "id": 101, "name": "std-2", "display_name": "Standard 2", "recommended": true, "cycle": "hourly", "cpu": { "size": 2, "unit": "vCPU" }, "ram": { "size": 4, "unit": "GB" }, "storage": { "size": 80, "unit": "GB" }, "prices": [ { "code": "USD", "currency": "US Dollar", "hourly": "0.0070", "monthly": "4.50", "yearly": "48.00" } ] } ] } ] } } ``` ### `GET /plans/{id}` Scope `plans:read`. One plan, same shape as an item above. ## Servers A server looks like this wherever it is listed or fetched: ```json { "id": 4821, "status": "active", "instance_status": "RUNNING", "name": "web-1", "hostname": "web-1", "ip_addresses": [ { "ip": "203.0.113.10", "type": "primary" } ], "protected": false, "cycle": "hourly", "plan": { "id": 101, "name": "std-2" }, "datacenter": { "id": 9, "name": "fsn1", "display_name": "Falkenstein", "country": "DE" }, "os": { "id": 55, "name": "Ubuntu 24.04" }, "created_at": "2026-10-02T09:30:00Z" } ``` `status` is the platform state (`creating`, `active`, `suspended`, `powering_on`, `powering_off`, `restarting`, `reinstalling_os`, `failed`, `terminated`, ...); `instance_status` is what the provider reports (`RUNNING`, `STOPPED`, `REBOOTING`, `REBUILDING`, `BUILD`, `ERROR`, ...). Address `type` is `primary`, `secondary` or `floating`. ### GET /servers Scope `servers:read`. Your servers, newest first. Query: `page`, `limit`, `status` (filter). ### `GET /servers/{id}` Scope `servers:read`. One server. ### `GET /servers/{id}/status` Scope `servers:read`. A small answer that is cheap to poll. ```json { "success": true, "data": { "id": 4821, "status": "active", "instance_status": "RUNNING" } } ``` ### `GET /servers/{id}/actions` Scope `servers:read`. The operation history of a server, newest first. Query: `limit` (1-100, default 15). ```json { "success": true, "data": { "server_id": 4821, "actions": [ { "id": "9b1f0c5e", "type": "restart", "status": "success", "started_at": "2026-10-02T09:40:00Z", "finished_at": "2026-10-02T09:40:09Z", "created_at": "2026-10-02T09:40:00Z" } ] } } ``` ### POST /servers Scope `servers:write`. Headers: `Idempotency-Key` (required). Answers `202`. | Field | Required | Description | |---|---|---| | `plan_id` | yes | From `/plans/datacenter/{id}` | | `datacenter_id` | yes | From `/regions` | | `os_id` | yes | From `/os/datacenter/{id}` | | `currency_id` | no | Wallet currency; defaults to your primary wallet (`NO_DEFAULT_WALLET` if none) | | `hostname` | no | Server name, up to 255 characters (`hostnames` is accepted as an alias and wins) | | `auth_type` | no | `password` (default) or `ssh` | | `auth_value` | with `password` | The root password | | `ssh_key_id` | with `ssh` | One of your SSH keys (`auth_id` is accepted as an alias) | | `project_id` | no | Project to place the server in | | `service_count` | no | 1-10 | ```json { "success": true, "data": { "id": 4821, "status": "creating", "instance_status": null, "name": "web-1", "ip_addresses": [], "protected": false, "cycle": "hourly", "plan": { "name": "std-2" }, "datacenter": { "id": 9 }, "os": { "name": "Ubuntu 24.04" }, "root_password": "Str0ng!Passw0rd", "created_at": "2026-10-02T09:30:00Z" } } ``` `root_password` is returned here only (and on an idempotent replay), and is absent for servers created with an SSH key. Addresses usually appear a little later; read the server again. The cost is reserved from the wallet at once. Possible errors: `402 INSUFFICIENT_BALANCE`, `403`, `409`, `422`, `429`. ### `DELETE /servers/{id}` Scope `servers:write`. Irreversible. A protected server must have protection switched off first. Answers `202`. Optional body: `{"reason": "other", "note": "..."}` (`reason` defaults to `other`, `note` up to 1000 characters). ```json { "success": true, "data": { "server_id": 4821, "message": "Server deletion started" } } ``` ### `POST /servers/{id}/restart` Scope `servers:write`. Optional body `{"mode": "soft" | "hard"}`. Answers `202` with `{"server_id": 4821, "message": "Restart started"}`. ### `POST /servers/{id}/power-on` Scope `servers:write`. Answers `202` with `{"server_id": 4821, "message": "Power on started"}`. ### `POST /servers/{id}/power-off` Scope `servers:write`. Answers `202` with `{"server_id": 4821, "message": "Power off started"}`. A powered-off server may still be billed. ### `POST /servers/{id}/rename` Scope `servers:write`. Body `{"name": "web-2"}` (1-30 characters). Answers `200` with `{"server_id": 4821, "name": "web-2"}`. The new label shows as `name` in server reads; `hostname` is the provider-side host name and does not change. ### `POST /servers/{id}/reinstall` Scope `servers:write`. Body `{"os_id": 56}`. **Erases all data on the server.** Answers `202` with `{"server_id": 4821, "message": "Reinstall started"}`. ### `POST /servers/{id}/toggle-protection` Scope `servers:write`. Body `{"enabled": true}` or `{"enabled": false}` sets the state explicitly; with no body the current state is flipped, so prefer the explicit form. Answers `200` with `{"server_id": 4821, "protected": true}`. ## SSH keys A key belongs to one datacenter, because providers keep keys per location. ```json { "id": 12, "name": "laptop", "key": "ssh-ed25519 AAAAC3Nza... me@laptop", "protected": false, "datacenter_id": 9, "created_at": "2026-10-01T12:00:00Z" } ``` | Endpoint | Scope | Notes | |---|---|---| | `GET /ssh-keys` | `ssh-keys:read` | Paginated | | `GET /ssh-keys/{id}` | `ssh-keys:read` | | | `POST /ssh-keys` | `ssh-keys:write` | Body `name`, `public_key`, `datacenter_id` (all required), `is_protected`. Answers `201` | | `PUT /ssh-keys/{id}` | `ssh-keys:write` | Body `name` and/or `is_protected`; at least one. The key material cannot be changed | | `DELETE /ssh-keys/{id}` | `ssh-keys:write` | Servers already created with the key are not affected | ## Firewalls ```json { "id": 7, "name": "web", "protected": false, "datacenter_id": 9, "rules": [ { "id": "r-91c2", "direction": "ingress", "protocol": "tcp", "port_range": "443", "remote_ip": "0.0.0.0/0", "description": "https" } ], "created_at": "2026-10-01T12:00:00Z" } ``` | Endpoint | Scope | Notes | |---|---|---| | `GET /firewalls` | `firewalls:read` | Paginated | | `GET /firewalls/{id}` | `firewalls:read` | With its rules | | `POST /firewalls` | `firewalls:write` | Body `name`, `datacenter_id` (required), `description`. Created empty; add rules afterwards. Answers `201` | | `PUT /firewalls/{id}` | `firewalls:write` | Body `name` and/or `description`; at least one. The answer carries no rules | | `DELETE /firewalls/{id}` | `firewalls:write` | | | `POST /firewalls/{id}/rules` | `firewalls:write` | Body `direction` (`ingress`/`egress`) and `protocol` (`tcp`, `udp`, `icmp`, `esp`, `gre`) required; `port_range`, `remote_ip`, `description` optional. `port_range` is a port or an ascending range within 1-65535 and `remote_ip` an IP address or CIDR, otherwise `400`. Answers `201` with the new rule | | `DELETE /firewalls/{id}/rules/{rule_id}` | `firewalls:write` | `rule_id` is the rule's `id` string | | `POST /firewalls/{id}/attach` | `firewalls:write` | Body `{"server_ids": [4821]}`, 1-50 ids, servers in the firewall's datacenter | | `POST /firewalls/{id}/detach` | `firewalls:write` | Same body | ## Billing ### GET /balance Scope `balance:read`. One wallet per currency. `primary` marks the default wallet used when `currency_id` is omitted at creation. ```json { "success": true, "data": { "wallets": [ { "id": 31, "balance": 25.4, "primary": true, "status": "active", "currency": { "id": 1, "code": "USD", "name": "US Dollar", "symbol": "$" } } ] } } ``` ### GET /balance/transactions Scope `balance:read`. Paginated. ```json { "id": 905, "mode": "debit", "amount": 4.5, "status": "paid", "reference": "0b6c...", "type": "service", "currency": { "id": 1, "code": "USD", "name": "US Dollar", "symbol": "$" }, "created_at": "2026-10-02T09:30:00Z" } ``` ### GET /invoices Scope `invoices:read`. Paginated, newest first; zero-amount invoices are not listed. Query: `page`, `limit`, `status` (`draft`, `issued`, `paid`, `overdue`, `cancelled`). ```json { "number": "INV-2026-000123", "status": "paid", "payment_status": "paid", "subtotal": 4.5, "discount": 0, "tax": 0, "total": 4.5, "issued_at": "2026-10-02T09:30:00Z", "due_at": "2026-10-09T09:30:00Z", "paid_at": "2026-10-02T09:31:00Z" } ``` ### `GET /invoices/{number}` Scope `invoices:read`. One invoice with its line items. The number is text (`2041` or `INV-2026-000123`), never convert it to an integer. ```json { "...": "invoice fields as above", "items": [ { "amount": 4.5, "currency": { "id": 1, "code": "USD", "name": "US Dollar", "symbol": "$" }, "description": "std-2 hourly" } ] } ``` ## Migrating from earlier versions - The base URL is `https://api.ariaservice.net/api/v1`. - `POST /servers` now requires an `Idempotency-Key` header and answers `202`; create and action answers are small fixed objects, not the full server. - Deleting a firewall rule uses the rule's `id` (`DELETE /firewalls/{id}/rules/{rule_id}`), not its position in the list. - A firewall is created empty; add rules with `POST /firewalls/{id}/rules`. - Creating an SSH key requires `datacenter_id`. - New: `GET /servers/{id}/actions`, `GET /invoices`, `GET /invoices/{number}`, scope `invoices:read`. --- title: "Regional VPS API" description: "The Arianet regional VPS API (e.g. iran-1) at api.ariaservice.net/vps/v1 - ordering, power, reinstall, resize, console and traffic." url: https://docs.ariaservice.net/en/regional-vps-api markdown: https://docs.ariaservice.net/en/regional-vps-api.md language: en --- # Regional VPS API Regional VPS servers (such as region `iran-1`) have their own API: ordering servers, power, reinstalling, resizing, resetting the root password, a browser console and traffic. The [`arianet vps regional`](https://docs.ariaservice.net/en/cli#product-commands) CLI commands are built on it. - **Base URL:** `https://api.ariaservice.net/vps/v1` - **Format:** JSON over HTTPS - **Authentication:** a personal API token sent as a Bearer token ([Authentication](https://docs.ariaservice.net/en/authentication)) - **OpenAPI 3.1:** [`https://api.ariaservice.net/vps/v1/openapi.json`](https://api.ariaservice.net/vps/v1/openapi.json), browsable in the [interactive reference](https://docs.ariaservice.net/en/regional-vps-api-reference) > **Which API?** VPS servers ordered through `/api/v1/servers` (the `arianet vps` commands) are described in the [VPS API](https://docs.ariaservice.net/en/api-endpoints). This page covers the regional VPS servers, which the panel lists next to the others. Both APIs accept the same token. ## Quick start 1. In the panel, at [cloud.ariaservice.net/users/api-tokens](https://cloud.ariaservice.net/users/api-tokens), create a token with the scopes `vps:servers:read` and `vps:servers:write`. 2. Call the API: ```bash export ARIANET_TOKEN="paste-your-token-here" BASE=https://api.ariaservice.net/vps/v1 AUTH="Authorization: Bearer $ARIANET_TOKEN" curl -s $BASE/datacenters -H "$AUTH" curl -s "$BASE/plans?datacenter=thr-1" -H "$AUTH" curl -s "$BASE/images?datacenter=thr-1" -H "$AUTH" curl -s -X POST $BASE/servers -H "$AUTH" -H "Content-Type: application/json" \ -d '{"datacenter":"thr-1","plan_id":4,"image":"ubuntu-24.04","hostname":"web-1","billing_mode":"hourly"}' ``` An order answers with the server and an `action`. Without a `password` a root password is generated and returned **only once**, in that answer. Follow the operation with `GET /actions/{id}` until `state` is `success` or `error`. ## Authentication and scopes | Scope | Allows | |---|---| | `vps:servers:read` | datacenters, plans, images, servers, traffic and operations | | `vps:servers:write` | every change: ordering, deleting, power, reinstalling, resizing, passwords and the console | A token without any scope is unrestricted. For a team member the account's IAM policies on VPS servers apply too. ## Regions The `Arianet-Region` header picks the region; without it the request goes to the default region (today `iran-1`). An unknown region answers `404 region_not_found`. Requests to this region travel over the secure link between regions, so event streams (`text/event-stream`) are not available there and answer `501 streaming_unsupported`; follow operations with `GET /actions/{id}`. ## Resources | Method and path | Purpose | |---|---| | `GET /datacenters`, `GET /plans`, `GET /images` | the region's catalog | | `GET /servers`, `POST /servers` | list and order servers | | `GET /servers/{id}`, `DELETE /servers/{id}` | details and deletion (what it cost so far is settled) | | `POST /servers/{id}/actions/{op}` | `start`, `stop` (graceful), `restart`, `kill` (hard power-off) | | `POST /servers/{id}/reinstall` | reinstall from an image (`{"image":"..."}`); the disk is wiped | | `POST /servers/{id}/resize` | move to another plan (`{"plan_id":5}`); disks only grow | | `POST /servers/{id}/reset-password` | set the root password | | `POST /servers/{id}/console` | a one-time browser console URL | | `GET /servers/{id}/traffic` | traffic and the period's quota (`from`, `to`, `granularity`) | | `PUT /servers/{id}/traffic-settings` | turn overage billing on or off (`{"overage_billing": true}`); off means overage is never billed and the network is cut once the period's quota is used up, until the next period. Team members need the `vps:manage` IAM permission | | `GET /servers/{id}/actions`, `GET /actions`, `GET /actions/{id}` | asynchronous operations | ## Errors Errors are JSON, `{"error": "...", "code": "..."}`. | HTTP | `code` | |---|---| | 400 | `invalid_input`, `invalid_region` | | 401 | `unauthorized` | | 402 | insufficient balance | | 403 | `forbidden`, `insufficient_scope` | | 404 | `not_found`, `region_not_found` | | 409 | the server's state does not allow it now | | 429 | `rate_limit_exceeded` | | 501 | `streaming_unsupported` | | 503 | `vps_unavailable`, `region_unavailable` | | 504 | `gateway_timeout`: the region did not answer in time; the request may still have been applied, check before retrying | --- title: "Hosting API" description: "The Arianet shared hosting API at api.ariaservice.net/hosting/v1 - ordering and managing accounts, DNS, email, databases, SSH, regions and errors." url: https://docs.ariaservice.net/en/hosting-api markdown: https://docs.ariaservice.net/en/hosting-api.md language: en --- # Hosting API The hosting API manages Arianet **shared hosting** (cPanel and DirectAdmin): ordering accounts, renewing and changing plans, DNS records, mailboxes, databases and their users, SSH keys, PHP, Redis and traffic. The [`arianet hosting`](https://docs.ariaservice.net/en/cli#product-commands) CLI commands are built on it. Reseller hosting is managed through the same API ([reseller hosting](#reseller)). - **Base URL:** `https://api.ariaservice.net/hosting/v1` - **Format:** JSON over HTTPS - **Authentication:** a personal API token sent as a Bearer token ([Authentication](https://docs.ariaservice.net/en/authentication)) - **OpenAPI 3.1:** [`https://api.ariaservice.net/hosting/v1/openapi.json`](https://api.ariaservice.net/hosting/v1/openapi.json), browsable in the [interactive reference](https://docs.ariaservice.net/en/hosting-api-reference) ## Quick start 1. In the panel, at [cloud.ariaservice.net/users/api-tokens](https://cloud.ariaservice.net/users/api-tokens), create a token with the scopes `hosting:accounts:read` and `hosting:accounts:write`. 2. Call the API: ```bash export ARIANET_TOKEN="paste-your-token-here" BASE=https://api.ariaservice.net/hosting/v1 AUTH="Authorization: Bearer $ARIANET_TOKEN" curl -s $BASE/datacenters -H "$AUTH" curl -s "$BASE/plans?kind=shared" -H "$AUTH" curl -s -X POST $BASE/accounts -H "$AUTH" -H "Content-Type: application/json" \ -d '{"datacenter":"thr","plan_id":3,"term":"monthly","domain":"example.com","password":"S3cret-pass"}' ``` An order answers with the account and an `action`; creating the account is asynchronous, follow it with `GET /actions/{id}` until `state` is `success` or `error`. The price is charged to the account's wallet. ## Authentication and scopes ```text Authorization: Bearer ``` | Scope | Allows | |---|---| | `hosting:accounts:read` | reading accounts, usage, DNS, mailboxes and databases | | `hosting:accounts:write` | every change: ordering, renewing, changing plans, deleting, one-time panel logins, DNS, email, databases, SSH, PHP, Redis and traffic | A token without any scope is unrestricted. A token never reaches further than its owner: for a team member the account's IAM policies apply too (a reseller plan, for example, also needs `hosting:reseller:manage`). ## Regions Hosting runs as a separate install per region. The `Arianet-Region` header picks one; without it the request goes to the default region: ```bash curl -s $BASE/accounts -H "$AUTH" -H "Arianet-Region: iran-1" ``` An account is only visible in the region it was created in. An unknown region answers `404 region_not_found`. ## Resources | Method and path | Purpose | |---|---| | `GET /datacenters` | the region's datacenters | | `GET /plans` | plans for sale (`datacenter`, `kind=shared\|reseller`) | | `GET /accounts`, `POST /accounts` | list and order accounts | | `GET /accounts/{id}`, `PATCH /accounts/{id}`, `DELETE /accounts/{id}` | details, auto-renew (`auto_renew`), termination | | `POST /accounts/{id}/actions/{op}` | `change_plan` (`{"plan_id":4}`), `renew`, `reset` (`{"password":"..."}`) | | `POST /accounts/{id}/password` | change the panel, FTP and SSH password | | `POST /accounts/{id}/login` | a one-time login link into the control panel | | `GET /accounts/{id}/usage`, `/nameservers`, `/traffic`, `/alerts` | usage, name servers, traffic, alerts | | `/accounts/{id}/dns-records` | DNS records (`GET`, `POST`, `PUT /{record}`, `DELETE /{record}`) | | `/accounts/{id}/email-accounts` | mailboxes | | `/accounts/{id}/databases`, `/database-users` | databases and their users | | `/accounts/{id}/ssh-keys`, `/shell` | SSH keys and shell access | | `/accounts/{id}/php`, `/redis`, `/traffic/settings` | PHP, Redis, overage billing | | `GET /actions`, `GET /actions/{id}` | asynchronous operations | Request and response bodies of every endpoint are in the [interactive reference](https://docs.ariaservice.net/en/hosting-api-reference). ## Reseller hosting {#reseller} A reseller account (`kind=reseller`) can create and manage accounts for its own customers, on the packages it defined in its control panel. All these paths are under `/accounts/{id}/reseller`, where `{id}` is the reseller account; a customer account is addressed by its `username`. | Method and path | Use | |---|---| | `GET /accounts/{id}/reseller/usage` | accounts, disk and bandwidth used against the plan's totals, and whether overselling is allowed | | `GET /accounts/{id}/reseller/packages` | the packages defined and how many accounts run each | | `GET /accounts/{id}/reseller/accounts`, `POST /accounts/{id}/reseller/accounts` | list customer accounts; create one on a package, within the plan's limits | | `DELETE /accounts/{id}/reseller/accounts/{username}` | delete a customer account and its data | | `POST /accounts/{id}/reseller/accounts/{username}/package` | move to another package | | `POST /accounts/{id}/reseller/accounts/{username}/password` | set the control panel, FTP and SSH password | | `POST /accounts/{id}/reseller/accounts/{username}/login` | one-time login link into the customer's control panel | | `POST /accounts/{id}/reseller/accounts/{username}/suspend`, `/unsuspend` | suspend and lift the suspension | | `POST /accounts/{id}/reseller/accounts/{username}/reset` | wipe back to a fresh account (same username, domain and package; files, mail, databases and DNS are deleted) | For team members, these paths need the `hosting:reseller:manage` IAM permission on top of the token's scope. ## Errors Errors are JSON, `{"error": "...", "code": "..."}`; branch on `code`, not on the message. | HTTP | `code` | |---|---| | 400 | `invalid_input`, `invalid_region` | | 401 | `unauthorized` | | 402 | insufficient balance | | 403 | `forbidden`, `insufficient_scope` (the token has no hosting scope) | | 404 | `not_found`, `region_not_found` | | 409 | the account's state does not allow it now | | 429 | `rate_limit_exceeded` (with `Retry-After`) | | 503 | `hosting_unavailable`, `region_unavailable` (with `Retry-After` where known) | | 504 | `gateway_timeout`: the region did not answer in time; the request may still have been applied, check before retrying | Every answer carries `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset`. --- title: "Dedicated servers API" description: "The Arianet dedicated (baremetal) servers API at api.ariaservice.net/baremetal/v1 - catalog, quotes, orders, renewals, credentials and OS installation." url: https://docs.ariaservice.net/en/baremetal-api markdown: https://docs.ariaservice.net/en/baremetal-api.md language: en --- # Dedicated servers API The dedicated servers API covers the server catalog, pricing a configuration, ordering, following delivery, monthly renewals, revealing login details and installing an operating system. The [`arianet baremetal`](https://docs.ariaservice.net/en/cli#product-commands) CLI commands are built on it. - **Base URL:** `https://api.ariaservice.net/baremetal/v1` - **Format:** JSON over HTTPS - **Authentication:** a personal API token sent as a Bearer token ([Authentication](https://docs.ariaservice.net/en/authentication)) - **OpenAPI 3.1:** [`https://api.ariaservice.net/baremetal/v1/openapi.json`](https://api.ariaservice.net/baremetal/v1/openapi.json), browsable in the [interactive reference](https://docs.ariaservice.net/en/baremetal-api-reference) ## Quick start 1. In the panel, at [cloud.ariaservice.net/users/api-tokens](https://cloud.ariaservice.net/users/api-tokens), create a token with the scopes `baremetal:servers:read` and `baremetal:servers:write`. 2. Read the catalog, price a configuration and order it: ```bash export ARIANET_TOKEN="paste-your-token-here" BASE=https://api.ariaservice.net/baremetal/v1 AUTH="Authorization: Bearer $ARIANET_TOKEN" curl -s "$BASE/plans?range=rise" -H "$AUTH" curl -s "$BASE/plans/eco/24rise01/options" -H "$AUTH" curl -s $BASE/rules -H "$AUTH" # the rules version the order must accept curl -s -X POST $BASE/quote -H "$AUTH" -H "Content-Type: application/json" \ -d '{"catalog":"eco","plan_code":"24rise01","datacenter":"fra","memory":"ram-32g","storage":"softraid-2x512nvme","bandwidth":"1gbps"}' curl -s -X POST $BASE/orders -H "$AUTH" -H "Content-Type: application/json" \ -d '{"catalog":"eco","plan_code":"24rise01","datacenter":"fra","memory":"ram-32g","storage":"softraid-2x512nvme","bandwidth":"1gbps","rules_version":"2026-10","accept_rules":true}' ``` The order amount is held on the wallet and delivery goes through stages shown by `GET /orders/{id}`. Until procurement starts an order can be cancelled and the full amount is released. ## Authentication and scopes | Scope | Allows | |---|---| | `baremetal:servers:read` | catalog, quotes, orders, servers and renewals | | `baremetal:servers:write` | ordering and cancelling, paying renewals, revealing login details and installing an OS | A token without any scope is unrestricted. Dedicated servers have a single install: an `Arianet-Region` header answers `404 region_not_found`. ## Resources | Method and path | Purpose | |---|---| | `GET /suppliers`, `GET /ranges`, `GET /plans` | catalog | | `GET /plans/{catalog}/{plan}/options` | datacenters, memory, storage and bandwidth with prices | | `GET /rules` | the rules an order must accept | | `POST /quote` | price a configuration (nothing is held) | | `GET /orders`, `POST /orders`, `GET /orders/{id}` | orders and their stages | | `POST /orders/{id}/cancel` | cancel before procurement started | | `GET /servers`, `GET /servers/{id}` | delivered servers | | `POST /servers/{id}/credentials/reveal` | login details (shown **only once**) | | `GET /servers/{id}/renewals`, `POST /servers/{id}/renew` | renewals and paying the next month | | `GET /servers/{id}/os-templates`, `POST /servers/{id}/reinstall`, `GET /servers/{id}/reinstall` | OS installation (the disks are wiped) and its state | ## Errors Errors are JSON, `{"error": "...", "code": "..."}`. | HTTP | `code` | |---|---| | 400 | `invalid_input` | | 401 | `unauthorized` | | 402 | insufficient balance | | 403 | `forbidden`, `insufficient_scope` | | 404 | `not_found`, `region_not_found` | | 409 | the order's or server's state does not allow it now | | 429 | `rate_limit_exceeded` | | 503 | `baremetal_unavailable` | --- title: "SMS API" description: "The Arianet SMS API at api.ariaservice.net/sms/v1 - sending SMS, delivery reports, lines, templates, blocked numbers and webhooks." url: https://docs.ariaservice.net/en/sms/api markdown: https://docs.ariaservice.net/en/sms/api.md language: en --- # SMS API The SMS API sends messages from your sender lines, reads what was sent and received, and manages templates, blocked numbers and the webhook. The [`arianet sms`](https://docs.ariaservice.net/en/cli#product-commands) CLI commands are built on it. The wallet, top-ups, tickets and team members belong to the Arianet account and are not part of this API. - **Base URL:** `https://api.ariaservice.net/sms/v1` - **Format:** JSON over HTTPS - **Authentication:** a personal API token sent as a Bearer token ([Authentication](https://docs.ariaservice.net/en/authentication)) - **OpenAPI 3.0:** [`https://api.ariaservice.net/sms/v1/openapi.json`](https://api.ariaservice.net/sms/v1/openapi.json), browsable in the [interactive reference](https://docs.ariaservice.net/en/sms-api-reference) > **The previous SMS API** The previous `sms-api.ariaservice.net/api/v1` addresses and their keys keep working during the migration window; their answers carry `Deprecation: true` and a link to this page. Use this API and your Arianet account token for new work. ## Quick start 1. In the panel, at [cloud.ariaservice.net/users/api-tokens](https://cloud.ariaservice.net/users/api-tokens), create a token with the scopes you need (table below). 2. List your sender lines and send a message from one of them (`from` is the line's number or its `id`): ```bash export ARIANET_TOKEN="paste-your-token-here" BASE=https://api.ariaservice.net/sms/v1 AUTH="Authorization: Bearer $ARIANET_TOKEN" curl -s $BASE/lines -H "$AUTH" curl -s -X POST $BASE/messages -H "$AUTH" -H "Content-Type: application/json" \ -d '{"from":"300074360","recipients":["09121234567","09351234567"],"body":"Your code is 1234","client_reference":"order-981"}' ``` The answer is `202 Accepted`: ```json {"batch_id":"01JC8Z...","status":"processing","total_recipients":2,"total_cost_rial":3000,"filtered_blocked_count":0} ``` A send creates a batch and charges the account's wallet; follow it with `GET /batches/{id}` and `GET /messages?batch_id=...`. Numbers on your blocked list are skipped (`filtered_blocked_count`). The price per message, and whether it is charged per message or per SMS part, is in `GET /prices`. ## Sending `POST /messages` takes: | Field | Type | | |---|---|---| | `recipients` | array of strings, 1-100 | mobile numbers (required) | | `from` | digit string | the sender line's `number` or `id` from `GET /lines` (required) | | `body` | string, at most 2000 characters | the text; required unless `template_id` is given | | `template_id` | integer | send one of your templates instead of `body` | | `scheduled_at` | ISO 8601 time, in the future | send later instead of now | | `client_reference` | string | your reference for this send; when absent the `Idempotency-Key` header is used. A send repeated with the same reference is not sent twice | With `scheduled_at` nothing is sent or charged yet: the answer is `{"scheduled_id":12,"status":"pending","scheduled_at":"..."}`, the send is listed in `GET /scheduled` and can be cancelled with `DELETE /scheduled/{id}` while it is pending. ## Lists and pages Every list takes `page` and `per_page` (at most 200) and answers: ```json {"data":[...],"meta":{"total":134,"current_page":1,"per_page":50}} ``` `GET /messages` also filters by `batch_id`, `status` and `to`; `GET /blocked-recipients` by `phone`. ## Authentication and scopes | Scope | Allows | |---|---| | `sms:messages:read` | sent and received messages, batches, scheduled sends, prices and the report | | `sms:messages:write` | sending and cancelling scheduled sends, blocked numbers and the webhook | | `sms:lines:read` | sender lines | | `sms:templates:read` | templates | | `sms:templates:write` | creating, changing and deleting templates | A token without any scope is unrestricted; asking for a dedicated line (`POST /lines`) needs such a token. SMS runs in region `iran-1` only and needs no `Arianet-Region` header. ## Resources | Method and path | Purpose | |---|---| | `POST /messages` | send now or at `scheduled_at` (see [Sending](#sending)) | | `GET /messages`, `GET /messages/{id}` | sent messages and their delivery | | `GET /batches`, `GET /batches/{id}` | send batches | | `GET /scheduled`, `DELETE /scheduled/{id}` | scheduled sends; cancel a pending one | | `GET /inbound` | messages received on your lines | | `GET /lines`, `POST /lines` | sender lines; ask for a dedicated line (`number`, `note`) | | `GET /templates`, `POST /templates`, `GET`/`PUT`/`DELETE /templates/{id}` | templates (`name`, `body`) | | `GET /blocked-recipients`, `POST /blocked-recipients`, `DELETE /blocked-recipients/{id}` | blocked numbers; input `phone` and `note`, output `mobile` and `reason` | | `GET /webhook`, `PUT /webhook`, `POST /webhook/secret` | the webhook (`url`, `enabled`, `events`) and a new signing secret; see [Webhooks](#webhooks) | | `GET /reports/summary` | sent, delivered, failed and spend, with a daily breakdown (`from`, `to`) | | `GET /prices` | price per message and its volume tiers | The request and answer of every endpoint are in the [interactive reference](https://docs.ariaservice.net/en/sms-api-reference). ## Statuses | Object | `status` values | |---|---| | Message (`GET /messages`) | `queued`, `sent`, `delivered`, `failed`, `undelivered`, `rejected`, `expired` | | Batch (`GET /batches`) | `pending`, `processing`, `partial` (some failed), `completed`, `failed` | | Scheduled (`GET /scheduled`) | `scheduled`, `processing`, `sent`, `failed`, `cancelled` | The `status` filter on `GET /messages` and `GET /batches` takes these values. ## Message detail and timeline {#timeline} Every message in `GET /messages` also has: | Field | Meaning | |---|---| | `operator` | Recipient operator from the number prefix: `mci`, `mtn`, `rightel`, `other` (best effort for ported numbers) | | `encoding` | `unicode` or `gsm` | | `queued_at` | When the message was queued | | `provider.name` | Sending gateway, e.g. `magfa` | | `provider.message_id` | The operator's (Magfa) tracking id | | `provider.status_code` | Last operator status code: `0` no status yet, `8` reached the operator, `1` delivered to the handset, `2` not delivered to the handset, `16` never reached the operator, `-1` expired | | `provider.error_code` | Magfa's error code when it refused the message | | `delivery_checks` | Number of delivery-status checks | | `last_checked_at` | Time of the last check | `GET /messages/{id}` also returns `timeline`: the steps in time order, each with `type`, `at`, `status_code` and `error_code`. | `type` | Meaning | |---|---| | `queued` | Queued | | `sent_to_provider` | Accepted by Magfa, tracking id assigned | | `provider_refused` | Refused by Magfa (refunded) | | `status_checked` | Status check with no final result yet | | `delivered_to_operator` | Reached the operator's network, waiting for the handset | | `delivered` | Delivered to the handset | | `not_delivered` | Not delivered to the handset | | `not_sent_to_operator` | Never reached the operator's network | | `expired` | No delivery report within 24 hours | | `rejected` | Rejected | Every batch in `GET /batches` also has `channel` (`panel`, `api` or `system`), `sender_ip` (masked, like `85.133.133.x`) and `completed_at`. ## Webhooks {#webhooks} Set the URL, whether it is on, and the events you want with `PUT /webhook`: ```bash curl -s -X PUT $BASE/webhook -H "$AUTH" -H "Content-Type: application/json" \ -d '{"url":"https://example.com/sms-hook","enabled":true,"events":["message.delivered","message.failed","inbound.received"]}' ``` | Event | When | |---|---| | `batch.completed` | a send finished; always sent while the webhook is on | | `message.delivered` | a message reached the recipient | | `message.failed` | a message will never be delivered (`failed`, `undelivered`, `rejected`, `expired`) | | `inbound.received` | an SMS arrived on one of your dedicated lines | The last three are sent only when listed in `events`; they are off by default. Each event is a `POST` of `{"event","occurred_at","data"}`, where `data` has the same shape the API returns for that object: ```json {"event":"message.delivered","occurred_at":"2026-11-12T17:20:00+00:00","data":{"id":"01m78c...","batch_id":"01m78c...","to":"09121234567","from":"300074360","body":"Your code is 1234","parts":1,"status":"delivered","cost_rial":1750,"error":null,"sent_at":"...","delivered_at":"...","created_at":"..."}} ``` The `X-Signature` header is the HMAC-SHA256 of the raw body keyed with your webhook signing secret; verify it. A non-2xx answer is retried up to 5 times with growing delays. ## Errors Errors are JSON: `{"code": "...", "message": "..."}`. | HTTP | Meaning | |---|---| | 401 | no token, or an invalid one | | 402 | `insufficient_balance` | | 403 | `insufficient_scope`, `forbidden`, `identity_needed`, `account_suspended`, or `sender_line_not_usable` (the line is not yours to send from) | | 404 | `not_found` (for example a template of another account) | | 422 | `validation_failed`, `all_recipients_blocked`, `already_blocked`, `not_cancellable` | | 429 | `rate_limit_exceeded` / `rate_limited` | | 503 | `sms_unavailable`, `region_unavailable` | | 504 | `gateway_timeout`: no answer in time; the send may still have happened, check `GET /messages` before retrying (that is what `client_reference` is for) | --- title: "Arianet CLI" description: "Install and use the arianet command-line tool to manage VPS, Arianet Cloud resources, SSH keys, firewalls and billing." url: https://docs.ariaservice.net/en/cli markdown: https://docs.ariaservice.net/en/cli.md language: en --- # Arianet CLI The **Arianet CLI** (`arianet`) is the official command-line client for the Arianet platform. With one API token it manages: - your **VPS** (`arianet vps ...`) through the [VPS API](https://docs.ariaservice.net/en/api-endpoints), - **Arianet Cloud** servers, volumes, private networks, firewalls, floating IPs, load balancers and images (`arianet cloud ...`) through the [Cloud API](https://docs.ariaservice.net/en/cloud-api), - SSH keys, firewalls, balance and invoices. It is a single static binary for macOS, Linux and Windows. Source and releases: [github.com/ariaservice/arianet-cli](https://github.com/ariaservice/arianet-cli). Product page: [ariaservice.net/developers/cli](https://www.ariaservice.net/developers/cli). To describe your infrastructure as code instead, see the [Terraform provider](https://docs.ariaservice.net/en/terraform). ## Install and get started in three steps ### 1. Install Run the command for your operating system in a terminal: - macOS / Linux: `curl -fsSL https://raw.githubusercontent.com/ariaservice/arianet-cli/main/scripts/install.sh | sh` - Windows: `irm https://raw.githubusercontent.com/ariaservice/arianet-cli/main/scripts/install.ps1 | iex` Then open a new terminal and run `arianet version` to check that it is installed. ### 2. Connect your account Create a token on the [API tokens](https://cloud.ariaservice.net/users/api-tokens) page of the panel and give it to the CLI: ```bash arianet configure ``` Paste the token (it is not shown on screen). The scopes each command needs are listed under [Token scopes](#token-scopes). ### 3. Run your first command ```bash arianet vps list ``` This lists your VPS. For Arianet Cloud servers: `arianet cloud servers list`. To order a server, see [VPS](#vps) and [Arianet Cloud](#arianet-cloud).
Other ways to install (Homebrew, apt, rpm, manual download, verifying signatures) **macOS and Linux (Homebrew)** ```bash brew trust ariaservice/arianet # recent Homebrew versions require trusting third-party taps brew install ariaservice/arianet/arianet ``` The formula ([ariaservice/homebrew-arianet](https://github.com/ariaservice/homebrew-arianet)) only downloads the release archive from the CLI repository and checks its SHA-256. **Ubuntu / Debian (apt)** ```bash sudo install -d -m 0755 /etc/apt/keyrings curl -fsSL https://ariaservice.github.io/arianet-cli/arianet-archive-keyring.gpg \ | sudo tee /etc/apt/keyrings/arianet.gpg >/dev/null echo "deb [signed-by=/etc/apt/keyrings/arianet.gpg] https://ariaservice.github.io/arianet-cli stable main" \ | sudo tee /etc/apt/sources.list.d/arianet.list sudo apt update && sudo apt install arianet ``` The repository is signed, and the key is trusted for this repository only (`signed-by`). Its fingerprint is `305A 2F52 0920 153A FC89 8F4A C420 B09C 99E5 515B`. The package has no install or removal scripts. **About the macOS and Linux install script** The script downloads the release archive, verifies its SHA-256 against `checksums.txt` (and the signature too if `cosign` is installed), and copies the binary into `~/.local/bin` (or `/usr/local/bin` when writable). **Windows (manual)** Instead of the PowerShell installer above, download `arianet__windows_amd64.zip` from the [releases page](https://github.com/ariaservice/arianet-cli/releases), extract `arianet.exe`, and add its folder to your `PATH`. Then open a new terminal and run: ```powershell arianet version ``` **Manual download (any platform)** Download the archive for your platform plus `checksums.txt` from the [releases page](https://github.com/ariaservice/arianet-cli/releases). Archives are named `arianet___.tar.gz` (`darwin` or `linux`, `amd64` or `arm64`); `.deb` and `.rpm` packages are published too. ```bash sha256sum --check --ignore-missing checksums.txt # macOS: shasum -a 256 -c --ignore-missing checksums.txt tar -xzf arianet___.tar.gz sudo install -m 0755 arianet /usr/local/bin/arianet arianet version ``` `checksums.txt` carries a keyless Sigstore signature (`checksums.txt.sigstore.json`) you can check with `cosign verify-blob`; every archive also ships an SBOM. To build from source: `git clone https://github.com/ariaservice/arianet-cli.git && cd arianet-cli && go build -trimpath -o arianet ./cmd/arianet`.
The CLI only talks to the API URL you configure (default `https://api.ariaservice.net`) and, at most once a day, to GitHub to look for a newer release (see [Update notice](#update-notice)). It sends no telemetry. ## Upgrading From **v0.5.0** on, the CLI upgrades itself: ```bash arianet upgrade # upgrade to the latest release (asks first) arianet upgrade --check # only report whether a newer release exists arianet upgrade -y # no confirmation prompt arianet upgrade --version v0.5.0 # install a specific release arianet update # same as: arianet upgrade ``` `arianet upgrade` works out how the CLI was installed and upgrades it the same way, on macOS, Linux and Windows: | Installed with | What `arianet upgrade` does | |---|---| | Homebrew | Runs `brew upgrade ariaservice/arianet/arianet` and shows its output. | | apt / dpkg | Runs `sudo apt-get update && sudo apt-get install --only-upgrade arianet` (when it cannot ask you, it prints the command instead). | | Install script, manual download or Windows zip | Downloads the release archive for your OS and architecture, verifies it against the release checksums, and replaces the binary in place. If anything fails the old binary is kept. | If you already have the latest release it says so and changes nothing. On v0.4.x and earlier, upgrade the way you installed (`brew upgrade ariaservice/arianet/arianet`, `sudo apt update && sudo apt install --only-upgrade arianet`, or re-run the install script). ### Update notice When a newer release is published, `arianet` prints a short notice to stderr after a command, with the command that upgrades your installation: ```text A new release of arianet is available: 0.4.0 → 0.5.0 To upgrade, run: brew upgrade ariaservice/arianet/arianet ``` The CLI looks up the latest release on GitHub at most once a day, in the background. The lookup never delays or fails a command. The notice is not shown with `-o json`, when stderr is not a terminal, when the `CI` environment variable is set, or when `ARIANET_NO_UPDATE_NOTIFIER` is set to any value: ```bash export ARIANET_NO_UPDATE_NOTIFIER=1 ``` ## Configuration The configuration is a `config.yaml` file in your user config directory (`~/.config/arianet/` on Linux, `~/Library/Application Support/arianet/` on macOS), mode `0600`. `arianet configure show` prints its exact location and the active values. ```bash arianet configure # interactive setup (token typed without echo) printf '%s' "$TOKEN" | arianet configure --token-stdin arianet configure --token # avoid on shared machines: visible in the process list and shell history arianet configure --output json # default output format arianet configure --api-url # API base URL arianet configure show # show the current configuration ``` Precedence, highest first: command-line flag, environment variable, config file. Whenever the API URL is anything other than the default, every command prints a warning on stderr naming the host your token is sent to. | Environment variable | Meaning | |-------------------------------|-----------------------------------------------------------| | `ARIANET_TOKEN` | API token | | `ARIANET_API_URL` | API base URL (default `https://api.ariaservice.net`) | | `ARIANET_NO_UPDATE_NOTIFIER` | Set to any value to turn off the new-release notice | ### Global flags | Flag | Meaning | |-----------------|-------------------------------------------------| | `-o, --output` | `table` (default) or `json` | | `--token` | API token for this command only | | `--api-url` | API base URL for this command only | Every command accepts `--help`, which lists its flags with examples. Shell completion scripts: `arianet completion bash|zsh|fish|powershell`. ## Token scopes A token can be limited to the scopes it needs. A command fails with `INSUFFICIENT_SCOPE` if the token lacks the matching scope. | Commands | Scope | |------------------------------------------------|-----------------------------| | `region list` | `regions:read` | | `os list` | `os:read` | | `plan list`, `plan get` | `plans:read` | | `vps list/get/status/actions` | `servers:read` | | `vps create/delete/restart/power-*/reinstall/rename/toggle-protection` | `servers:write` | | `balance`, `balance transactions` | `balance:read` | | `balance invoices` | `invoices:read` | | `auth tokens list`, `auth tokens revoke` | `tokens:read`, `tokens:write` (`auth whoami` and `auth logout` need none) | | `ssh list/get`, `ssh add/update/delete` | `ssh-keys:read`, `ssh-keys:write` | | `firewall list/get`, other `firewall` commands | `firewalls:read`, `firewalls:write` | | `cloud ...` reads / changes | `cloud:servers:read` / `cloud:servers:write` | | `cloud pricing` | none (public) | | `hosting ...` reads / changes | `hosting:accounts:read` / `hosting:accounts:write` | | `vps regional ...` reads / changes | `vps:servers:read` / `vps:servers:write` | | `baremetal ...` reads / changes | `baremetal:servers:read` / `baremetal:servers:write` | | `sms send`, `scheduled cancel`, `blocked add/delete`, `webhook` / `sms messages`, `batches`, `scheduled list`, `inbound`, `prices`, `report` | `sms:messages:write` / `sms:messages:read` | | `sms lines list` (`sms lines request`: a token without scopes) | `sms:lines:read` | | `sms templates list` / other `sms templates` | `sms:templates:read` / `sms:templates:write` | A token can also be restricted to a list of source IP addresses; requests from elsewhere fail with `IP_NOT_ALLOWED`. ## VPS `arianet vps` manages virtual private servers. `server`, `servers` and `srv` are aliases, so older scripts that call `arianet server ...` keep working. IDs used by `--region`, `--plan`, `--os` and `--ssh-key` come from the matching `list` commands. ### Catalog ```bash arianet region list # orderable locations; the ID column is the --region value arianet plan list --region # plans in a region: vCPU, RAM and disk in GB, price arianet plan get # plan details and pricing arianet os list --region # OS templates available in a region ``` ### List and inspect ```bash arianet vps list arianet vps list --status terminated arianet vps list --page 2 --limit 20 arianet vps get arianet vps status arianet vps actions --limit 50 ``` Without `--status`, `list` shows active and suspended VPS. Other statuses are `creating`, `pending`, `failed`, `terminated`, `powering_on`, `powering_off`, `restarting` and `reinstalling_os`. `vps actions` shows the operations performed on a VPS (create, restart, reinstall, ...), newest first, with their outcome. ### Create ```bash arianet vps create # interactive wizard arianet vps create --plan 5 --region 1 --os 3 --hostname web-01 arianet vps create --plan 5 --region 1 --os 3 --ssh-key 2 arianet vps create --plan 5 --region 1 --os 3 --password '' arianet vps create --plan 5 --region 1 --os 3 --no-wait --yes --output json ``` | Flag | Meaning | |---------------------|----------------------------------------------------------------------| | `--plan` | Plan ID | | `--region` | Region (datacenter) ID | | `--os` | OS template ID | | `--hostname` | Hostname | | `--ssh-key` | Log in with this stored SSH key instead of a password | | `--password` | Root password you choose | | `--currency` | Currency ID to pay with (default: your default wallet) | | `--idempotency-key` | Reuse a key to retry an order safely (see below) | | `--no-wait` | Return as soon as the order is accepted | | `--timeout` | Longest wait for the VPS to become active (default `15m`) | | `-y, --yes` | Skip the confirmation prompt | - With neither `--ssh-key` nor `--password`, a strong random root password is generated and printed **once**. Save it; it cannot be shown again. - Without `--plan`, `--region` or `--os`, an interactive wizard asks for them. The wizard is refused with `--output json`; pass all three IDs in scripts. - By default the command waits until the VPS is active. **Safe retries.** Every order carries an idempotency key. If the network fails after the order was sent, running the same command with the same `--idempotency-key` returns the original result instead of buying a second VPS. The CLI prints the key when it cannot tell you the outcome. **Rate limit.** VPS creation is rate limited per token and per account. When the limit is hit the CLI reports how long to wait. ### Operate ```bash arianet vps restart [--wait] [--timeout 15m] [--yes] arianet vps power-on [--wait] arianet vps power-off [--wait] [--yes] arianet vps reinstall --os [--wait] [--yes] arianet vps delete [--wait] [--yes] arianet vps rename --name # 1-30 characters arianet vps toggle-protection [--enable | --disable] ``` Restart, power, reinstall and delete return as soon as the platform has accepted the operation. Add `--wait` to follow it to the end: progress goes to stderr, and the exit code is non-zero if the operation fails or the timeout passes. These commands are never retried automatically. `toggle-protection` with `--enable` or `--disable` sets the state explicitly, which is safe to repeat in scripts; without either flag the state is flipped. A protected VPS can be neither deleted nor reinstalled. ### SSH keys ```bash arianet ssh list [--page 2 --limit 20] arianet ssh get arianet ssh add --name laptop --key-file ~/.ssh/id_ed25519.pub --region arianet ssh add --name laptop --key "ssh-ed25519 AAAA..." --region arianet ssh update --name arianet ssh delete [--yes] ``` An SSH key belongs to one region, so `--region` is required when adding. Use the key when ordering with `--ssh-key `. `arianet cloud ssh-keys` is the same command group. ### Firewalls ```bash arianet firewall list arianet firewall get arianet firewall create --name web-fw --region [--description "..."] arianet firewall update [--name ] [--description "..."] arianet firewall delete [--yes] arianet firewall rule add --direction ingress --proto tcp --port 443 --remote-ip 0.0.0.0/0 arianet firewall rule add --direction ingress --proto tcp --port 22 --remote-ip 203.0.113.7/32 --description office arianet firewall rule add --direction ingress --proto icmp --remote-ip 0.0.0.0/0 arianet firewall rule remove [--yes] arianet firewall attach --server 42,43 arianet firewall detach --server 42 ``` - A new firewall has no rules. Add rules, then `attach` it to VPS. - `rule add` flags: `--direction ingress|egress` (default `ingress`), `--proto tcp|udp|icmp|esp|gre` (default `tcp`), `--port` (a port or range such as `8000-9000`, required for tcp and udp), `--remote-ip` (required; `0.0.0.0/0` allows everyone), `--description`. - The rule ID used by `rule remove` is the string in the **Rule ID** column of `firewall get`. - `attach` and `detach` accept up to 50 servers per call. These commands manage VPS firewalls. Arianet Cloud firewalls are managed with [`arianet cloud firewalls`](#cloud-firewalls). ## Arianet Cloud `arianet cloud` manages Arianet Cloud resources through the [Cloud API](https://docs.ariaservice.net/en/cloud-api) at `/cloud/v1` (default `https://api.ariaservice.net/cloud/v1`) with the same token. The token needs `cloud:servers:read` for reads and `cloud:servers:write` for changes. Common behaviour: - **Lists** accept `--label-selector` (comma-separated terms that must all hold: `key=value`, `key!=value`, `key`, `!key`, e.g. `"env=prod,tier!=db"`), `--project-id`, and `--page` / `--per-page` (at most 100). Without `--page`, every page is fetched. - **Creates** accept `--labels key=value` (repeatable or comma separated) and `--project-id`. - **`update`** commands change name, labels (`--labels`, `--clear-labels`), delete protection (`--protection-delete=true|false`) and project (`--project-id`). - **Operations** run asynchronously and return an action; the CLI prints its ID. `--wait` follows it to the end (progress on stderr, `--timeout`, default `15m`) and exits non-zero if it fails or times out. - `get` also answers to `describe` and `show`; `list` to `ls`; `delete` to `rm` (deletes ask for confirmation unless `-y`). - Reads that hit the rate limit are retried after `Retry-After` (when it is at most 30 seconds). Changes are never retried automatically. ### Catalog and account ```bash arianet cloud datacenters # locations (the --datacenter codes); alias: locations arianet cloud plans [--datacenter ] # server types (the --plan IDs) arianet cloud images list [--type system|app|snapshot|backup] [--datacenter ] arianet cloud images get # e.g. ubuntu-24.04 arianet cloud pricing [--datacenter ] # public price list, no token needed arianet cloud pricing --account # your account's own price rows (needs a token) arianet cloud limits [--datacenter ] # quotas and usage per datacenter ``` `cloud pricing` reads the public price list (`/cloud/v1/public/pricing`), VAT excluded, and sends no token, so it works before `arianet configure`. ### Cloud servers ```bash arianet cloud servers list [--label-selector env=prod] [--page 1 --per-page 50] arianet cloud servers get arianet cloud servers create --name web-1 --datacenter ovh --plan 3 --image ubuntu-24.04 --ssh-key-id 5 --wait arianet cloud servers create --name web --count 3 --datacenter ovh --plan 3 --image ubuntu-24.04 \ --labels env=prod --firewall 2 --network 4 --no-ipv6 arianet cloud servers create --name db-1 --datacenter ovh --plan 5 --image debian-12 \ --user-data-file cloud-init.yaml --backups --project-id 2 -o json ``` | `create` flag | Meaning | |----------------------|---------| | `--name` | Server name (with `--count`: `name`, `name-2`, ...) | | `--datacenter` | Datacenter code (`arianet cloud datacenters`) | | `--plan` | Plan ID (`arianet cloud plans`) | | `--image` | Image (`arianet cloud images list`) | | `--ssh-key-id` | Saved SSH key ID (repeatable) | | `--ssh-key` | Public key to install (repeatable) | | `--count` | Create this many servers at once | | `--firewall` | Firewall ID to apply (repeatable) | | `--network` | Private network ID to attach (repeatable) | | `--volume` | Volume ID to attach (repeatable) | | `--no-ipv4`, `--no-ipv6` | No public IPv4 / IPv6 address | | `--backups` | Turn on daily backups | | `--user-data-file` | cloud-init user data file | | `--no-start` | Do not start the server after creating it | | `--labels`, `--project-id`, `--wait`, `--timeout` | As above | ```bash arianet cloud servers update [--name n] [--labels k=v | --clear-labels] [--protection-delete=true] [--protection-rebuild=true] arianet cloud servers delete [--reason price] [--note "..."] [--keep-backups] [--delete-snapshots] [--yes] [--wait] arianet cloud servers power-on|power-off|shutdown|reboot|reset [--wait] arianet cloud servers rebuild --image ubuntu-24.04 [--wait] # erases the disk arianet cloud servers change-type --plan [--wait] # aliases: resize, change-plan arianet cloud servers enable-rescue # prints the rescue password once arianet cloud servers disable-rescue arianet cloud servers reset-password # prints the new root password once arianet cloud servers change-ipv4 [--confirm-paid] # new public IPv4 arianet cloud servers attach-network --network [--subnet ] [--ip 10.0.1.5] arianet cloud servers detach-network --network arianet cloud servers enable-backup [--window-hour 3] # hour in UTC, 0-23 arianet cloud servers change-backup-window --window-hour 4 arianet cloud servers disable-backup arianet cloud servers create-backup [--wait] arianet cloud servers restore-backup --backup [--wait] # erases the disk arianet cloud servers create-image --name before-upgrade [--description "..."] [--wait] arianet cloud servers actions arianet cloud servers costs ``` - `power-off` cuts the power (hard stop); `shutdown` asks the OS to shut down (ACPI). `reboot` is graceful, `reset` is a hard reset. - `delete --reason` is one of `price`, `performance`, `ip_filtered`, `no_longer_needed`, `migrating`, `support`, `other` (`other` needs `--note`). `--keep-backups` keeps the finished backups as snapshots, billed per GB until you delete them. `--delete-snapshots` also deletes the server's unprotected snapshots; by default snapshots survive the server. - `costs` shows the server's current hourly and monthly rate per billed piece (plan, primary IPv4, floating and elastic IPs, attached volumes, backup add-on), the totals, and what its snapshots and kept backups would cost after a delete. - `change-ipv4` asks for `--confirm-paid` when the change has a fee. - A root or rescue password returned by `create`, `rebuild`, `enable-rescue`, `reset-password` or `restore-backup` is printed once. Save it. ### Volumes ```bash arianet cloud volumes list|get|update|delete ... arianet cloud volumes create --name data --size 50 --datacenter ovh arianet cloud volumes create --name data --size 50 --server 12 --filesystem ext4 --wait arianet cloud volumes attach --server [--wait] arianet cloud volumes detach arianet cloud volumes resize --size 100 [--wait] # grow only, size in GB ``` ### Private networks ```bash arianet cloud networks list|get|update|delete ... arianet cloud networks create --name backend --datacenter ovh --ip-range 10.0.0.0/16 [--subnet-ip-range 10.0.1.0/24] [--wait] arianet cloud networks subnets add --ip-range 10.0.2.0/24 arianet cloud networks subnets delete arianet cloud networks routes set --route 10.100.0.0/16=10.0.1.5 # destination=gateway, repeatable arianet cloud networks routes set --clear ``` ### Cloud firewalls ```bash arianet cloud firewalls list|get|update|delete ... arianet cloud firewalls create --name web \ --rule direction=in,protocol=tcp,port=443,source=0.0.0.0/0,source=::/0 \ --rule direction=in,protocol=tcp,port=22,source=203.0.113.4/32 --server 12 arianet cloud firewalls create --name web --rules-file rules.json arianet cloud firewalls rules set --rule direction=in,protocol=tcp,port=80,source=0.0.0.0/0 arianet cloud firewalls rules set --rules-file rules.json | --clear arianet cloud firewalls apply-to --server 12 --server 13 arianet cloud firewalls apply-to --label-selector "env=prod,tier!=db" --wait arianet cloud firewalls remove-from --label-selector env=prod arianet cloud firewalls set-servers --server 12,13 | --none ``` A rule is `direction=in|out,protocol=tcp|udp|icmp|esp|gre,port=,source=` (repeat `source=`, or use `destination=` for outgoing rules, plus an optional `description=`). `rules set` replaces every rule at once. A label-selector target follows the labels: servers that gain matching labels later get the firewall, servers that lose them lose it. ### Floating IPs ```bash arianet cloud floating-ips list|get|update|delete ... arianet cloud floating-ips create --type ipv4 --datacenter ovh --name vip arianet cloud floating-ips create --type ipv4 --server 12 --wait arianet cloud floating-ips assign --server [--wait] arianet cloud floating-ips unassign arianet cloud floating-ips dns-ptr --ptr web.example.com | --reset ``` ### Load balancers ```bash arianet cloud load-balancers types arianet cloud load-balancers list|get|update|delete ... arianet cloud load-balancers create --name web --datacenter ovh --type lb11 \ --service tcp:80 --service tcp:443 --target label_selector:role=web --wait arianet cloud load-balancers add-service --protocol http --listen-port 80 --health-protocol http --health-path /healthz arianet cloud load-balancers update-service --port 80 --protocol tcp --listen-port 80 --destination-port 8081 arianet cloud load-balancers delete-service --listen-port 443 arianet cloud load-balancers set-services --services-file services.json [--algorithm least_connections] arianet cloud load-balancers add-target --server 12 | --ip
| --label-selector role=web [--use-private-ip] arianet cloud load-balancers remove-target --target-id 17 arianet cloud load-balancers change-algorithm --algorithm round_robin|least_connections arianet cloud load-balancers change-type --type lb21 arianet cloud load-balancers attach-network --network 4 arianet cloud load-balancers detach-network arianet cloud load-balancers health ``` Services listen on `tcp`, `http` or `https` (TLS passthrough). Service flags include `--destination-port`, `--proxyprotocol`, `--sticky-sessions`, `--cookie-name` and the health check (`--health-protocol tcp|http`, `--health-port`, `--health-path`, `--health-domain`, `--health-status-code`, `--health-interval`, `--health-timeout`, `--health-retries`). `--no-public-interface` on `create` makes a private-only load balancer. ### Actions ```bash arianet cloud actions list [--resource-type server --resource-id 12] [--status running|success|error] [--since ] arianet cloud actions get arianet cloud actions wait [...] [--timeout 30m] ``` ## Hosting, regional VPS, dedicated servers and SMS {#product-commands} > **Since v0.6.0** These command groups are available from CLI **v0.6.0**. Update an older install with `arianet upgrade`. These groups call the [hosting](https://docs.ariaservice.net/en/hosting-api), [regional VPS](https://docs.ariaservice.net/en/regional-vps-api), [dedicated servers](https://docs.ariaservice.net/en/baremetal-api) and [SMS](https://docs.ariaservice.net/en/sms/api) APIs with the same token. Every command takes `--region ` to pick a region (default: the product's default region) and, with `-o json`, prints the API's answer as is. For any endpoint without a command, each group has `api [--data JSON]`. Commands that create something also take `--data` or `--file` for the whole JSON body. ### Hosting ```bash arianet hosting datacenters | plans [--datacenter ] [--kind shared|reseller] arianet hosting accounts list|get|usage|nameservers|traffic|actions arianet hosting accounts create --datacenter --plan-id --term monthly --domain example.com --password '...' arianet hosting accounts change-plan --plan-id | renew | password --password '...' | login | delete arianet hosting dns list|add|update|delete ... arianet hosting email list|add|update|delete ... arianet hosting databases list|create|delete|grant|users|user-create|user-password|user-delete ... arianet hosting ssh-keys list|add|delete ... arianet hosting actions list|get|wait ``` ### Regional VPS `arianet vps` (without `regional`) keeps managing the VPS servers of `/api/v1/servers`. Regional VPS servers (such as `iran-1`) live under `arianet vps regional`: ```bash arianet vps regional datacenters | plans | images arianet vps regional servers list|get|delete|start|stop|restart|kill|console|traffic|actions arianet vps regional servers create --datacenter --plan-id --image ubuntu-24.04 --hostname web-1 --billing-mode hourly [--wait] arianet vps regional servers reinstall --image | resize --plan-id | reset-password arianet vps regional actions list|get|wait ``` A generated root password is printed only once. ### Dedicated servers ```bash arianet baremetal suppliers | ranges | plans | rules | options arianet baremetal quote --catalog eco --plan-code --datacenter --memory --storage --bandwidth arianet baremetal orders create ... --rules-version --accept-rules arianet baremetal orders list|get|cancel arianet baremetal servers list|get|credentials|renewals|renew|os-templates|reinstall-status arianet baremetal servers reinstall --template ``` ### SMS ```bash arianet sms lines list | request [--number ] [--note "..."] arianet sms send --from --to 09121234567 --to 09351234567 --body "Your code is 1234" [--reference order-981] arianet sms send --from --to 09121234567 --template --at 2026-12-01T09:00:00+03:30 arianet sms messages list [--status failed] [--batch ] [--to ] [--page 2 --per-page 100] | get arianet sms batches list|get arianet sms scheduled list | cancel arianet sms inbound | prices | report [--from 2026-11-01] [--to 2026-11-30] arianet sms templates list|get|create|update|delete arianet sms blocked list [--phone ] | add | delete arianet sms webhook get | set --url | rotate-secret ``` ## Balance and invoices ```bash arianet balance # wallet balance arianet balance transactions [--page 2] arianet balance invoices [--status paid] [--page 2 --limit 20] arianet balance invoices get # one invoice with its line items ``` ## Output formats The default `table` output is for people. `-o json` (`--output json`) prints the API data as JSON for scripts: ```bash arianet vps list -o json | jq -r '.[] | select(.status == "active") | .id' arianet cloud servers list --label-selector env=prod -o json | jq -r '.[].id' ``` With `-o json`: - stdout carries only the JSON result. Progress, `--wait` output and hints go to stderr; the update notice is not shown. - Confirmation prompts are written to stderr. Pass `--yes` in scripts so nothing waits for input. - For cloud commands the response is printed as the API returned it, plus the final `actions` after a `--wait`. - Errors are written to stderr as ```json {"success":false,"error":{"code":"INSUFFICIENT_BALANCE","message":"...","status":402}} ``` ### Exit codes | Code | Meaning | |------|---------------------------------------------------------------------------------| | `0` | Success | | `1` | Any failure, including a `--wait` that failed, timed out or could not continue | ## Scripting examples Order a VPS and capture its ID: ```bash out=$(arianet vps create --plan 5 --region 1 --os 3 --hostname web-01 \ --ssh-key 2 --yes --output json) || exit 1 id=$(echo "$out" | jq -r '.id') ``` Retry safely with a key you control: ```bash key="order-$(date +%Y%m%d)-web-01" until arianet vps create --plan 5 --region 1 --os 3 --hostname web-01 \ --ssh-key 2 --yes --idempotency-key "$key" --output json; do sleep 30 done ``` Create three cloud servers behind a load balancer and wait for everything: ```bash arianet cloud servers create --name web --count 3 --datacenter ovh --plan 3 \ --image ubuntu-24.04 --ssh-key-id 5 --labels role=web --wait arianet cloud load-balancers create --name web --datacenter ovh --type lb11 \ --service tcp:80 --target label_selector:role=web --wait ``` ## Troubleshooting | Message / code | Cause and fix | |--------------------------------|---------------------------------------------------------------------------------------------------| | `No API token configured` | Run `arianet configure` or set `ARIANET_TOKEN`. | | `UNAUTHORIZED` | The token is wrong, revoked or expired. Check `arianet configure show` and create a new token. | | `INSUFFICIENT_SCOPE` | The token lacks the scope for this command (see [Token scopes](#token-scopes)). | | `IP_NOT_ALLOWED` | The token is restricted to other source IP addresses. | | `INSUFFICIENT_BALANCE` | Top up the wallet, then retry. `arianet balance` shows the current balance. | | `NO_DEFAULT_WALLET` | You have no default wallet. Pass `--currency `. | | `FEATURE_NOT_SUPPORTED` | The region does not offer SSH keys or firewalls. `arianet region list` shows `yes`/`no` per region. | | `RATE_LIMIT_EXCEEDED` / `rate_limit_exceeded` | Too many requests. The message says how long to wait. | | `UPSTREAM_ERROR` / `UPSTREAM_UNAVAILABLE` / `WRITES_UNAVAILABLE` | Temporarily unavailable. Wait and retry; a VPS order can be retried with the same `--idempotency-key`. | | `VALIDATION_ERROR` / `invalid_input` | An argument was rejected. The message names the field. | If `vps create` is interrupted after the order was sent, check `arianet vps list` before ordering again, or re-run the same command with the printed `--idempotency-key`. ## Support - VPS API: [API endpoints](https://docs.ariaservice.net/en/api-endpoints) · Cloud API: [Cloud API](https://docs.ariaservice.net/en/cloud-api) · [Terraform provider](https://docs.ariaservice.net/en/terraform) - Product page: [ariaservice.net/developers/cli](https://www.ariaservice.net/developers/cli) - Control panel: [cloud.ariaservice.net](https://cloud.ariaservice.net) - Issues: [github.com/ariaservice/arianet-cli/issues](https://github.com/ariaservice/arianet-cli/issues) --- title: "Terraform provider" description: "Manage Arianet Cloud servers, volumes, networks, firewalls, floating IPs and load balancers as code with the ariaservice/arianet Terraform provider." url: https://docs.ariaservice.net/en/terraform markdown: https://docs.ariaservice.net/en/terraform.md language: en --- # Terraform provider The **`ariaservice/arianet`** Terraform provider manages Arianet Cloud resources as code: servers, volumes, private networks (subnets, routes), firewalls, floating IPs, load balancers (services, targets) and your account's SSH keys. It needs Terraform 1.0 or newer. - Registry: [registry.terraform.io/providers/ariaservice/arianet](https://registry.terraform.io/providers/ariaservice/arianet) (current version **0.1.0**) - Source: [github.com/ariaservice/terraform-provider-arianet](https://github.com/ariaservice/terraform-provider-arianet) - Product page: [ariaservice.net/developers/terraform](https://www.ariaservice.net/developers/terraform) The provider calls the [Cloud API](https://docs.ariaservice.net/en/cloud-api); the full schema of every resource is on the registry. ## Provider setup ```hcl terraform { required_providers { arianet = { source = "ariaservice/arianet" version = "~> 0.1" } } } provider "arianet" { # Read from ARIANET_TOKEN when not set here. token = var.arianet_token } variable "arianet_token" { type = string sensitive = true } ``` Then run `terraform init`. ### Authentication Create a personal API token at [cloud.ariaservice.net/users/api-tokens](https://cloud.ariaservice.net/users/api-tokens) with the scopes **`cloud:servers:read`** and **`cloud:servers:write`** (add the SSH key scopes `ssh-keys:read` / `ssh-keys:write` if you manage `arianet_ssh_key`). Keep it out of your code: export it instead of writing it in a `.tf` file. ```bash export ARIANET_TOKEN="paste-your-token-here" terraform plan ``` ### Provider arguments | Argument | Environment variable | Default | Meaning | |-----------------|----------------------|-------------------------------|---------| | `token` | `ARIANET_TOKEN` | required | API token (sensitive) | | `endpoint` | `ARIANET_API_URL` | `https://api.ariaservice.net` | API root URL. Must be `https` (plain `http` only for localhost) | | `poll_interval` | | `2s` | Wait between polls of a running action; grows up to 10s | | `max_retries` | | `5` | Retries on HTTP 429 (honouring `Retry-After`, else `RateLimit-Reset`) and, for reads, on 502/503/504 | Long operations return an action; the provider waits for it, bounded by each resource's `timeouts` block (for example `timeouts { create = "20m" }`). A resource that answers 404 on refresh is removed from the state. ## Resources | Resource | Manages | |---|---| | `arianet_server` | A cloud server. Changing `plan_id` resizes it in place; `backups` turns daily backups on or off; `keep_backups` / `delete_snapshots` decide what happens to its copies on destroy. | | `arianet_volume` | A block storage volume (`size` in GB; growing resizes in place). | | `arianet_volume_attachment` | Attaches a volume to a server. | | `arianet_network` | A private network (`ip_range`, optional first `subnet_ip_range`). | | `arianet_network_subnet` | An extra subnet of a network. | | `arianet_network_route` | A static route (`destination` → `gateway`) of a network. | | `arianet_firewall` | A firewall with its `rule` blocks and optional `apply_to` (servers or label selectors). | | `arianet_firewall_attachment` | Applies a firewall to servers (`server_ids`) or label selectors (`label_selectors`). | | `arianet_floating_ip` | A floating IPv4 or IPv6 address, optional `server_id` and reverse DNS (`dns_ptr`). | | `arianet_floating_ip_assignment` | Assigns a floating IP to a server. | | `arianet_load_balancer` | A load balancer (`type` such as `lb11`, `algorithm`, optional `network_id`, `public_interface`). | | `arianet_load_balancer_service` | A listener: `protocol` (`tcp`, `http`, `https` passthrough), ports, `health_check`, `http` options. | | `arianet_load_balancer_target` | A target: a server, an IP or a label selector, optionally over the private network. | | `arianet_ssh_key` | An SSH key of your account. | Every resource supports `terraform import`, for example `terraform import arianet_server.web 123` (sub-resources use compound IDs such as `21/80` for a load balancer service). Resources that have them accept `labels` (a map), `project_id` (defaults to the account's default project; changing it moves the resource) and `protection_delete` (must be `false` before the resource can be destroyed). ### `arianet_server` arguments | Argument | Notes | |---|---| | `name`, `datacenter`, `plan_id`, `image` | Required. `datacenter` is a location code (`arianet_locations`), `image` a slug such as `ubuntu-24.04` or a snapshot/backup reference (`arianet_image(s)`). Changing `datacenter` or `image` replaces the server. | | `ssh_key_ids`, `ssh_keys` | Saved key IDs and/or public keys installed at creation | | `user_data` | cloud-init user data | | `enable_ipv4`, `enable_ipv6` | Public addresses (IPv4 is on by default) | | `firewall_ids`, `network_ids` | Firewalls applied directly; private networks attached at creation | | `backups` | Daily backups (billed extra) | | `keep_backups` | On destroy, keep the finished backups (billed per GB afterwards). Sent as `?keep_backups=true`. | | `delete_snapshots` | On destroy, also delete the server's snapshots, which otherwise stay billed. Sent as `?delete_snapshots=true`. | | `start_after_create`, `protection_delete`, `protection_rebuild`, `labels`, `project_id` | | Read-only: `ipv4_address`, `ipv6_address`, `status`, `disk_gb`, `locked`, `rescue_enabled`, and `root_password` (sensitive, returned once at creation; empty when SSH keys are used and the API returns none). Set `keep_backups` / `delete_snapshots` and apply **before** `terraform destroy`; they are read from the state when the server is deleted. ## Data sources | Data source | Returns | |---|---| | `arianet_locations` | Datacenters: `code`, `name`, `country`, `features`, `orderable` | | `arianet_plans` | Plans (optionally per `datacenter`): `id`, `name`, `vcpu`, `ram_mb`, `disk_gb`, `traffic_gb`, `hourly_price`, `monthly_price`, `available` | | `arianet_images`, `arianet_image` | Images by `type` (`system`, `app`, `snapshot`, `backup`), `datacenter`, `label_selector`; `arianet_image` picks one by `id`, `image`, `name` or `most_recent` | | `arianet_pricing` | The public price list (`/cloud/v1/public/pricing`): `server_types` with per-location prices, other `resources`, `vat_included` | | `arianet_server_costs` | `GET /servers/{id}/costs`: cost `lines`, `totals`, `snapshots`, `kept_backups` | | `arianet_load_balancer_types` | Load balancer types and their limits | | `arianet_server`, `arianet_network` | Look up an existing resource by `id`, `name` or `label_selector` | | `arianet_ssh_key` | Look up one of your SSH keys by `id`, `name` or `fingerprint` | ## Complete example A private network, three web servers behind a load balancer, a firewall that follows the `role=web` label, and a data volume: ```hcl terraform { required_providers { arianet = { source = "ariaservice/arianet" version = "~> 0.1" } } } provider "arianet" {} # token from ARIANET_TOKEN locals { datacenter = "ovh" } data "arianet_plans" "dc" { datacenter = local.datacenter } resource "arianet_ssh_key" "me" { name = "laptop" public_key = file("~/.ssh/id_ed25519.pub") } resource "arianet_network" "private" { name = "private" datacenter = local.datacenter ip_range = "10.0.0.0/16" subnet_ip_range = "10.0.1.0/24" } resource "arianet_server" "web" { count = 3 name = "web-${count.index + 1}" datacenter = local.datacenter plan_id = data.arianet_plans.dc.plans[0].id image = "ubuntu-24.04" ssh_key_ids = [arianet_ssh_key.me.id] network_ids = [arianet_network.private.id] labels = { role = "web" } user_data = <<-EOT #cloud-config packages: [nginx] EOT } resource "arianet_firewall" "web" { name = "web" rule { direction = "in" protocol = "tcp" port = "22" source_ips = ["203.0.113.4/32"] } rule { direction = "in" protocol = "tcp" port = "80" source_ips = ["0.0.0.0/0", "::/0"] } apply_to = [{ label_selector = "role=web" }] } resource "arianet_load_balancer" "web" { name = "web" datacenter = local.datacenter type = "lb11" algorithm = "round_robin" network_id = arianet_network.private.id } resource "arianet_load_balancer_service" "http" { load_balancer_id = arianet_load_balancer.web.id protocol = "http" listen_port = 80 destination_port = 80 health_check = { protocol = "http" port = 80 interval = 10 timeout = 5 retries = 3 http = { path = "/" status_codes = ["2??"] } } } resource "arianet_load_balancer_target" "web" { load_balancer_id = arianet_load_balancer.web.id type = "label_selector" label_selector = "role=web" use_private_ip = true } resource "arianet_volume" "data" { name = "data" datacenter = local.datacenter size = 50 filesystem = "ext4" } resource "arianet_volume_attachment" "data" { volume_id = arianet_volume.data.id server_id = arianet_server.web[0].id } data "arianet_server_costs" "web1" { server_id = arianet_server.web[0].id } output "load_balancer_ip" { value = arianet_load_balancer.web.ipv4 } output "web1_monthly_cost" { value = data.arianet_server_costs.web1.totals } ``` ```bash export ARIANET_TOKEN="..." terraform init terraform plan terraform apply ``` Prices before you apply: `curl -s https://api.ariaservice.net/cloud/v1/public/pricing` or `arianet cloud pricing` (no token needed). ## See also - [Cloud API](https://docs.ariaservice.net/en/cloud-api) · [CLI](https://docs.ariaservice.net/en/cli) (`arianet cloud ...`) - Per-resource documentation on the [Terraform Registry](https://registry.terraform.io/providers/ariaservice/arianet/latest/docs) --- title: "API reference" description: "Every Arianet API at a glance - base URL, OpenAPI document, interactive reference, scopes and guide for each, plus generating a client from OpenAPI." url: https://docs.ariaservice.net/en/api-reference markdown: https://docs.ariaservice.net/en/api-reference.md language: en --- # API reference Every Arianet API has an **OpenAPI document** describing all its endpoints, parameters, bodies, responses and error codes. The interactive references are built from those documents, and you can search endpoints in them. | API | Base URL | Interactive | OpenAPI | Scopes | Guide | |---|---|---|---|---|---| | Arianet Cloud | `https://api.ariaservice.net/cloud/v1` | [Reference](https://docs.ariaservice.net/en/cloud-api-reference) | [JSON](https://api.ariaservice.net/cloud/v1/openapi.json) | `cloud:servers:*` | [Cloud](https://docs.ariaservice.net/en/cloud-api) | | VPS | `https://api.ariaservice.net/api/v1` | [Reference](https://docs.ariaservice.net/en/vps-api-reference) | [YAML](pathname:///openapi.yaml) | `servers:*`, `regions:read`, ... | [VPS](https://docs.ariaservice.net/en/api-endpoints) | | Regional VPS | `https://api.ariaservice.net/vps/v1` | [Reference](https://docs.ariaservice.net/en/regional-vps-api-reference) | [JSON](https://api.ariaservice.net/vps/v1/openapi.json) | `vps:servers:*` | [Regional VPS](https://docs.ariaservice.net/en/regional-vps-api) | | Hosting | `https://api.ariaservice.net/hosting/v1` | [Reference](https://docs.ariaservice.net/en/hosting-api-reference) | [JSON](https://api.ariaservice.net/hosting/v1/openapi.json) | `hosting:accounts:*` | [Hosting](https://docs.ariaservice.net/en/hosting-api) | | Dedicated servers | `https://api.ariaservice.net/baremetal/v1` | [Reference](https://docs.ariaservice.net/en/baremetal-api-reference) | [JSON](https://api.ariaservice.net/baremetal/v1/openapi.json) | `baremetal:servers:*` | [Dedicated servers](https://docs.ariaservice.net/en/baremetal-api) | | SMS | `https://api.ariaservice.net/sms/v1` | [Reference](https://docs.ariaservice.net/en/sms-api-reference) | [JSON](https://api.ariaservice.net/sms/v1/openapi.json) | `sms:*` | [SMS](https://docs.ariaservice.net/en/sms/api) | The shared rules (errors, rate limits, pagination, asynchronous operations) are in [API conventions](https://docs.ariaservice.net/en/api-conventions). ## Generating a client from OpenAPI Any OpenAPI tool can generate a client for your language. With [OpenAPI Generator](https://openapi-generator.tech): ```bash npx @openapitools/openapi-generator-cli generate \ -i https://api.ariaservice.net/cloud/v1/openapi.json \ -g python -o ./arianet-cloud-client ``` Or import the document into Postman / Insomnia: **Import → Link** with the OpenAPI URL, then pick **Bearer Token** with your token in the authorization settings. ## The copies on this site The interactive references read a copy of each document published with this site (the APIs send no CORS headers). The source of truth is the document each API serves at `/openapi.json`.