使い方

Roblox側にそのまま貼れる見本です。⚠️ 先に Game Settings > Security のAllow HTTP Requestsを有効にしてください。

つなぎ先

https://www.vespo.app/v1/…
Authorization: Bearer <あなたのAPIキー>

キーは開発者サイトで登録すると、その場で1本もらえます。

1. 置き場所と鍵

⚠️ キーはサーバー側だけに置く。LocalScript に書くと誰にでも見えます。

-- ServerScriptService に置く(クライアントからは見えない場所)
local HttpService = game:GetService("HttpService")

local BASE = "https://www.vespo.app"
-- ⚠️ 直接書かず、Creator Dashboard の Secrets か
--    ServerStorage の非公開の値から読むのが安全
local API_KEY = "ここに自分のキー"

local function call(method, path, body)
	local ok, res = pcall(function()
		return HttpService:RequestAsync({
			Url = BASE .. path,
			Method = method,
			Headers = {
				["Authorization"] = "Bearer " .. API_KEY,
				["Content-Type"] = "application/json",
			},
			Body = body and HttpService:JSONEncode(body) or nil,
		})
	end)
	if not ok then
		warn("[Vespo] 通信に失敗:", res)
		return nil
	end
	-- ⚠️ 200番台以外は中身に error が入っている。開発者サイトの「失敗」タブにも残る
	if res.StatusCode >= 400 then
		warn("[Vespo] " .. res.StatusCode .. " " .. tostring(res.Body))
		return nil
	end
	return HttpService:JSONDecode(res.Body)
end

2. トークルームを作る

何度呼んでも同じ結果になります(同じIDなら作り直されません)。返りの created で、新しく出来たかどうかが分かります。

-- roomId は自分で決める文字列。ゲーム側でも同じIDを覚えておく
local res = call("POST", "/v1/rooms", {
	roomId = "myGame:lobby",
	name = "ロビー",
	members = { 12345678, 87654321 },  -- RobloxのUserId
	-- アイコンは任意。Robloxのカタログの物を使える
	icon = { id = 123456789, thumb = "Asset" },  -- "Asset" か "Bundle"
	iconBg = "#ffd9a0",
})

-- res.created が true なら、この呼び出しで新しく出来た
print(res and res.created)

3. メッセージを送る

送ると、ゲームを閉じている相手のスマホにも通知が届きます。⚠️ 中身は content(text ではありません)。clientMsgId を付けると、再送しても二重に入りません。

-- ⚠️ presentRobloxIds = いま同じサーバーに居る人。
--    その人はゲーム内でもう見えているので、スマホには鳴らさない
local present = {}
for _, p in Players:GetPlayers() do
	table.insert(present, p.UserId)
end

call("POST", "/v1/messages", {
	roomId = "myGame:lobby",
	senderUserId = player.UserId,
	senderName = player.DisplayName,
	content = message,                  -- ⚠️ 2000文字まで
	clientMsgId = HttpService:GenerateGUID(false),
	experienceId = game.GameId,
	presentRobloxIds = present,
})

4. いま居る人を知らせる

⚠️ 差分ではなく毎回「全員」を送る。取りこぼしてもズレが残りません。これを1回呼ぶとゲームと自動でつながり、同接数が出ます。

local Players = game:GetService("Players")

local function report()
	local ids = {}
	for _, p in Players:GetPlayers() do
		table.insert(ids, p.UserId)
	end
	call("POST", "/v1/presence", {
		experienceId = game.GameId,
		experienceName = "自分のゲーム名",
		placeId = game.PlaceId,
		serverId = game.JobId,
		robloxUserIds = ids,
	})
end

task.spawn(function()
	while task.wait(30) do
		report()
	end
end)

-- ⚠️ サーバーが閉じる時は空で送る=その部屋の人が全員消える
game:BindToClose(function()
	call("POST", "/v1/presence", {
		experienceId = game.GameId,
		serverId = game.JobId,
		robloxUserIds = {},
	})
end)

5. 「プレイ中」を見せるか決めてもらう

⚠️ **既定は見せません。** この口を叩かない限り、あなたのゲームで遊んでいることは誰にも出ません(本人が選ぶ物なので、こちらから勝手には出せない)。

-- ゲームの中に「遊んでいることを見せる」のスイッチを置いて、押された時に呼ぶ
call("POST", "/v1/presence-settings", {
	robloxUserId = player.UserId,
	show = true,                   -- false にすると誰にも出なくなる
	name = "自分のゲーム名",        -- 出す時の呼び名(省くとゲーム名)
})

-- ⚠️ 見せる先は「同じトークの人・友だち」まで。誰にでも見えるわけではありません。
-- ⚠️ スイッチは**ゲーム側に置いてください**。RobVerse側には出す場所がありません。
-- ⚠️ 押していない人にも毎回呼ばないこと(本人の選択を上書きすることになります)。

6. ルームから抜ける

ゲーム側で誰かが抜けた時に呼びます。Vespo側の一覧からも消えます。

call("POST", "/v1/rooms/leave", {
	roomId = "myGame:lobby",
	robloxUserId = player.UserId,
})

7. Vespo側の操作を受け取る

Vespo側(サイトやスマホ)で退出・名前変更された時に、ゲーム側へ伝わってくる伝言板です。

-- 入室時などに1回。届いた操作は実行したら ack を返す
local ops = call("GET", "/v1/room-ops?robloxUserId=" .. player.UserId)
for _, op in (ops and ops.ops or {}) do
	-- op.kind は "leave" / "rename" / "icon_bg" など
	-- ここで自分のゲーム側のデータを直す

	call("POST", "/v1/room-ops/ack", { ids = { op.id } })
end

覚えておくこと

  • キーはサーバーにだけ置く。

    クライアント側に書くと、誰にでも見えてしまいます。

  • 上限は同接に合わせて自動で伸びます(600 + 同接 × 1.5 回/分)。

    人気が出たことが理由で止まることはありません。⚠️ 逆に、人が少ないのに呼びすぎると429になります。ループの中で毎フレーム呼ばないでください。

  • 見られる数字は合計と推移だけ。

    誰が何を言ったかは、開発者にも運営にも見せません。

APIを取得