{"id":25393855,"url":"https://github.com/sameerkali/balkan_tech_solutions_assignment_backend","last_synced_at":"2026-01-22T01:34:03.276Z","repository":{"id":277721808,"uuid":"933301343","full_name":"sameerkali/Balkan_Tech_Solutions_Assignment_backend","owner":"sameerkali","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-16T08:21:51.000Z","size":41,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-10T05:51:20.337Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://balkan-tech-solutions-assignment-backend.vercel.app","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sameerkali.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-15T16:26:26.000Z","updated_at":"2025-02-16T08:21:55.000Z","dependencies_parsed_at":null,"dependency_job_id":"e0ec31d6-b9a9-403d-a5ab-9e489af6c801","html_url":"https://github.com/sameerkali/Balkan_Tech_Solutions_Assignment_backend","commit_stats":null,"previous_names":["sameerkali/balkan_tech_solutions_assignment_backend"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sameerkali/Balkan_Tech_Solutions_Assignment_backend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sameerkali%2FBalkan_Tech_Solutions_Assignment_backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sameerkali%2FBalkan_Tech_Solutions_Assignment_backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sameerkali%2FBalkan_Tech_Solutions_Assignment_backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sameerkali%2FBalkan_Tech_Solutions_Assignment_backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sameerkali","download_url":"https://codeload.github.com/sameerkali/Balkan_Tech_Solutions_Assignment_backend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sameerkali%2FBalkan_Tech_Solutions_Assignment_backend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28649464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T01:17:37.254Z","status":"ssl_error","status_checked_at":"2026-01-22T01:17:35.564Z","response_time":86,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-15T18:53:57.412Z","updated_at":"2026-01-22T01:34:03.263Z","avatar_url":"https://github.com/sameerkali.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Crypto Market Tracker API Documentation\n\n## Overview\nThis API provides real-time and historical cryptocurrency market data from Binance. It supports both REST APIs for historical data and WebSocket connections for real-time trade updates.\n\n## Base URL\n```\nhttp://localhost:6969/api\n```\n\n## REST API Endpoints\n\n### 1. Get Spot Market OHLCV Data\n```http\nGET /spot\n```\n\n#### Query Parameters\n| Parameter | Type   | Required | Description                                    | Example  |\n|-----------|--------|----------|------------------------------------------------|----------|\n| symbol    | string | Yes      | Trading pair symbol                           | BTCUSDT  |\n| interval  | string | Yes      | Candlestick interval                          | 1m       |\n| limit     | number | No       | Number of candlesticks (default: 100, max: 1000) | 100    |\n\n#### Supported Intervals\n- 1m (1 minute)\n- 5m (5 minutes)\n- 15m (15 minutes)\n- 1h (1 hour)\n- 4h (4 hours)\n- 1d (1 day)\n\n#### Sample Request\n```javascript\nconst response = await fetch('http://localhost:6969/api/spot?symbol=BTCUSDT\u0026interval=1m\u0026limit=100');\nconst data = await response.json();\n```\n\n#### Sample Response\n```json\n[\n  {\n    \"timestamp\": \"2024-02-15T10:00:00.000Z\",\n    \"open\": 52145.23,\n    \"high\": 52198.45,\n    \"low\": 52100.12,\n    \"close\": 52180.67,\n    \"volume\": 123.45\n  },\n  // ... more candles\n]\n```\n\n### 2. Get Futures Market OHLCV Data\n```http\nGET /futures\n```\n(Same parameters and response format as spot endpoint)\n\n## WebSocket Integration\n\n### Connection\nThe WebSocket server uses Socket.IO for real-time updates.\n\n```javascript\nimport { io } from 'socket.io-client';\n\nconst socket = io('http://localhost:6969');\n```\n\n### Subscribe to Market Updates\n```javascript\n// Subscribe to spot market\nsocket.emit('subscribe', {\n  market: 'spot',\n  symbol: 'BTCUSDT'\n});\n\n// Subscribe to futures market\nsocket.emit('subscribe', {\n  market: 'futures',\n  symbol: 'BTCUSDT'\n});\n```\n\n### Receive Trade Updates\n```javascript\nsocket.on('trade', (data) =\u003e {\n  console.log(data);\n});\n```\n\n#### Sample Trade Update\n```json\n{\n  \"symbol\": \"BTCUSDT\",\n  \"price\": 52180.67,\n  \"quantity\": 0.12345,\n  \"timestamp\": \"2024-02-15T10:00:00.123Z\"\n}\n```\n\n### Unsubscribe from Updates\n```javascript\nsocket.emit('unsubscribe', {\n  market: 'spot',\n  symbol: 'BTCUSDT'\n});\n```\n\n## React Implementation Example\n\n### 1. Market Data Hook\n```javascript\n// hooks/useMarketData.js\nimport { useState, useEffect } from 'react';\n\nexport const useMarketData = (symbol, interval = '1m') =\u003e {\n  const [data, setData] = useState([]);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState(null);\n\n  useEffect(() =\u003e {\n    const fetchData = async () =\u003e {\n      try {\n        setLoading(true);\n        const response = await fetch(\n          `http://localhost:6969/api/spot?symbol=${symbol}\u0026interval=${interval}`\n        );\n        const jsonData = await response.json();\n        setData(jsonData);\n      } catch (err) {\n        setError(err.message);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    fetchData();\n  }, [symbol, interval]);\n\n  return { data, loading, error };\n};\n```\n\n### 2. WebSocket Hook\n```javascript\n// hooks/useTradeStream.js\nimport { useState, useEffect } from 'react';\nimport { io } from 'socket.io-client';\n\nexport const useTradeStream = (market, symbol) =\u003e {\n  const [trades, setTrades] = useState([]);\n  const [connected, setConnected] = useState(false);\n\n  useEffect(() =\u003e {\n    const socket = io('http://localhost:6969');\n\n    socket.on('connect', () =\u003e {\n      setConnected(true);\n      socket.emit('subscribe', { market, symbol });\n    });\n\n    socket.on('trade', (trade) =\u003e {\n      setTrades((prevTrades) =\u003e [trade, ...prevTrades].slice(0, 100));\n    });\n\n    socket.on('disconnect', () =\u003e {\n      setConnected(false);\n    });\n\n    return () =\u003e {\n      socket.emit('unsubscribe', { market, symbol });\n      socket.disconnect();\n    };\n  }, [market, symbol]);\n\n  return { trades, connected };\n};\n```\n\n### 3. Market Data Component\n```javascript\n// components/MarketChart.js\nimport React from 'react';\nimport { useMarketData } from '../hooks/useMarketData';\nimport { useTradeStream } from '../hooks/useTradeStream';\n\nconst MarketChart = ({ symbol, interval }) =\u003e {\n  const { data, loading, error } = useMarketData(symbol, interval);\n  const { trades, connected } = useTradeStream('spot', symbol);\n\n  if (loading) return \u003cdiv\u003eLoading...\u003c/div\u003e;\n  if (error) return \u003cdiv\u003eError: {error}\u003c/div\u003e;\n\n  return (\n    \u003cdiv\u003e\n      \u003ch2\u003e{symbol} Market Data\u003c/h2\u003e\n      \u003cdiv\u003eWebSocket Status: {connected ? 'Connected' : 'Disconnected'}\u003c/div\u003e\n      \n      {/* Historical Data */}\n      \u003cdiv\u003e\n        \u003ch3\u003eHistorical Data\u003c/h3\u003e\n        \u003ctable\u003e\n          \u003cthead\u003e\n            \u003ctr\u003e\n              \u003cth\u003eTime\u003c/th\u003e\n              \u003cth\u003eOpen\u003c/th\u003e\n              \u003cth\u003eHigh\u003c/th\u003e\n              \u003cth\u003eLow\u003c/th\u003e\n              \u003cth\u003eClose\u003c/th\u003e\n              \u003cth\u003eVolume\u003c/th\u003e\n            \u003c/tr\u003e\n          \u003c/thead\u003e\n          \u003ctbody\u003e\n            {data.map((candle) =\u003e (\n              \u003ctr key={candle.timestamp}\u003e\n                \u003ctd\u003e{new Date(candle.timestamp).toLocaleTimeString()}\u003c/td\u003e\n                \u003ctd\u003e{candle.open}\u003c/td\u003e\n                \u003ctd\u003e{candle.high}\u003c/td\u003e\n                \u003ctd\u003e{candle.low}\u003c/td\u003e\n                \u003ctd\u003e{candle.close}\u003c/td\u003e\n                \u003ctd\u003e{candle.volume}\u003c/td\u003e\n              \u003c/tr\u003e\n            ))}\n          \u003c/tbody\u003e\n        \u003c/table\u003e\n      \u003c/div\u003e\n\n      {/* Live Trades */}\n      \u003cdiv\u003e\n        \u003ch3\u003eLive Trades\u003c/h3\u003e\n        \u003cul\u003e\n          {trades.map((trade, index) =\u003e (\n            \u003cli key={index}\u003e\n              Price: {trade.price} | Quantity: {trade.quantity}\n            \u003c/li\u003e\n          ))}\n        \u003c/ul\u003e\n      \u003c/div\u003e\n    \u003c/div\u003e\n  );\n};\n\nexport default MarketChart;\n```\n\n### 4. Usage in App\n```javascript\n// App.js\nimport React from 'react';\nimport MarketChart from './components/MarketChart';\n\nfunction App() {\n  return (\n    \u003cdiv\u003e\n      \u003ch1\u003eCrypto Market Tracker\u003c/h1\u003e\n      \u003cMarketChart symbol=\"BTCUSDT\" interval=\"1m\" /\u003e\n    \u003c/div\u003e\n  );\n}\n\nexport default App;\n```\n\n## Error Handling\n\n### HTTP Status Codes\n- 200: Successful request\n- 400: Bad request (invalid parameters)\n- 429: Too many requests\n- 500: Server error\n\n### Error Response Format\n```json\n{\n  \"error\": \"Error message here\",\n  \"details\": \"Additional error details if available\"\n}\n```\n\n## Rate Limiting\n- 100 requests per IP address per 15 minutes for REST APIs\n- WebSocket connections are limited to 10 concurrent subscriptions per client\n\n## Best Practices\n1. Implement error handling for both REST and WebSocket connections\n2. Cache historical data when appropriate\n3. Implement reconnection logic for WebSocket disconnections\n4. Use appropriate intervals based on your use case\n5. Unsubscribe from WebSocket feeds when components unmount\n\n## Common Issues and Solutions\n\n### CORS Issues\nIf you encounter CORS errors, ensure your frontend application is running on an allowed origin (default: http://localhost:5173).\n\n### WebSocket Connection Issues\n1. Check if the WebSocket server is running\n2. Verify the connection URL\n3. Implement reconnection logic\n4. Check for firewall restrictions\n\n### Rate Limiting\nIf you hit rate limits:\n1. Implement caching\n2. Reduce request frequency\n3. Implement exponential backoff\n\n## Support\nFor issues and feature requests, please create an issue in the GitHub repository.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsameerkali%2Fbalkan_tech_solutions_assignment_backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsameerkali%2Fbalkan_tech_solutions_assignment_backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsameerkali%2Fbalkan_tech_solutions_assignment_backend/lists"}