| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- c# websocket
- 라이브 차트
- c# restapi
- C#
- 즐겨찾기
- 업비트 c#
- WPF
- c# 차트
- c# restapi 호출
- Upbit API
- c# 업비트 api키 목록
- 북마크
- 차트
- c# 업비트
- c# api호출
- 업비트 차트
- upbit
- 업비트 API
- 업비트
- maui
- c# maui
- c# 라이브 차트
- Chart
- Prism
- 나만의 사이트모음집
- XAML
Archives
- Today
- Total
하아찡
C# 업비트API 요청수 제한 본문
API 호출 목록 북마크사이트
https://mysitecollection.com/guest/1/19/coinapi
내사이트모음
자신만의 사이트를 저장해두고 사용합니다.
mysitecollection.com
각종 요청에 따라 호출제한이 있습니다.
대표적인 예를보면 캔들정보를 불러오는데 초당 10회가넘어가면 정상적인 호출을 할 수 없습니다.

public ChartViewModel(UpbitManager upbitManager)
{
_upbitManager = upbitManager;
_publicAPI = new PublicAPI();
CandleType = "minutes";
CandleMinUnit = 1;
WeakReferenceMessenger.Default.Register<CoinSelectedMessage>(this, (r, m) =>
{
SelectedMarketCode = m.Value;
ChartData = new LinkedList<Candle>();
_publicAPI.Candles(ChartData, CandleType, CandleMinUnit, SelectedMarketCode.Market, "");
for(int i = 0; i < 300; i++)
{
_publicAPI.Candles(ChartData, CandleType, CandleMinUnit, SelectedMarketCode.Market, ChartData.First.Value.Utc);
}
Logger.Log($"[Chart] 코인 선택됨: {m.Value.KoreanName}");
});
}
public void Candles(LinkedList<Candle> candles, string type = "minutes", int unit = 1, string market = "", string time = "", int cnt = 200)
{
if(market == "")
{
return;
}
if(time != "")
{
DateTime dt = DateTime.ParseExact(
time,
"yyyy-MM-dd tt h:mm:ss",
new CultureInfo("ko-KR")
);
time = dt.ToString("yyyy-MM-dd HH:mm:ss");
}
type = ((type == "minutes") ? (type + "/" + unit + "?") : (type + "?"));
var client = new RestClient($"{_urls.Candles}{type}market={market}&count={cnt}&to={time}");
var request = new RestRequest();
request.AddHeader("accept", "application/json");
try
{
RestResponse response = client.Execute(request);
var remainingReqHeader = response.Headers.FirstOrDefault(h => h.Name == "Remaining-Req")?.Value?.ToString();
if (remainingReqHeader != null)
{
// 예: group=default; min=1800; sec=29
var parts = remainingReqHeader.Split(';');
var secPart = parts.FirstOrDefault(p => p.Trim().StartsWith("sec="));
if (secPart != null)
{
int remainingSec = int.Parse(secPart.Replace("sec=", "").Trim());
if (remainingSec <= 1)
{
Logger.Log("초당 요청 한도 임박, 1초 대기");
Thread.Sleep(1000);
}
}
}
if (response.StatusCode == HttpStatusCode.TooManyRequests)
{
// 요청이 너무많음
Logger.Log($"너무 많은 요청 : {market}");
return;
}
JArray jsonArray = JArray.Parse(response.Content);
foreach (var item in jsonArray.Children())
{
Candle i = new Candle();
i.Utc = item["candle_date_time_utc"].ToString();
i.Kst = item["candle_date_time_kst"].ToString();
i.Op = Convert.ToDouble(item["opening_price"].ToString());
i.Hp = Convert.ToDouble(item["high_price"].ToString());
i.Lp = Convert.ToDouble(item["low_price"].ToString());
i.Tp = Convert.ToDouble(item["trade_price"].ToString());
i.Timestamp = Convert.ToInt64(item["timestamp"].ToString());
//i.change_rate = Convert.ToDouble(item["change_rate"].ToString());
i.Candle_acc_trade_price = Convert.ToDouble(item["candle_acc_trade_price"].ToString());
i.Candle_acc_trade_volume = Convert.ToDouble(item["candle_acc_trade_volume"].ToString());
candles.AddFirst(i);
}
}
catch (Exception e)
{
Debug.WriteLine($"캔들 읽어오기 오류 마켓코드 : {market}");
}
}


요청받은 헤더에 남은 요청 횟수를 가져와서 잘 처리하시면 됩니다.
반응형
'C# > 업비트' 카테고리의 다른 글
| C# 업비트 캔들 작업 이슈 (1) | 2025.05.24 |
|---|---|
| C# 업비트 API 캔들데이터처리 (0) | 2025.05.22 |
| C# 업비트 APIKey 인증 (0) | 2025.05.21 |
| C# 업비트 Websocket 연결 (0) | 2025.05.20 |
| C# 업비트 Rest API 호출 (2) | 2025.05.19 |