VPS.org API

REST APIドキュメント

サーバーAPI

VPS サーバを作成、検査、電源、サイズ変更、削除します。サーバは uid で識別されます。

エンドポイント 15
ベースパス /api/v1/servers
得る /api/v1/servers/

すべてのサーバーを一覧表示する

アカウントにあるサーバを返します。最近のものを先に、ページ当たり 25 個表示します。削除中のサーバは含まれません。

必要な権限: servers:list

クエリパラメータ

パラメータ タイプ 必須 説明
page integer いや ページ番号、1 から始まる
page_size integer いや ページ当たりの結果 (デフォルトは 25, 最大は 100)

リクエスト例

cURL
Python
JavaScript
PHP
curl -X GET "https://admin.vps.org/api/v1/servers/" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
import requests

url = "https://admin.vps.org/api/v1/servers/"
headers = {"Authorization": "Bearer YOUR_API_TOKEN"}

response = requests.get(url, headers=headers)
for server in response.json()["results"]:
    print(server["uuid"], server["hostname"], server["status"])
const response = await fetch('https://admin.vps.org/api/v1/servers/', {
  headers: { 'Authorization': 'Bearer YOUR_API_TOKEN' }
});

const data = await response.json();
console.log(data.results);
$ch = curl_init('https://admin.vps.org/api/v1/servers/');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer YOUR_API_TOKEN']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = json_decode(curl_exec($ch), true);
curl_close($ch);

foreach ($data['results'] as $server) {
    echo $server['hostname'] . ' ' . $server['status'] . "\n";
}

回答例

{
  "count": 2,
  "next": null,
  "previous": null,
  "results": [
    {
      "uuid": "8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b",
      "hostname": "web-01",
      "status": "on",
      "error_description": null,
      "location_name": "New Jersey",
      "plan_name": "1 vCPU / 2 GB RAM / 10 GB",
      "os_name": "Ubuntu",
      "ipv4_addresses": ["203.0.113.10"],
      "ipv6_addresses": ["2001:db8:2:dd::f9:6b"],
      "created_at": "2026-07-30T03:54:14.914364Z",
      "deployed": true
    },
    {
      "uuid": "2d7e9b40-6c1a-4f3e-8b5d-9a0c1e2f3b4d",
      "hostname": "db-01",
      "status": "queue",
      "error_description": null,
      "location_name": "New Jersey",
      "os_name": "Debian",
      "ipv4_addresses": [],
      "ipv6_addresses": [],
      "created_at": "2026-09-14T19:33:49.426508Z",
      "deployed": false
    }
  ]
}

応答フィールド

フィールド タイプ 説明
uuid string 他のすべてのサーバエンドポイントで使用するサーバ識別子
hostname string サーバを作成したときに選択したホスト名
status string 現在の状態。下のサーバの状態値を参照してください。
error_description string | null 状態がエラーの場合、最後の失敗の詳細、それ以外は null
location_name string サーバが実行されている場所の名前
os_name string OS の名前、バージョンなし
plan_name string 読みやすいプラン概要、例えば 1 vCPU / 2 GB RAM / 10 GB
ipv4_addresses array IPv4 アドレスは文字列として表示されます。サーバが配置されるまで空で、IPv4 がないプランでは空です。
ipv6_addresses array IPv6 アドレスは文字列として表示されます。サーバが配置されるまで空です。
created_at datetime 作成時刻 (ISO 8601, UTC)
deployed boolean プロビジョニングが終了したら TRUE

応答ステータスコード

200 サーバーリストを正常に取得しました
403 API トークンが無効か欠けています。または、トークンには必要な権限がありません。
ポスト /api/v1/servers/

新しいサーバーを作成する

新しいサーバを配置のためにキューに入れ、状態キューを直ちに返します。プロビジョニングはバックグラウンドで続きます: 配置が true になるまで状態エンドポイントをポールします。サーバが準備ができたら、ログイン情報をアカウントオーナーにメールします。

アカウントには保存された支払い方法が必要です。アカウント履歴により、サーバが作成される前にカードに約1週間分のプラン料金 (少なくとも 1 USD) を一時的に預金保留するかもしれません。

必要な権限: servers:create

リクエストボディパラメータ

