Roblox Integration

Installation

1. Create the location and access point

  1. In Vestrane, go to Locations and create (or open) the location that represents this Roblox place. Set its Roblox Universe ID and Roblox Place ID - the game API rejects requests claiming a different Place ID than the one configured here.
  2. Inside that location, create an Access Point for each door/gate you want to control, and note its ID.
  3. Add at least one Access Rule to that access point (direct Roblox user, Roblox group + rank, or an access group) - without a rule, every check is denied.

2. Generate a location secret

  1. From the location's page, click Roblox Integration.
  2. Click Generate secret. The raw secret is shown once- copy it now. If you navigate away without copying it, you'll need to rotate to get a new one.

3. Add the SDK to your place

Fastest path: download VESTRANE_FINAL.rbxmand insert it in Studio. You get two top-level items — a ServerScriptService folder and a reader model. (Using Rojo or another sync tool instead? Copy the same files from this project's /roblox directory.)

  1. Drag the ServerScriptService folder's contents into your place's actual ServerScriptService, then fill in VestraneConfig's three fields: API_BASE_URL, LOCATION_ID, and LOCATION_SECRET.
  2. For each door, duplicate the reader modeland place the copy where you want it — it already has its ProximityPrompt, LED, sound, and a VestraneReaderConfig.server.luaconfig script wired up inside it. Open that copy's config script and set ACCESS_POINT_IDto that door's access point ID (and GROUP_IDS, only if that access point uses a Roblox-group rule). Nothing else to build per reader.

Building your own reader prop instead of using the one from the download? It only needs to call into VestraneReaderKit.lua(the shared logic every reader goes through) the same way — either place a copy of VestraneReaderConfig.server.lua inside your model and set ACCESS_POINT_ID, or tag the model "VestraneReader" and set an AccessPointId Attribute in the Properties panel, which VestraneReaderAutoWire.server.lua(also in the download's ServerScriptService folder) picks up automatically, no per-reader script at all. Customizing one reader's reactions (a different door animation, extra sound, whatever) is done by passing onReady/onGranted/onDeniedoverrides into that reader's own config — see the comments in VestraneReaderConfig.server.lua for the exact shape.

4. Enable remote unlock (optional)

Copy RemoteCommandPoller.server.lua into ServerScriptService - it works with the same config you already set up, no additional setup needed. From the access point's dashboard page, click Unlock now, pick a scope, and confirm.

5. Test the connection

  1. Play-test the place (F5 in Studio, or a live server).
  2. Walk up to the reader and trigger the prompt.
  3. Check the Studio output - you should see a line like [Vestrane] YourUsername -> true (ACCESS_GRANTED_DIRECT_USER) event=...
  4. Back in the dashboard, the location's Roblox Integration page should show "Last seen" updated to just now.

If you instead see CLIENT_HTTP_ERROR_401, double-check the secret was copied in full, the integration isn't disabled or revoked, and LOCATION_ID/LOCATION_SECRETweren't swapped between two locations. ACCESS_DENIED_NO_MATCHmeans the connection is working - the access point just doesn't have a rule that matches your account yet.

6. Rotating or revoking a secret

Rotate (Roblox Integration page) issues a brand-new secret and immediately invalidates the old one. Revokeimmediately invalidates the current secret without issuing a new one - use this if you suspect it's been exposed.