Loading documentation…
Loading documentation…
Handle validation, authentication, privacy, rate-limit, and upstream outcomes.
Use the documented status and error code together. Live Page, Current, Refresh, and Refresh status belong to the same Inventory product, but an outcome has workflow-specific meaning. The generated Current responses and generated Refresh responses are canonical for their public schemas.
Do not retry validation, authentication, or privacy outcomes unchanged. Retry only documented transient failures with bounded exponential backoff and jitter.
Retain X-Request-ID with your safe application logs. Support can use it to investigate a request; never send an API key or Steam credential to support.
An inventory privacy outcome is not an empty successful inventory. A transient upstream outcome is not proof of privacy. Keep the structured outcome alongside any last successful snapshot and let product behavior decide whether labelled stale data may be shown.
An empty inventory is a successful observation. It has no assets and is safe to distinguish from an error:
{
"success": true,
"data": {
"assets": [],
"descriptions": [],
"total_count": 0,
"pagination": { "has_more": false }
}
}Steam confirmed that the inventory is not publicly readable. Do not retry unchanged and do not replace a previous snapshot with an empty one:
{
"success": false,
"error": {
"code": "inventory_private",
"message": "Inventory is private",
"request_id": "req_example_403"
}
}This is a transient provider failure, not evidence about the user's privacy or inventory contents:
{
"success": false,
"error": {
"code": "upstream_unavailable",
"message": "Steam is temporarily unavailable",
"request_id": "req_example_502"
}
}Steam returned an authoritative not-found result for the requested user, game, or context. This is different from a private inventory, an empty successful inventory, and a Current cold state. Check the identifiers before retrying unchanged:
{
"success": false,
"error": {
"code": "not_found",
"message": "Steam data was not found",
"request_id": "req_example_live_404"
}
}This is a cold state, not an empty inventory and not a Steam failure. Current does not enqueue hidden work and charges zero credits:
{
"success": false,
"error": {
"code": "inventory_revision_not_found",
"message": "No committed inventory revision is available",
"request_id": "req_example_current_404"
}
}Request Refresh, check status using the returned refresh ID, and retry Current after successful completion.
The maximum you authorize must cover the required credit reservation. A lower maximum is rejected before work starts or credits are reserved:
{
"success": false,
"error": {
"code": "refresh_maximum_too_low",
"message": "The authorized refresh maximum is too low",
"request_id": "req_example_refresh_422",
"detail": { "required": 125 }
}
}The same Idempotency-Key was already used with different refresh inputs. Keep the original inputs when retrying an uncertain submission; create a new key only for a new refresh request.
product_unavailable with detail.admission_state=closed means SteamCall rejected a new Complete
Refresh before reserving credits. Honor Retry-After and retry the same request with its original
idempotency key and bounded jitter. Status and Current reads for existing work remain available.
Do not create a loop of new idempotency keys.
Centralize this classification so background refreshes and interactive requests behave consistently. Continue with Handle private inventories and Errors.