Skip to main content
Glama
debug-leumi-request.cjsβ€’10.1 kB
#!/usr/bin/env node /** * Debug script to show the exact API request being sent for Bank Leumi costs * This will display all headers, parameters, and the full request URL */ const axios = require('axios'); const https = require('https'); // Create axios instance with request/response interceptors to log everything const axiosInstance = axios.create({ httpsAgent: new https.Agent({ rejectUnauthorized: true }) }); // Request interceptor to log full request details axiosInstance.interceptors.request.use(request => { console.log('\n══════════════════════════════════════════════════════════════'); console.log('πŸ“€ OUTGOING API REQUEST'); console.log('══════════════════════════════════════════════════════════════\n'); console.log('πŸ”— URL:', request.url); console.log('πŸ“‹ Method:', request.method.toUpperCase()); console.log('\nπŸ“¦ QUERY PARAMETERS:'); if (request.params) { Object.entries(request.params).forEach(([key, value]) => { console.log(` ${key}: ${value}`); }); } else { console.log(' (none)'); } console.log('\nπŸ”‘ HEADERS:'); Object.entries(request.headers).forEach(([key, value]) => { if (key.toLowerCase() === 'authorization') { // Truncate JWT token for readability const truncated = value.substring(0, 50) + '...' + value.substring(value.length - 20); console.log(` ${key}: ${truncated}`); } else { console.log(` ${key}: ${value}`); } }); if (request.data) { console.log('\nπŸ“ REQUEST BODY:'); console.log(JSON.stringify(request.data, null, 2)); } console.log('\n══════════════════════════════════════════════════════════════\n'); return request; }); // Response interceptor to log response details axiosInstance.interceptors.response.use( response => { console.log('\n══════════════════════════════════════════════════════════════'); console.log('πŸ“₯ API RESPONSE'); console.log('══════════════════════════════════════════════════════════════\n'); console.log('βœ… Status:', response.status, response.statusText); console.log('πŸ“‹ Headers:', Object.keys(response.headers).join(', ')); if (response.data) { const dataStr = JSON.stringify(response.data); if (dataStr.length > 500) { console.log('πŸ“Š Data: Large response -', dataStr.length, 'characters'); // Show summary if it's cost data if (response.data.data && Array.isArray(response.data.data)) { console.log(` Rows returned: ${response.data.data.length}`); if (response.data.data.length > 0) { const sample = response.data.data[0]; console.log(' Sample row:', JSON.stringify(sample, null, 2).substring(0, 200) + '...'); } } } else { console.log('πŸ“Š Data:', JSON.stringify(response.data, null, 2)); } } console.log('\n══════════════════════════════════════════════════════════════\n'); return response; }, error => { console.log('\n══════════════════════════════════════════════════════════════'); console.log('❌ API ERROR'); console.log('══════════════════════════════════════════════════════════════\n'); if (error.response) { console.log('Status:', error.response.status, error.response.statusText); console.log('Error Data:', JSON.stringify(error.response.data, null, 2)); } else { console.log('Error:', error.message); } console.log('\n══════════════════════════════════════════════════════════════\n'); throw error; } ); async function debugBankLeumiRequest() { console.log('πŸ” BANK LEUMI COST REQUEST DEBUGGER\n'); console.log('=====================================\n'); const username = 'david+allcloud@umbrellacost.com'; const password = 'B4*zcI7#F7poEC'; try { // Step 1: Authenticate console.log('STEP 1: Authenticating...\n'); const authResponse = await axiosInstance.post('https://api.umbrellacost.io/api/v1/users/signin', { username: username, password: password }); const token = authResponse.data.jwtToken; const userKey = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString()).sub; console.log('βœ… Authentication successful'); console.log(' User Key:', userKey, '\n'); // Step 2: Get Bank Leumi division info console.log('STEP 2: Getting Bank Leumi divisions...\n'); const tempApiKey = `${userKey}:15808:0`; const divisionsResponse = await axiosInstance.get('https://api.umbrellacost.io/api/v1/users/plain-sub-users', { headers: { 'Authorization': token, 'apikey': tempApiKey } }); // Extract Bank Leumi divisions const leumiDivisions = divisionsResponse.data.customerDivisions['Bank Leumi']; console.log(`\nβœ… Found ${leumiDivisions.length} Bank Leumi divisions:\n`); leumiDivisions.forEach((div, i) => { console.log(`Division ${i + 1}:`); console.log(` Account Name: ${div.accountName}`); console.log(` Account ID: ${div.accountId}`); console.log(` Account Key: ${div.accountKey}`); console.log(` Division ID: ${div.divisionId}`); console.log(` Cloud Type: ${div.cloudTypeId === 0 ? 'AWS' : 'Azure'}\n`); }); // Step 3: Make cost request for each division console.log('STEP 3: Making cost requests for Bank Leumi...\n'); for (const division of leumiDivisions) { console.log(`\n🏦 Testing ${division.accountName} (Division ID: ${division.divisionId})`); console.log('─────────────────────────────────────────────────────────\n'); const apiKey = `${userKey}:${division.accountKey}:${division.divisionId}`; console.log('πŸ“Œ API Key Components:'); console.log(` User Key: ${userKey}`); console.log(` Account Key: ${division.accountKey}`); console.log(` Division ID: ${division.divisionId}`); console.log(` Full API Key: ${apiKey}\n`); // Try different parameter combinations const testCases = [ { name: 'Test 1: With startDate/endDate (UI format)', params: { startDate: '2024-12-01', endDate: '2024-12-31', costType: 'net_amortized', isPpApplied: false } }, { name: 'Test 2: With from/to parameters', params: { from: '2024-12-01', to: '2024-12-31', costType: 'net_amortized', isPpApplied: false } }, { name: 'Test 3: Without isPpApplied in params', params: { startDate: '2024-12-01', endDate: '2024-12-31', costType: 'net_amortized' } }, { name: 'Test 4: With groupBy parameter', params: { startDate: '2024-12-01', endDate: '2024-12-31', costType: 'net_amortized', groupBy: 'day', isPpApplied: false } } ]; for (const test of testCases) { console.log(`\nπŸ§ͺ ${test.name}`); console.log('Parameters:', JSON.stringify(test.params, null, 2)); try { const response = await axiosInstance.get('https://api.umbrellacost.io/api/v1/invoices/caui', { params: test.params, headers: { 'Authorization': token, 'apikey': apiKey, 'commonParams': JSON.stringify({ isPpApplied: false }), 'Content-Type': 'application/json', 'Accept': 'application/json' } }); if (response.data?.data?.length > 0) { console.log(`βœ… SUCCESS! Found ${response.data.data.length} rows`); // Show first row as example const firstRow = response.data.data[0]; console.log('First row sample:', { date: firstRow.date || firstRow.Date, cost: firstRow.cost || firstRow.Cost, service: firstRow.service_name || firstRow.ServiceName, customer: firstRow.customer_name || firstRow.customerName }); break; // Stop testing if we found data } else { console.log('⚠️ No data returned'); } } catch (error) { console.log(`❌ Request failed: ${error.response?.data?.message || error.message}`); } } } console.log('\n====================================='); console.log('Debug session complete'); console.log('=====================================\n'); } catch (error) { console.error('Fatal error:', error.message); } } // Run the debug session debugBankLeumiRequest();

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/daviddraiumbrella/invoice-monitoring'

If you have feedback or need assistance with the MCP directory API, please join our Discord server