{"record":{"id":"a38015baea7098bf","repo":"XX-net/XX-Net","slug":"x-server-error-no-quota","errorCode":null,"errorMessage":"x_server error:no quota","messagePattern":"x_server error:no quota","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"code/default/x_tunnel/local/proxy_session.py","lineNumber":989,"sourceCode":"\n            try:\n                content = decrypt_data(content)\n                payload = base_container.ReadBuffer(content)\n\n                magic, version, pack_type = struct.unpack(\"<cBB\", payload.get(3))\n                if magic != b\"P\" or version != g.protocol_version or pack_type not in [2, 3]:\n                    xlog.warn(\"get data head:%s\", utils.str2hex(content[:2]))\n                    data_info[\"stat\"] = \"timeout\"\n                    time.sleep(sleep_time)\n                    continue\n\n                if pack_type == 3:  # error report\n                    error_code, message_len = struct.unpack(\"<BH\", payload.get(3))\n                    message = payload.get(message_len)\n                    # xlog.warn(\"report code:%d, msg:%s\", error_code, message)\n                    if error_code == 1:\n                        # no quota\n                        xlog.warn(\"x_server error:no quota\")\n                        self.stop()\n                        return\n                    elif error_code == 2:\n                        # unpack error\n                        xlog.warn(\"roundtrip time:%f transfer_no:%d send:%d recv:%d unpack_error:%s\",\n                                  roundtrip_time, transfer_no, send_data_len, len(content), message)\n                        data_info[\"stat\"] = \"timeout\"\n                        continue\n                    elif error_code == 3:\n                        # session not exist\n                        if self.session_id == request_session_id:\n                            xlog.warn(\"server session_id:%s not exist, reset session.\", request_session_id)\n                            self.reset()\n                        return\n                    else:\n                        xlog.error(\"unknown error code:%d, message:%s\", error_code, message)\n                        time.sleep(sleep_time)\n                        continue","sourceCodeStart":971,"sourceCodeEnd":1007,"githubUrl":"https://github.com/XX-net/XX-Net/blob/cfa5bc17b67676e467f37ec50766127e0ab5f0aa/code/default/x_tunnel/local/proxy_session.py#L971-L1007","documentation":"The x-tunnel server sent an error-report packet (pack_type 3) with error_code 1, meaning the account has no remaining quota/traffic. The client stops the whole session (self.stop()) and the roundtrip task returns.","triggerScenarios":"Any roundtrip response containing error_code==1: account traffic exhausted, plan expired, or server-side quota miscounting.","commonSituations":"Free quota used up, subscription expired mid-session, or billing sync delay on the server.","solutions":["Check account balance/traffic via the dashboard or request_balance API","Top up or switch account, then restart the tunnel","If quota was recently purchased, wait for server sync or contact provider","Verify you're not sharing one account across too many clients"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"ok, info = session.call_api('/api/balance')\nif ok and info.get('data', {}).get('balance', 0) <= 0:\n    # avoid starting traffic that will be cut off\n    pass","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Monitor balance/quota before heavy transfers","Handle session stop callbacks to notify the user of quota exhaustion","Keep a second account configured for failover"],"tags":["x-tunnel","quota","billing","session"],"backgroundTag":"api-quota-exceeded","analyzedSha":"cfa5bc17b67676e467f37ec50766127e0ab5f0aa","analyzedAt":"2026-08-27T19:28:28.225Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}