LobbyLab error codes

Every error LobbyLab reports has a stable code and a page that says what it means and what to do. Codes never change meaning once shipped.

Multiplayer API errors

Sent in the JSON error body with the HTTP status shown. Status: the Multiplayer API is in private alpha.

CodeHTTPWhen
room_type_unknown400The request names a room type this project does not have.
invalid_request400The body, query or a header does not match the route's schema. detail names the field.
key_invalid401The key is unknown or malformed.
key_revoked401The key was revoked.
project_expired401A sandbox project is older than 72 hours.
token_invalid401The player token is malformed, signed for another project, or not a token.
token_expired401The player token is past its expiry.
project_disabled403The project's kill switch is on.
origin_not_allowed403The request's Origin is not in the project's list of allowed origins.
native_anonymous_disabled403A publishable key was used without an Origin (a native app or a server) and the project does not allow anonymous native play.
secret_key_in_browser403A secret key arrived with an Origin header: it was sent from a browser.
anonymous_disabled403The project turned anonymous play off.
room_locked403The host locked the room: it takes no new members. Seated members can still reconnect.
banned403This player was banned from the room.
not_reserved403The room was created for chosen players only, and this player is not one of them.
not_a_member403A seat renewal or a leave for a room this player is not in (or was removed from).
rooms_limit_reached403The project has as many rooms open at once as its plan allows. The answer carries quota.
ccu_limit_reached403The project has as many players online at once as its plan allows. The answer carries quota.
player_rooms_limit_reached403This player is already in 3 rooms. The answer carries quota.
capability_missing403The player token does not grant what this route needs (its can list).
room_not_found404No room has this id, or it closed and was deleted.
code_not_found404No open room has this code.
not_found404No route has this method and path.
method_not_allowed405The path exists, but not with this HTTP method.
room_full409The room has maxPlayers players, or it has seated 4 times maxPlayers members over its life.
idempotency_key_reused409The same Idempotency-Key came with a different body.
payload_too_large413The request body is larger than the route accepts.
unsupported_media_type415The body is not application/json.
rate_limited429A rate limit was hit. The answer carries retryAfterSec (also the Retry-After header) and scope, which names the limit.
internal_error500Something failed on LobbyLab's side.
realtime_capacity_limited503The server's pool of live rooms is full, or the Free and sandbox share of it is used up. The answer carries retryAfterSec.
sandbox_capacity_reached503All sandboxes together are at their ceiling. The answer carries retryAfterSec.

Socket rejections

A change sent over the socket that the room refuses comes back as a rejection with one of these codes. Clients treat any other code as a generic refusal.

CodeMeaning
forbidden_pathThe room type's write rules do not let this player write that path.
guard_failedA guard in the change did not hold: someone changed the value first. Read the new state and try again.
version_conflictifVersion did not match the room's version: the state moved on. Read it and try again.
too_largeThe change would take the state, the view or a player slot past its size limit.
rate_limitedThe player sent changes faster than the room allows. Send fewer (live rooms: use your player slot).
invalid_opAn operation is malformed (a bad path, inc on something that is not a number, and so on).
not_hostOnly the host can do this.
not_a_playerSpectators cannot change the state.
unknown_intentThe intent name is not one the room knows.

Removed from a room

A member's sockets close with code 4403 and one of these reasons.

ReasonMeaning
leftThe player left the room.
kickedThe host or the game's backend removed the player.
bannedThe player was removed and may not come back.
room_closedThe room closed.
origin_not_allowedThe socket's origin is not allowed for the project.
project_disabledThe project was turned off.

Build check problems

Problems the build check reports for a game package. Errors stop a game from being published; warnings do not.

Package files

CodeSeverityProblem
package.missing_directoryerrorThe package folder does not exist
package.missing_fileerrorA required package file is missing
package.not_a_fileerrorA package file is a folder or a link
package.file_too_largeerrorA package file is over its size limit
package.file_unreadableerrorA package file could not be read
package.unpublished_fileswarningclient/ has files that are not published
package.client_pendingwarningOnly client/index.html is missing