パラメータ タイプ 必須 説明
hostname string はい 少なくとも 3 文字です。文字、数字、ハイフン、点のみです。
location_id integer はい Locations API からアクティブな場所の id
plan_uuid string はい プラン API からアクティブなプランの uuid
operating_system_version_uuid string はい OS のバージョンリストにあるアクティブなエントリの uuid
ssh_key_uuids array いや サーバにインストールする SSH Keys API からの SSH 鍵の UUID
ssh_key_ids array いや ssh_key_uuids の代わりに SSH 鍵の整数 id を指定します。両方が送られた場合は ssh_key_ids を使用します。
ssh_key_uuid, ssh_key_id string, integer いや 単一の SSH 鍵の略語
auth_method string いや これは、パスワード、ssh_key、または両方です。SSH 鍵が提供されている場合、デフォルトはパスワードまたは両方です。

リクエスト例

cURL
Python
JavaScript
PHP
curl -X POST "https://admin.vps.org/api/v1/servers/" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "hostname": "web-01",
    "location_id": 1,
    "plan_uuid": "3bc2faf6-8f8b-4978-b62d-b52ed3f858e9",
    "operating_system_version_uuid": "c3418f90-80a0-4e00-a7e1-d0ab1822b941",
    "ssh_key_uuids": ["YOUR_SSH_KEY_UUID"]
  }'
import requests

url = "https://admin.vps.org/api/v1/servers/"
headers = {"Authorization": "Bearer YOUR_API_TOKEN"}
data = {
    "hostname": "web-01",
    "location_id": 1,
    "plan_uuid": "3bc2faf6-8f8b-4978-b62d-b52ed3f858e9",
    "operating_system_version_uuid": "c3418f90-80a0-4e00-a7e1-d0ab1822b941",
    "ssh_key_uuids": ["YOUR_SSH_KEY_UUID"],
}

response = requests.post(url, headers=headers, json=data)
server = response.json()
print(response.status_code, server["uuid"], server["status"])
const response = await fetch('https://admin.vps.org/api/v1/servers/', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    hostname: 'web-01',
    location_id: 1,
    plan_uuid: '3bc2faf6-8f8b-4978-b62d-b52ed3f858e9',
    operating_system_version_uuid: 'c3418f90-80a0-4e00-a7e1-d0ab1822b941',
    ssh_key_uuids: ['YOUR_SSH_KEY_UUID']
  })
});

const server = await response.json();
console.log(server.uuid, server.status);
$data = [
    'hostname' => 'web-01',
    'location_id' => 1,
    'plan_uuid' => '3bc2faf6-8f8b-4978-b62d-b52ed3f858e9',
    'operating_system_version_uuid' => 'c3418f90-80a0-4e00-a7e1-d0ab1822b941',
    'ssh_key_uuids' => ['YOUR_SSH_KEY_UUID']
];

$ch = curl_init('https://admin.vps.org/api/v1/servers/');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_TOKEN',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server = json_decode(curl_exec($ch), true);
curl_close($ch);

回答例

201 サーバの詳細を取得するで説明したフルサーバオブジェクトで作成されました。アドレスと vmid は、デプロイメントが終わった後に埋め込まれます。

{
  "uuid": "5f0c8e2a-6b1d-4c3e-9a7f-2d4b6c8e0a1f",
  "hostname": "web-01",
  "vmid": null,
  "status": "queue",
  "error_description": null,
  "location": {
    "id": 1,
    "name": "New Jersey",
    "country_name": "United States",
    "is_active": true
  },
  "plan": {
    "uuid": "3bc2faf6-8f8b-4978-b62d-b52ed3f858e9",
    "cpu": 1,
    "ram": 2,
    "ram_unit": "GB",
    "disk_space": 10,
    "disk_space_total": 10240,
    "transfer": 500,
    "price": "3.50",
    "cpu_type_name": "Shared",
    "is_active": true,
    "hourly_price": "0.005",
    "monthly_price": "3.50",
    "is_gpu": false,
    "gpu_count": 0,
    "gpu_model": ""
  },
  "operating_system": {
    "id": 1,
    "name": "Ubuntu",
    "svg_icon": "<svg ...>",
    "versions": [ ... ]
  },
  "operating_system_version": {
    "uuid": "c3418f90-80a0-4e00-a7e1-d0ab1822b941",
    "name": "24.04 LTS x64",
    "os_name": "Ubuntu",
    "os_svg_icon": "<svg ...>",
    "is_active": true
  },
  "ipv4_addresses": [],
  "ipv6_addresses": [],
  "deployed": false,
  "created_at": "2026-09-14T21:02:11.402113Z",
  "recent_actions": []
}

応答ステータスコード

201 サーバを作成し、配置のためにキューに入れた
400 検証エラー、例えば非アクティブな場所、プラン、オペレーティングシステムのバージョン
402 ファイルにある支払方法がない、未払い請求書、カードの予約が拒否された
403 API トークンが無効か欠けています。または、トークンには必要な権限がありません。
429 アカウントはサーバ作成制限に達しました
得る /api/v1/servers/{uuid}/

