Your next chapter / Start building
Less wiring.
More play.
One app-facing API. The providers you need. Bring game services to your Dart CLI, Flutter game or custom engine.
Read the documentationThen add a provider package for each store you use.
A small API. A wide world.
Connect once.
Keep creating.
Register your providers, sign in and check capabilities before calling them. Writes fan out; reads default to your primary provider.
The core is pure Dart, with no Flutter dependency. Native providers have their own SDK and platform requirements.
Explore the API referenceQuickstart requires the Steam provider and its native SDK setup. App ID 480 is for Steam testing.
A place for every player.
Choose a provider. Check its supported capabilities and setup guide.
SteamSteamworks · Desktop FFI
unified_game_services_steamEpic GamesEpic Online Services · Desktop FFI
unified_game_services_epicGame CenterApple GameKit · macOS & iOS
unified_game_services_game_centerGameJoltREST · Cross-platform
unified_game_services_gamejoltPlayFabREST · Cross-platform
unified_game_services_playfabGoogle PlayNative Android & REST fallback
unified_game_services_google_playGoogle Play for FlutterFlutter adapter · Activity resolution
unified_game_services_google_play_flutterYour own backendShared contracts · Custom providers
unified_game_services_platform_interface
A few things before you go.
Do native providers need extra setup?
Yes. For Steam, run dart run unified_game_services_steam:setup and keep the Steam client running while testing. Native SDKs have their own licensing and distribution requirements. Follow each provider’s package guide.
What if a provider does not support a feature?
Use services.supports(...) before making a call. A capability unsupported by all providers throws CapabilityNotSupportedException. Partial write failures produce AggregateGameServiceException with individual failure details.
Can I use my own backend?
Yes. Implement a provider using the shared platform interface and declare its supported capabilities. Your game continues to use the same app-facing API.