manifest.json

CodeSeverityProblem
manifest.invalid_jsonerrormanifest.json is not valid JSON
manifest.missing_fielderrormanifest.json is missing a required field
manifest.unknown_fielderrormanifest.json has an unknown field
manifest.player_rangeerrormaximumPlayers is below minimumPlayers
manifest.subscriptionserrorsubscriptions is missing a required event
manifest.bot_counterrorbotCount or botsSetting does not fit the player count
manifest.execution_settingserrorThe realtime or timer settings do not fit the execution profile
manifest.smoke_intentserrorsmokeIntents is empty or names a player who has not joined
manifest.smoke_inputserrorsmokeInputs names a missing player or does not fit the profile
manifest.smoke_payloaderrorA smoke payload is not small plain JSON
manifest.config_invaliderrorconfig is not small plain JSON
manifest.too_largeerrormanifest.json is over its size limit
manifest.invalid_valueerrorA manifest.json field has a value that is not allowed
manifest.no_smoke_inputswarningA realtime game has no smokeInputs
manifest.large_room_untestedwarningRooms over 8 players are not simulated

server.ts rules

CodeSeverityProblem
server.syntax_errorerrorserver.ts has a TypeScript syntax error
server.import.forbiddenerrorserver.ts imports something other than @playable/sim
server.import.named_onlyerror@playable/sim is imported without named imports
server.import.reexporterrorserver.ts re-exports from another module
server.import.dynamicerrorserver.ts uses import() or import.meta
server.import.requireerrorserver.ts uses require()
server.forbidden_api.evalerroreval() or Function() in the rulebook
server.forbidden_api.globalserrorprocess, globalThis, global, Bun or Deno in the rulebook
server.forbidden_api.networkerrorNetwork access in the rulebook
server.forbidden_api.timerserrorTimers in the rulebook
server.forbidden_api.dateerrorDate or performance in the rulebook
server.forbidden_api.randomerrorMath.random() in the rulebook
server.forbidden_api.reflectionerror.constructor, Reflect or Proxy in the rulebook
server.forbidden_api.consoleerrorconsole in the rulebook
server.rulebook_exporterrorserver.ts does not export rulebook
server.tick_missingerrorA realtime rulebook has no tick method
server.tick_unusedwarningtick is defined but the game is not realtime

Bundling server.ts

CodeSeverityProblem
bundle.missing_exporterrorAn imported name does not exist in @playable/sim
bundle.build_errorerrorserver.ts could not be bundled
bundle.failederrorBundling server.ts failed
bundle.too_largeerrorThe bundled server is over its size limit

client/index.html rules

CodeSeverityProblem
client.external_urlerrorThe client has an external URL
client.protocol_relative_urlerrorThe client has a protocol-relative URL
client.script_srcerrorThe client loads a script file other than the kit
client.legacy_runtime_conflicterrorThe client loads both the kit and the legacy 3D runtime
client.module_importerrorAn inline module script uses import or export
client.syntax_errorerrorAn inline script has a syntax error
client.kit_not_loadederrorPlayable.connect is called but the kit is not loaded
client.not_connectederrorThe client never connects to the platform
client.canvas2d_contexterrorA canvas2d game has no 2D canvas
client.webgl_renderererrorA webgl game has no 3D renderer
client.raw_webglerrorA raw WebGL client misses a required check
client.navigationerrorThe client reloads or navigates its own page
client.raw_three_rendererwarningThe client creates THREE.WebGLRenderer directly
client.no_send_inputwarningA realtime client never calls sendInput
client.legacy_bridgewarningA realtime client uses the legacy bridge
client.storagewarningThe client uses browser storage or cookies
client.parent_framewarningThe client touches the parent frame
client.networkwarningThe client opens its own network connection

client/assets