サーバーの詳細を取得する

サーバの場所、プラン、オペレーティングシステム、IPアドレス、最近の5つの動作を含むサーバを返します。

必要な権限: servers:list

curl -X GET "https://admin.vps.org/api/v1/servers/8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b/" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

回答例

{
  "uuid": "8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b",
  "hostname": "web-01",
  "vmid": 1042,
  "status": "on",
  "error_description": null,
  "location": {
    "id": 1,
    "name": "New Jersey",
    "country_name": "United States",
    "is_active": true
  },
  "plan": {
    "uuid": "14186969-fbaf-43e1-9ab2-b1f1aeb66674",
    "cpu": 1,
    "ram": 2,
    "ram_unit": "GB",
    "disk_space": 25,
    "disk_space_total": 25600,
    "transfer": 1,
    "price": "5.00",
    "cpu_type_name": "Shared",
    "is_active": true,
    "hourly_price": "0.007",
    "monthly_price": "5.00",
    "is_gpu": false,
    "gpu_count": 0,
    "gpu_model": ""
  },
  "operating_system": {
    "id": 1,
    "name": "Ubuntu",
    "svg_icon": "<svg ...>",
    "versions": [ ... ]
  },
  "operating_system_version": {
    "uuid": "c3418f90-80a0-4e00-a7e1-d0ab1822b941",
    "name": "24.04 LTS x64",
    "os_name": "Ubuntu",
    "os_svg_icon": "<svg ...>",
    "is_active": true
  },
  "ipv4_addresses": [
    {
      "ip": "203.0.113.10",
      "gateway": "203.0.113.1",
      "subnet": "203.0.113.0",
      "rdns": "web-01.example.com"
    }
  ],
  "ipv6_addresses": [
    {
      "ip": "2001:db8:2:dd::f9:6b",
      "gateway": "2001:db8:2:dd::f9:1",
      "subnet": "2001:db8:2:dd::f9:0",
      "rdns": "web-01.example.com"
    }
  ],
  "deployed": true,
  "created_at": "2026-07-30T03:54:14.914364Z",
  "recent_actions": [
    {
      "id": 17028,
      "action": "create",
      "action_display": "Create",
      "description": "Server deployed with VMID 1042",
      "user_email": "you@example.com",
      "created_at": "2026-07-30T03:54:32.860854Z"
    }
  ]
}

SVG アイコンマークアップとバージョンリストをここで簡略化します。

応答フィールド

フィールド タイプ 説明
vmid integer | null 仮想マシン番号、配置中に設定
location object Locations API が返す場所オブジェクト
plan object Plans API が返すプランオブジェクト
operating_system, operating_system_version object OS API が返すオペレーティングシステムとインストールされたバージョン
ipv4_addresses, ipv6_addresses array ip、ゲートウェイ、サブネット、rdns (逆DNSホスト名) を含むアドレスごとに一つのオブジェクト
recent_actions array 最近のアクションを最多5つまで: id, action, action_display, description, user_email, created_at

応答ステータスコード

200 サーバーの詳細を正常に取得しました
404 見つかりませんでした。あるいは、他のアカウントに属しています。
得る /api/v1/servers/{uuid}/status/

サーバの状態を取得

サーバを作成、電源を入れ、サイズを変更した後のポリングのための軽量コール。

curl -X GET "https://admin.vps.org/api/v1/servers/8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b/status/" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
  "status": "on",
  "deployed": true,
  "resizing": false
}

サーバの状態値

値 説明
queue 操作(デプロイ、電源操作、リサイズ、復元)がキュー待ちまたは処理中です
deploying プロビジョニング中。コントロールパネルから作成したサーバはこの状態を使用します。APIを通して作成したサーバは準備が整うまでキューに残ります。
on 走る
off パワーオフ
error 最後のアクションが失敗しました。 error_description を参照してください。
suspended_payment 請求書の支払いが遅れたため 休業
ポスト /api/v1/servers/{uuid}/power/

サーバの電源を制御

電源アクションをキューに追加します。アクションが完了するまでサーバの状態はキューに変更されます。

必要な権限: servers:power

リクエストボディパラメータ

パラメータ タイプ 必須 説明
action string はい start: 電源を入れろ
shutdown: 優雅なシャットダウン ゲストが止まらないと 強制的にシャットダウン
restart: ハードパワーサイクル (停止、再始動)
stop: サーバは現在再起動と同じ電源サイクルを実行しています。サーバを停止するには shutdown を使用してください。

