fkrzski/laravel-steam-api-sdk
Laravel SDK for the Steam Web API, giving you a clean, configurable PHP interface to fetch player profiles, owned games, achievements, stats, and news with expressive fluent methods and sensible defaults.
RespectsSteamRateLimit releases a job until the budget resets), a fluent fake for tests, and a pluggable HTTP sender. Adopting is defensible on those three or four capabilities alone; writing them in-house is a multi-sprint detour off the roadmap.steam-api.rate_limit.limits with ['allow' => …, 'every' => …, 'sleep' => …], every accepting seconds or 'day'. That turns "how many Steam calls can feature X afford per user" from a fixed constraint into a tunable, per-environment product decision — strict in production, [] (unmetered) locally so dev work never trips a counter.UnexpectedValueException and failed the entire call. Any feature that renders a list of Steam users was one private account away from a broken page. That class of defect is now gone, and PlayerSummaryFactory::friendsOnly() makes it a first-class test case.WebApiInterfaceFactory, WebApiMethodFactory, WebApiParameterFactory, plus SteamResponse::serverInfo(), supportedApiList(), and supportedApiListInvalidKey() on the fluent fake under ->webApi(). This is the argument for not standing up a cassette/VCR layer: failure modes like an invalid key are now one line in a feature test.steam-api.http.sender names a Saloon Sender the container builds on each connector resolution, so a binding decides how requests actually leave. Proxy routing, retry policy, and custom middleware become configuration rather than a fork — an input to any "do we need an egress gateway" conversation.php artisan about gains "429 Cool-down," "Sender," and a "Requests Remaining" row enumerating every local limit. First-line support can read quota state without a debugger, which reduces escalations to engineering.supportedApis() reports what your configured key can actually call. Before promising a feature that needs a permission you don't have, this is a five-minute audit rather than a mid-sprint discovery.Adopt when:
Go in with eyes open:
Steam::groups($id) → Steam::users()->groups($id)), sender() no longer a GuzzleSender (so addMiddleware() and getHandlerStack() are gone), an exception renamed, and an about --json key renamed. The migration is mechanical but not free; budget upgrade time per minor and pin the version.http.sender, rate_limit.limits, and rate_limit.cooldown — STEAM_API_SENDER and STEAM_API_RATE_LIMIT_COOLDOWN go unread until the keys are copied in. Make config republishing an explicit upgrade step, not an assumption.100000_every_utc_midnight, so a counter held in a persistent rate-limit store restarts from zero once. Deploy with that in mind so you don't combine it with a backfill and produce a burst.Look elsewhere when:
steam-api.rate_limit is your guardrail, not a mirror of Valve's enforcement.For executives: This is the plumbing under every Steam-facing feature on the roadmap — profiles, achievements, player counts, news. Adopting it removes a build item from the critical path and puts a configurable ceiling on third-party spend and failure blast radius, with Steam's traffic now visible in our existing observability stack and API keys scrubbed from what it records. The cost is upgrade churn: the library is pre-1.0 and this release alone carries four breaking changes, so treat each bump as a small scheduled task (roughly a focused half-day for the endpoint migration) rather than a free upgrade. Net: faster delivery on Steam features, contained third-party risk, a known and modest maintenance tax.
For engineering: The 0.9.0 upgrade is mechanical — facade endpoint helpers move onto their resources with identical names, arguments, and return types, so it's a find-and-replace guided by the API reference. Three things are worth actually designing around: middleware moves off sender() onto a GuzzleSender subclass bound in the container and named via STEAM_API_SENDER; rate limiting becomes configuration (limits and cooldown) rather than a fixed 100k/day, which means you choose the policy per environment; and published configs from earlier versions won't pick up the new keys, so republish or hand-merge. Two changes reduce work downstream: the fakes now cover ISteamWebAPIUtil and friends-only summaries, so failure-path tests stop needing hand-rolled HTTP stubbing, and Nightwatch traces Steam calls automatically with keys redacted — no instrumentation to write. Also note the daily-limit rename resets any persistent counter to zero once, so don't pair the deploy with a bulk job.
How can I help you explore Laravel packages today?