{"record":{"id":"20745cd11b07d7ec","repo":"JustArchiNET/ArchiSteamFarm","slug":"classid-is-null","errorCode":null,"errorMessage":"classid is null!","messagePattern":"classid is null!","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"warning","filePath":"ArchiSteamFarm/Steam/Integration/ArchiHandler.cs","lineNumber":300,"sourceCode":"\t\t\t\t\tthrow new InvalidOperationException(nameof(response.Body.descriptions));\n\t\t\t\t}\n\n\t\t\t\tif (response.Body.total_inventory_count > Array.MaxLength) {\n\t\t\t\t\tthrow new InvalidOperationException(nameof(response.Body.total_inventory_count));\n\t\t\t\t}\n\n\t\t\t\tassetIDs ??= [with((int) response.Body.total_inventory_count)];\n\n\t\t\t\tif (descriptions == null) {\n\t\t\t\t\tdescriptions = new Dictionary<(ulong ClassID, ulong InstanceID), InventoryDescription>();\n\t\t\t\t} else {\n\t\t\t\t\t// We don't need descriptions from the previous request\n\t\t\t\t\tdescriptions.Clear();\n\t\t\t\t}\n\n\t\t\t\tforeach (CEconItem_Description? description in response.Body.descriptions) {\n\t\t\t\t\tif (description.classid == 0) {\n\t\t\t\t\t\tthrow new NotSupportedException(Strings.FormatErrorObjectIsNull(nameof(description.classid)));\n\t\t\t\t\t}\n\n\t\t\t\t\t(ulong ClassID, ulong InstanceID) key = (description.classid, description.instanceid);\n\n\t\t\t\t\tif (descriptions.ContainsKey(key)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tdescriptions.Add(key, new InventoryDescription(description));\n\t\t\t\t}\n\n\t\t\t\tforeach (CEcon_Asset? asset in response.Body.assets.Where(asset => assetIDs.Add(asset.assetid))) {\n\t\t\t\t\tInventoryDescription? description = descriptions.GetValueOrDefault((asset.classid, asset.instanceid));\n\n\t\t\t\t\t// Extra bulletproofing against Steam showing us middle finger\n\t\t\t\t\tif ((tradableOnly && (description?.Tradable != true)) || (marketableOnly && (description?.Marketable != true))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}","sourceCodeStart":282,"sourceCodeEnd":318,"githubUrl":"https://github.com/JustArchiNET/ArchiSteamFarm/blob/fe57c4129f4ce02d452318cabc525eb49a087255/ArchiSteamFarm/Steam/Integration/ArchiHandler.cs#L282-L318","documentation":"While processing each CEconItem_Description in the inventory response, ASF requires description.classid to be non-zero. A zero classid means Steam sent a description without an identifying class id, which breaks description deduplication and asset matching; ASF throws a NotSupportedException ('classid is null!'). This guards data integrity rather than connectivity.","triggerScenarios":"Steam's inventory payload contains a description entry with classid == 0 (absent/unset), so the (ClassID, InstanceID) key would collide or be unmatchable to assets.","commonSituations":"Steam returns a malformed/partial description entry during GC instability; a brand-new item type Steam has not fully populated; corrupted response under heavy load.","solutions":["Retry the inventory request; transient malformed entries usually resolve.","Reduce itemsCountPerRequest to lower the chance of a truncated/partial page.","Report the occurrence with the app/context if it persists, as it indicates a Steam-side data defect.","Handle NotSupportedException in the caller and fall back to the HTTP inventory path (ArchiWebHandler.GetInventoryAsync)."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// Lower page size to reduce malformed-description probability.\nushort pageSize = Math.Min(itemsCountPerRequest, (ushort) 2000);","typeGuard":null,"tryCatchPattern":"try { await foreach (var a in handler.GetMyInventoryAsync(itemsCountPerRequest: 2000)) { /* ... */ } }\ncatch (NotSupportedException ex) when (ex.Message.Contains(\"classid\")) {\n    // fall back to ArchiWebHandler.GetInventoryAsync HTTP path\n}","preventionTips":["Use a smaller itemsCountPerRequest to reduce partial pages.","Fall back to the HTTP inventory path on GC data defects.","Report persistent malformed descriptions upstream."],"tags":["steam","inventory","data-integrity","gamecoordinator"],"backgroundTag":null,"analyzedSha":"fe57c4129f4ce02d452318cabc525eb49a087255","analyzedAt":"2026-08-13T17:26:20.146Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}