{"record":{"id":"c7e8f4cd8174f653","repo":"musistudio/claude-code-router","slug":"account-endpoint-returned-a-non-object-payload","errorCode":null,"errorMessage":"Account endpoint returned a non-object payload.","messagePattern":"Account endpoint returned a non-object payload\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/core/src/providers/account-service.ts","lineNumber":950,"sourceCode":"    credentialLabel: credential?.name ?? credential?.label ?? credential?.id,\n    errors: errors.length > 0 ? errors : undefined,\n    message,\n    meters,\n    nextRefreshAt: new Date(now.getTime() + refreshIntervalMs).toISOString(),\n    provider,\n    source,\n    status,\n    updatedAt: now.toISOString()\n  };\n}\n\nfunction normalizeRemoteSnapshot(\n  provider: string,\n  payload: unknown,\n  source: ProviderAccountConnectorSource\n): ProviderAccountSnapshot {\n  if (!isRecord(payload)) {\n    throw new Error(\"Account endpoint returned a non-object payload.\");\n  }\n  const meters = Array.isArray(payload.meters)\n    ? payload.meters.map((meter) => normalizeMeter(meter, source)).filter((meter): meter is ProviderAccountMeter => Boolean(meter))\n    : [];\n  return {\n    errors: normalizeRemoteErrors(payload.errors, source),\n    message: readString(payload.message),\n    meters,\n    nextRefreshAt: readString(payload.nextRefreshAt),\n    provider: readString(payload.provider) || provider,\n    source,\n    status: normalizeStatus(readString(payload.status)) ?? statusFromMeters(meters, [], 1),\n    updatedAt: readString(payload.updatedAt) || new Date().toISOString()\n  };\n}\n\nfunction grokSubscriptionMeters(payload: unknown, source: ProviderAccountConnectorSource = \"http-json\"): ProviderAccountMeter[] {\n  const allowAccess = grokSubscriptionBoolean(payload, [","sourceCodeStart":932,"sourceCodeEnd":968,"githubUrl":"https://github.com/musistudio/claude-code-router/blob/99f24806c6a2c660b16e53e95211c517448a6c90/packages/core/src/providers/account-service.ts#L932-L968","documentation":"normalizeRemoteSnapshot validates that the account endpoint payload is a JSON object (isRecord). When the remote account endpoint returns a JSON array, string, number, or null, this error is thrown instead of processing meters/errors.","triggerScenarios":"Any provider account snapshot fetch whose HTTP JSON body parses to a non-object (e.g. an array of meters, or a plain string).","commonSituations":"Provider changed its account/status API shape; misconfigured endpoint URL pointing to a list resource; proxy or captive portal returning unexpected JSON.","solutions":["Check the actual response body from the configured account endpoint","Fix the connector endpoint to point at the object-shaped account status resource","If the provider API changed, update the connector/manifest mapping"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"const isRecord = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v);","tryCatchPattern":"catch (e) { if (e.message.includes('non-object payload')) logRawBodyAndEndpoint(); else throw e; }","preventionTips":["Monitor provider API changelogs","Log raw account endpoint responses during integration"],"tags":["api-response","validation","provider"],"backgroundTag":"unexpected-response-shape","analyzedSha":"99f24806c6a2c660b16e53e95211c517448a6c90","analyzedAt":"2026-08-27T04:11:01.184Z","schemaVersion":2},"datasetVersion":"2026-08-27T08:17:20.692Z"}