YouTube API 쿼터는 하루 10,000 Units/Day. 100K 영상을 초과하지 않고 추적하는 방법
Source: Dev.to
YouTube Data API v3로 뭔가를 만든 적이 있다면, 벽에 부딪힌 적이 있을 겁니다.
Google은 하루에 10,000 쿼터 유닛을 제공합니다. 단일 search.list 호출에 100 유닛이 소모된다는 사실을 깨닫기 전까지는 관대하게 들릴 수 있죠. 즉, 하루에 100번의 검색만 할 수 있다는 의미입니다. 취미 프로젝트라면 괜찮을 수도 있지만, 수천 개의 동영상을 추적하는 프로덕션 앱이라면 바로 사용이 불가능합니다.
저는 바로 이 문제에 직면했습니다. ContentStats를 구축하면서—YouTube, TikTok, Instagram 전반에 걸쳐 조회수, 좋아요, 댓글, 공유 수를 추적하는 비디오 분석 API입니다—수만 개의 동영상에 대해 하루에 여러 번 통계를 가져와야 했습니다.
다음은 각 엔드포인트가 실제로 얼마나 비용이 드는지와, 제가 이를 해결하기 위해 취한 방법을 정리한 내용입니다.
모든 YouTube API 호출의 실제 비용
대부분의 개발자는 엔드포인트마다 할당량 비용이 얼마나 크게 다른지 깨닫지 못합니다:
| Endpoint | Cost per Call | Calls per Day (10 K quota) |
|---|---|---|
search.list | 100 units | 100 |
videos.list | 1 unit | 10 000 |
channels.list | 1 unit | 10 000 |
commentThreads.list | 1 unit | 10 000 |
playlists.list | 1 unit | 10 000 |
playlistItems.list | 1 unit | 10 000 |
videos.insert (upload) | 1 600 units | 6 |
thumbnails.set | 50 units | 200 |
문제는 명확합니다: search.list는 videos.list보다 100배 더 비쌉니다. 영상을 찾기 위해 search.list를 사용하고, 그 후 videos.list로 통계를 가져온다면 영상당 101 유닛을 소모하게 됩니다. 하루에 10 K 유닛을 사용할 경우, 최대 99개의 영상만 처리할 수 있습니다.
내 할당량을 절약한 최적화
첫 번째로 배운 점: 이미 비디오 ID가 있다면 search.list를 절대 사용하지 말라.
videos.list는 요청당 최대 50개의 비디오 ID를 받아들이며 비용은 1 유닛에 불과합니다. 즉, 올바르게 배치하면 하루에 500 000개의 비디오 통계를 가져올 수 있습니다:
// 나쁨: 1 비디오 = 1 유닛
const response = await youtube.videos.list({
part: 'statistics,snippet',
id: 'dQw4w9WgXcQ'
});
// 좋음: 50 비디오 = 1 유닛
const response = await youtube.videos.list({
part: 'statistics,snippet',
id: videoIds.slice(0, 50).join(',')
});
배치를 사용하면 10 000 유닛으로 다음을 얻을 수 있습니다:
10 000 호출 × 호출당 50 비디오 = 하루에 500 000 비디오‑통계 조회
이는 search.list를 사용했을 때 얻을 수 있는 99개의 비디오와는 엄청난 차이입니다.
하지만 더 큰 문제가 있습니다
최적화를 적용하더라도 YouTube API에는 근본적인 제한이 있습니다:
- 쿼터는 태평양 표준시 기준 자정에 초기화됩니다 — 여러분의 현지 시각이 아니라. 사용자가 유럽이나 아시아에 있다면, 그들의 피크 시간대에 쿼터가 소진되어 남은 것이 없게 됩니다.
- 웹훅이나 스트리밍 API가 없습니다. 폴링을 해야 합니다. 시간당 업데이트를 원한다면, 영상당 하루에 24번의 API 호출을 하게 됩니다. 1 000개의 영상이라면 480개의 배치 요청—즉 하나의 지표만을 위해서도 480 단위가 소모됩니다.
- 쿼터 증액을 요청하려면 컴플라이언스 감사를 받아야 합니다. Google의 quota extension form에서는 개인정보 처리방침, 서비스 약관, 그리고 영상 walkthrough 등 앱에 대한 상세 검토를 요구합니다. 승인은 몇 주에서 몇 달이 걸릴 수 있으며, 많은 요청이 거부됩니다.
- 쿼터 제한 외에도 속도 제한이 존재합니다. 쿼터가 무제한이라 하더라도 초당 속도 제한에 걸려 대량 작업이 느려집니다.
내가 만든 결과물
수개월간 할당량 제한과 씨름한 끝에, 나는 이 모든 복잡성을 처리하는 전용 비디오‑분석 레이어인 ContentStats를 구축했습니다:
- 할당량 제한 없음 — 필요에 따라 원하는 만큼 비디오를 추적
- 시간별 스냅샷 — 자동 폴링으로 cron 작업을 관리할 필요 없음
- 멀티‑플랫폼 — YouTube, TikTok, Instagram, X에 대해 동일한 API 제공
- 간단한 REST API — 하나의 엔드포인트, 하나의 API 키, OAuth 흐름 없음
비디오 통계를 가져오는 예시는 다음과 같습니다:
curl https://api.contentstats.io/v1/videos/dQw4w9WgXcQ \
-H "Authorization: Bearer YOUR_API_KEY"
{
"video_id": "dQw4w9WgXcQ",
"platform": "youtube",
"current_stats": {
"views": 1500000000,
"likes": 22000000,
"comments": 3200000
},
"tracked_since": "2026-01-15T00:00:00Z",
"snapshots_count": 720
}
할당량을 관리할 필요가 없습니다. OAuth 토큰을 갱신할 필요도 없습니다. 배치 로직도 필요 없습니다.
YouTube API를 계속 사용할 경우 실용적인 팁
공식 API를 직접 사용해야 한다면, 가장 중요한 최적화 방법은 다음과 같습니다:
-
캐시를 적극적으로 사용하세요
YouTube 통계는 매초 변하지 않습니다. 응답을 최소 5~15분 동안 캐시하세요. Redis 예시:const CACHE_TTL = 15 * 60; // 15 minutes async function getVideoStats(videoId) { const cached = await redis.get(`yt:${videoId}`); if (cached) return JSON.parse(cached); const response = await youtube.videos.list({ part: 'statistics', id: videoId }); const stats = response.data.items[0]?.statistics; await redis.setex(`yt:${videoId}`, CACHE_TTL, JSON.stringify(stats)); return stats; } -
필요한
part만 요청하세요
part파라미터는 추가 할당량을 소모하지 않지만 응답 크기와 지연 시간을 늘립니다. 통계만 필요하면statistics만 요청하고snippet,contentDetails등은 생략하세요. -
fields파라미터를 사용해 페이로드를 줄이세요const response = await youtube.videos.list({ part: 'statistics', id: videoIds.join(','), fields: 'items(id,statistics(viewCount,likeCount))' }); -
할당량 사용량을 모니터링하세요
알림(예: Cloud Monitoring, 맞춤 대시보드)을 설정해 일일 한도에 가까워질 때를 파악하고, 비핵심 요청을 제한하거나 연기할 수 있도록 하세요. -
가능한 한 배치 처리하세요
videos.list의 50개 ID 제한을 활용하세요. ID를 50개씩 묶어 배치하고 동시에 처리하되 초당 속도 제한을 준수하세요.
이러한 패턴을 적용하면 10 K 일일 할당량을 많은 프로덕션 사용 사례에 충분히 확장할 수 있습니다—하지만 정말 대규모 추적이 필요할 경우 ContentStats와 같은 전용 분석 서비스를 사용하는 것이 가장 신뢰할 수 있는 해결책입니다.
할당량 사용량 모니터링
실시간 할당량 사용량을 확인하려면 Google Cloud Console 로 이동하세요. 사용량이 80 %에 도달하면 알림을 설정하여 새벽 2 시의 quotaExceeded 오류에 놀라지 않도록 하세요.
다중 API 키 사용 (주의)
각 Google Cloud 프로젝트마다 10,000‑단위 할당량이 부여됩니다. 여러 프로젝트를 만들고 키를 교체하여 사용할 수 있습니다. Google이 이를 명시적으로 금지하지는 않지만, 회색 지대에 해당하므로 남용하지 마세요.
할당량 비용 치트 시트
시작할 때 있었으면 좋았던 전체 참고 자료입니다. 북마크해 두세요—필요할 겁니다.
| 작업 | 메서드 | 할당량 비용 |
|---|---|---|
| 동영상 검색 | search.list | 100 |
| 동영상 상세 정보 가져오기 | videos.list | 1 |
| 채널 정보 가져오기 | channels.list | 1 |
| 댓글 목록 조회 | commentThreads.list | 1 |
| 재생목록 항목 조회 | playlistItems.list | 1 |
| 댓글 달기 | commentThreads.insert | 50 |
| 동영상 업로드 | videos.insert | 1,600 |
| 동영상 메타데이터 업데이트 | videos.update | 50 |
| 썸네일 설정 | thumbnails.set | 50 |
| 재생목록 만들기 | playlists.insert | 50 |
| 동영상 평가 | videos.rate | 50 |
| 실시간 채팅 메시지 조회 | liveChatMessages.list | 5 |
할당량은 매일 태평양 표준시(PT) 자정에 초기화됩니다. 현재 사용량은 Google Cloud Console에서 확인할 수 있습니다.
더 많은 최적화 전략이 포함된 전체 분석은 **ContentStats 블로그**의 자세한 가이드를 참고하세요.
TL;DR
- YouTube API는 하루에 10,000 단위를 제공합니다.
search.list는 100 단위가 소모됩니다 (대부분 개발자가 빠지는 함정).videos.list는 1 단위이며 호출당 50개의 ID를 받을 수 있습니다 — 이것을 사용하세요.- 배치 요청을 사용하고, 응답을 캐시하며, 필요한 필드만 요청하세요.
- 수천 개의 동영상을 쿼터 문제 없이 추적해야 한다면 ContentStats 를 확인하세요 — 폴링, 배치, 다중 플랫폼 복잡성을 모두 처리해 줍니다.
저는 ContentStats를 만들고 있습니다 — YouTube, TikTok, Instagram, X 전반에 걸쳐 동영상 성과를 추적해야 하는 개발자를 위한 비디오 분석 API입니다. 무료 체험.