リクエスト例

cURL
Python
curl -X POST "https://admin.vps.org/api/v1/servers/8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b/power/" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"action": "restart"}'
import requests

server_uuid = "8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b"
url = f"https://admin.vps.org/api/v1/servers/{server_uuid}/power/"
headers = {"Authorization": "Bearer YOUR_API_TOKEN"}

response = requests.post(url, headers=headers, json={"action": "restart"})
print(response.json())

回答例

{
  "message": "Server restart queued"
}

応答ステータスコード

200 アクションがキューに入っています
400 欠けているアクションまたはサポートされていないアクション
402 あの口座に 未払い請求書があるから スタート拒否されて
404 見つかりませんでした。あるいは、他のアカウントに属しています。
ポスト /api/v1/servers/{uuid}/resize/

サーバのサイズを変更

サーバを他のアクティブなプランに移動します。新しいプランは現在のプランよりもディスクスペースが少なくてはなりません。要求のボディにはサイズ変更のアクションを含めなければなりません。新しいプランのハイパーバイザ容量は、キューに入る前にチェックされます。拒否された要求はサーバを変更しません。

サーバはサイズ変更中に停止し、その後再起動します。サイズ変更に失敗した場合、サーバは以前のプランに戻され、実行中であれば再起動されます。ディスクの増加は無効にできます。

必要な権限: servers:resize

リクエストボディパラメータ

パラメータ タイプ 必須 説明
action string はい 変更しなければなりません
new_plan_uuid string はい 移動するプランの uuid
curl -X POST "https://admin.vps.org/api/v1/servers/8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b/resize/" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"action": "resize", "new_plan_uuid": "5e26a4a6-bd0c-467c-abca-da036c811c3f"}'
{
  "message": "Resize queued successfully"
}

拒否されたサイズ変更の例 (409):

{
  "error": "Not enough hypervisor capacity for the selected plan; the server was not changed"
}

応答ステータスコード

200 アクションがキューに入っています
400 アクションまたは new_plan_uuid が欠けています。不正なプラン、不活性なプラン、ディスクスペースが少ないプラン、GPU プラン (API を使って GPU プランのサイズを変更できません)
404 見つかりませんでした。あるいは、他のアカウントに属しています。
409 サイズ変更やストレージの変更が既に進行中か、新しいプランに対してハイパーバイザ容量が不足しています
503 キャパシティを確認できませんでした。サーバは変更されていません。後で再度試してください。
ポスト /api/v1/servers/{uuid}/reset-password/

ルートパスワードをリセット

新しい root パスワードを生成し、応答で返し、サーバ上で変更をキューに入れます。新しいパスワードはメールで送信されます。サーバは配置されている必要があります。要求のボディは必要ありません。

curl -X POST "https://admin.vps.org/api/v1/servers/8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b/reset-password/" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
  "message": "Password reset queued. New password will also be emailed to you.",
  "password": "generated-password",
  "job_id": "b6f1c7e2-3a4d-4f5e-8b9c-0d1e2f3a4b5c"
}

応答ステータスコード

200 アクションがキューに入っています
400 サーバはまだ配置されていません
404 見つかりませんでした。あるいは、他のアカウントに属しています。
得る ポスト /api/v1/servers/{uuid}/rdns/

逆DNS

GET はサーバ上のすべての IPv4 と IPv6 アドレスの逆 DNS ホスト名をリストします。POST は一つのアドレスに設定します。空のホスト名を送信すると、アドレスはデフォルトの逆 DNS 名にリセットされます。

必要な権限: servers:update

リクエストボディパラメータ (POST)

パラメータ タイプ 必須 説明
ip string はい このサーバに割り当てられた IPv4 または IPv6 アドレス
hostname string いや PTR ホスト名。空にするとデフォルトに戻ります。
curl -X POST "https://admin.vps.org/api/v1/servers/8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b/rdns/" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"ip": "203.0.113.10", "hostname": "mail.example.com"}'
{
  "message": "Reverse DNS for 203.0.113.10 set to mail.example.com",
  "ip": "203.0.113.10",
  "hostname": "mail.example.com"
}

GET 応答:

{
  "rdns": [
    {"ip": "203.0.113.10", "hostname": "mail.example.com"},
    {"ip": "2001:db8:2:dd::f9:6b", "hostname": "mail.example.com"}
  ]
}

応答ステータスコード

400 ipが欠けているか、ホスト名が設定できませんでした
404 IP アドレスがこのサーバに割り当てられていません
ポスト /api/v1/servers/{uuid}/exec/

サーバ上でコマンドを実行

