Skip to content

Internal Protocols

Internal services use gRPC over mTLS with Protocol Buffers. Public clients must use REST or WebSocket; internal DNS names and schemas are not a supported external API.

Service contracts

Protobuf packages follow steamdeals.{domain}.v1. A service may add fields and RPCs in a minor release, but never reuse field numbers or change wire types. Generated clients set an explicit deadline and attach x-request-id, x-principal-id, and W3C trace context.

rpc GetGame(GetGameRequest) returns (GetGameResponse);
rpc ResolveStoreProduct(ResolveStoreProductRequest) returns (ResolveStoreProductResponse);

Internal events and message queue

The bus uses topics such as pricing.offer-changed.v1 and envelopes containing id, type, occurred_at, producer, schema_version, trace_id, and data. Consumers are at-least-once and must be idempotent. Contract Registry checks compatibility before a producer deploys.

{"id":"evt_01J4R8Z7V1","type":"pricing.offer-changed","schema_version":1,"occurred_at":"2026-11-06T09:42:18Z","producer":"pricing-service","data":{"offer_id":"offer_01J2STEAMHADES2US","game_id":"game_01J2M4T5K7HADES2","region":"US","version":948}}

Dead-letter topics retain unrecoverable payloads and failure metadata for 30 days. Replay starts from a bounded offset in a non-production consumer group.