One API. More possibilities.

One game.
Every world.

Achievements, stats and social, connected across stores. Pure Dart. Your game, without boundaries.

Dart & Flutter / Native & REST

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 documentation

Then 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 reference
import 'package:unified_game_services/unified_game_services.dart';
import 'package:unified_game_services_steam/unified_game_services_steam.dart';
Future<void> main() async {
final services = UnifiedGameServices(providers: [
SteamProvider(appId: 480),
]);
await services.signIn();
if (services.supports(GameCapability.achievements)) {
await services.unlockAchievement('first_win');
}
}

Quickstart requires the Steam provider and its native SDK setup. App ID 480 is for Steam testing.

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.