QEMU ゲストエージェントを通してサーバ内でシェルコマンドを実行し、終了を待つ。サーバは実装されて実行され、qemu-guest-agent はゲストにインストールされて実行される必要があります。

必要な権限: servers:exec

リクエストボディパラメータ

パラメータ タイプ 必須 説明
command string はい /bin/sh -c でコマンドラインを実行、最大2000文字
timeout integer いや コマンドを待つ秒数。1 から 300 まで (標準は 30)
curl -X POST "https://admin.vps.org/api/v1/servers/8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b/exec/" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": "uptime", "timeout": 30}'
{
  "stdout": " 21:14:03 up 46 days,  2:10,  0 users,  load average: 0.08, 0.03, 0.01\n",
  "stderr": "",
  "exit_code": 0,
  "timed_out": false
}

タイムアウトが過ぎた後もコマンドが実行されている場合、 応答は timed_out を true に、 exit_code を null に設定します。

応答ステータスコード

200 コマンドが終了またはタイムアウトしました
400 サーバが実行されていないか、デプロイされていないか、またはパラメータが無効です
409 QEMU ゲストエージェントがサーバ上で実行されていません
503 一時的な接続問題です。Retry-Afterヘッダの後に再試行してください。
消去 /api/v1/servers/{uuid}/

サーバーの削除

永久削除のためにサーバをキューに追加します。サーバはすぐにリストから消え、復元できません。

必要な権限: servers:delete

curl -X DELETE "https://admin.vps.org/api/v1/servers/8c4f2a1e-5b3d-4e6f-9a7b-1c2d3e4f5a6b/" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
  "message": "Server deletion queued"
}

応答ステータスコード

202 受け入れ: 要求はキューに入れられました
404 見つかりませんでした。あるいは、他のアカウントに属しています。
得る ポスト /api/v1/ssh-keys/

SSH キー

公開SSHキーをアカウントに保存し、サーバー作成時にそのuuidをssh_key_uuidsとして渡します。GETはキーの一覧を返し(ページごとに25件)、POSTはキーを追加します。

必要な権限: ssh-keys:list (GET), ssh-keys:create (POST)

リクエストボディパラメータ (POST)

パラメータ タイプ 必須 説明
name string はい キーを識別する名前、最大 100 文字
public_key string はい OpenSSH フォーマットの公開鍵。例えば id_ed25519.pub の内容

リクエスト例

cURL
Python
curl -X POST "https://admin.vps.org/api/v1/ssh-keys/" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "laptop", "public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... you@laptop"}'
import requests

url = "https://admin.vps.org/api/v1/ssh-keys/"
headers = {"Authorization": "Bearer YOUR_API_TOKEN"}

with open("/home/you/.ssh/id_ed25519.pub") as f:
    data = {"name": "laptop", "public_key": f.read().strip()}

response = requests.post(url, headers=headers, json=data)
print(response.status_code, response.json()["uuid"])

回答例

{
  "id": 19,
  "uuid": "6e1b9c52-3f8a-4d7e-a2c4-5b9d0e1f2a3c",
  "name": "laptop",
  "public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... you@laptop",
  "fingerprint": "0b:4c:9b:48:76:e7:1d:07:b9:ac:71:90:70:f7:9a:69",
  "created_at": "2026-08-23T19:16:11.547183Z",
  "last_used_at": null
}

応答フィールド

フィールド タイプ 説明
id, uuid integer, string 鍵識別子。ssh_key_uuidsと下の URL に uuid を使用します。id は ssh_key_ids で動作します。
fingerprint string プラットフォームによって計算された鍵の MD5 フィンガープリント
last_used_at datetime | null 鍵が最後に新しいサーバにインストールされた時

応答ステータスコード

201 キーを追加
400 名前がありませんか?あるいは公開鍵は有効な SSH 公開鍵ではありませんか?
得る 消去 /api/v1/ssh-keys/{uuid}/

SSH 鍵を取得または削除

GETは上のフィールドを含む鍵を返します。DELETEはアカウントから削除し、ボディなしの 204 を返します。鍵を削除すると、インストールされているサーバから削除されません。鍵は編集できません。削除して再び追加します。

必要な権限: ssh-keys:list (GET), ssh-keys:delete (DELETE)

curl -X DELETE "https://admin.vps.org/api/v1/ssh-keys/6e1b9c52-3f8a-4d7e-a2c4-5b9d0e1f2a3c/" \
  -H "Authorization: Bearer YOUR_API_TOKEN"

バックアップとスナップショット

バックアップやスナップショットを作成することもサーバアクションです。