Quick answer: Steam filters lobby searches by region by default, so set the distance filter to Worldwide while testing. On App ID 480, tag your lobbies with a key and filter on it. Only public, joinable lobbies are listed, filters reset after every request, and results only arrive if you run callbacks. Test with two different Steam accounts.

You create a lobby on one machine, search on another, and LobbyMatchList_t reports zero results. Steam's lobby system works, but its defaults and the realities of testing on Spacewar's shared app ID hide your lobby in several different ways.

Cause 1: the default distance filter

Lobby searches only return lobbies from nearby regions unless you say otherwise. Two testers in different countries (or a tester and a developer on different continents) will not see each other. For testing, and for small games that need every player they can get, search worldwide:

SteamMatchmaking()->AddRequestLobbyListDistanceFilter(k_ELobbyDistanceFilterWorldwide);

Cause 2: App ID 480 is full of other developers’ lobbies

Thousands of developers test with Spacewar (480). Your search returns other people's lobbies, and the result count limit means yours may not be among them. Set a key on your lobby when you create it, filter on it when you search, and raise the result count:

// Host, in the LobbyCreated_t callback
SteamMatchmaking()->SetLobbyData(lobbyId, "game", "mygame-v12");

// Client
SteamMatchmaking()->AddRequestLobbyListStringFilter("game", "mygame-v12", k_ELobbyComparisonEqual);
SteamMatchmaking()->AddRequestLobbyListDistanceFilter(k_ELobbyDistanceFilterWorldwide);
SteamMatchmaking()->AddRequestLobbyListResultCountFilter(50);
SteamAPICall_t call = SteamMatchmaking()->RequestLobbyList();
m_LobbyMatchList.Set(call, this, &Lobbies::OnLobbyMatchList);

Putting the build version in the value also keeps players on incompatible builds apart. Once you have your own app ID, keep the filter anyway; it costs nothing.

Cause 3: the lobby is not public or joinable

Cause 4: filters reset after each request

Every AddRequestLobbyList... filter applies to the next RequestLobbyList call only. Code that adds filters once at startup and refreshes the list later searches with no filters at all on refresh (and on 480, gets everyone else's lobbies). Add filters immediately before every request.

Cause 5: callbacks are not running

Lobby creation and search results arrive through call results. Without SteamAPI_RunCallbacks() each frame (or your engine wrapper's equivalent), the host's LobbyCreated_t never fires, so SetLobbyData never runs, and the client's search result never arrives.

Engine wrappers

The same rules apply through every wrapper:

Test with two accounts

Use two machines with different Steam accounts. A single account cannot meaningfully join its own lobby, and running two copies on one PC shares one account.

Matchmaking problems after launch

“No lobbies found” from real players is often a region or version split you cannot see from your desk. Bugnet's SDKs for Unity, Godot and Unreal file errors automatically with the player's OS, hardware and recent log lines, and pull your Steam reviews into the same dashboard, and players can report from an in-game form with whatever lobby state you attach as metadata.

Frequently asked questions

Why does RequestLobbyList return no lobbies?

The default distance filter hides lobbies from other regions, other developers’ lobbies crowd yours out on App ID 480, the lobby is not public or joinable, filters were not re-added before the request, or callbacks are not running.

How do I search Steam lobbies worldwide?

Call AddRequestLobbyListDistanceFilter with k_ELobbyDistanceFilterWorldwide before every RequestLobbyList call.

How do I find my own lobbies when testing with App ID 480?

Set a lobby data key such as game=mygame when creating the lobby, and add a matching string filter before each search.

Worldwide distance, your own key, filters before every request. Then test with two accounts.