CodeSeverityProblem
assets.invalid_nameerrorAn asset name has characters that are not allowed
assets.linkerrorclient/assets contains a link
assets.too_deeperrorclient/assets is nested too deep
assets.unsupported_typeerrorAn asset has a file type that is not allowed
assets.budget_exceedederrorThe assets are over their count or size limits
assets.invalid_glberrorA .glb file is not valid binary glTF 2.0
assets.glb_external_resourceerrorA .glb file references external buffers or images
assets.directory_invaliderrorclient/assets is not a normal folder
assets.unreadableerrorclient/assets could not be read

The smoke run

CodeSeverityProblem
smoke.init_rejectederrorrulebook.init rejected the game setup
smoke.join_rejectederrorA join was rejected in the smoke run
smoke.start_rejectederrorThe start was rejected in the smoke run
smoke.intent_rejectederrorA smoke intent was rejected
smoke.invalid_stateerrorThe rulebook returned an invalid state
smoke.invalid_viewerrorrulebook.project returned an invalid view
smoke.invalid_eventerrorThe rulebook returned an invalid event
smoke.too_many_eventserrorOne transition returned too many events
smoke.threwerrorA rulebook method threw an error
smoke.missing_methoderrorThe rulebook is missing a method
smoke.not_jsonerrorA rulebook method returned something that is not plain JSON
smoke.output_too_largeerrorA rulebook method returned more data than its budget
smoke.random_budgeterrorA rulebook method drew too many random numbers
smoke.timeouterrorA rulebook method did not return in time
smoke.cpu_budgeterrorA rulebook method took longer than its CPU budget
smoke.worker_crashederrorA rulebook method crashed the rule worker
smoke.call_failederrorA rulebook method failed

Realtime conformance

CodeSeverityProblem
conformance.settingserrorThe realtime settings cannot be simulated
conformance.init_rejectederrorrulebook.init rejected session creation
conformance.init_failederrorrulebook.init failed in the simulated match
conformance.room_failederrorThe simulated room could not start
conformance.join_policyerrorNobody can join under this joinPolicy
conformance.join_rejectederrorA player could not join the simulated match
conformance.start_rejectederrorThe host could not start the simulated match
conformance.intent_rejectederrorA smoke intent was rejected in the simulated match
conformance.intent_ended_matcherrorA smoke intent ended the match before any tick
conformance.tick_threwerrorrulebook.tick threw an error
conformance.tick_timeouterrorrulebook.tick did not finish in time
conformance.tick_invalid_resulterrorrulebook.tick returned a result the platform cannot use
conformance.state_not_jsonerrorThe state is not plain JSON
conformance.state_too_largeerrorThe state is over its size limit
conformance.view_not_jsonerrorA view is not plain JSON
conformance.view_too_largeerrorA view is over its size limit
conformance.tick_too_slowerrorrulebook.tick is over the hard time limit
conformance.checkpoint_failederrorThe final state could not be stored
conformance.rule_errorerrorA rulebook method failed in the simulated match
conformance.crashederrorThe simulated match crashed
conformance.no_detailserrorThe simulated match failed without details
conformance.tick_over_budgetwarningrulebook.tick averages over its time budget
conformance.match_ended_earlywarningThe match ended itself in under 2 seconds
conformance.intent_skippedwarningA smoke intent was skipped in a smaller run

Performance budgets

CodeSeverityProblem
performance.tick_cpuwarningServer tick CPU is over budget
performance.bandwidthwarningBandwidth per player is over budget
performance.view_sizewarningViews are over budget
performance.state_sizewarningState is over budget
performance.server_bundlewarningThe server bundle is over budget
performance.client_pagewarningclient/index.html is over budget
performance.assetswarningThe assets are over budget
performance.pixel_ratiowarningThe client renders at the full device pixel ratio
performance.shadow_mapwarningA shadow map is over budget
performance.three_objectswarningThe client creates too many 3D objects
performance.adaptive_qualitywarningAdaptive quality is off
performance.budgetwarningA performance budget is missed

The platform

CodeSeverityProblem
platform.conformance_unavailableerrorRealtime games cannot be verified on this build
platform.check_failederrorThe check itself failed

Other problems

CodeSeverityProblem
check.unclassifiederrorA problem without a specific code