YouTube 클립은 목록이 없는 데이터다 — 모으기는 URL 줍기, 정보는 HTML 한 장
Data API 에 클립 엔드포인트는 없다. 클립 URL 하나에서 원본 영상 · 구간 · 제목을 꺼내는 두 가지 방법
YouTube 클립(youtube.com/clip/<id>)을 모아서 쓰고 싶은 사람을 위한 글이다. 다 읽으면 클립 URL 을 어디서 구할 수 있는지, 그리고 URL 하나에서 원본 영상 ID · 시작과 끝 · 클립 제목을 어떻게 꺼내는지 알 수 있다.
결론은 이렇다. 클립 하나의 정보는 쉽게 꺼낸다. 그런데 클립 목록은 어디에도 없다.
「API 로 받으면 되지」 가 안 된다
처음엔 YouTube Data API v3 에 클립 목록 같은 게 있을 줄 알았다. 문서를 뒤져 보니 클립을 다루는 엔드포인트가 없다. 영상 페이지에도 「이 영상의 클립 목록」 은 없다. 공개 클립을 모아 둔 디렉터리도 웹 검색으로 찾아봤지만 없었다. 걸리는 건 개인용 북마크 도구나, YouTube 클립 기능과 상관없는 연구용 영상 데이터셋뿐이었다.
클립 ID 를 짐작해서 늘어놓는 것도 안 된다. 예로 든 클립 UgytZKpehg-hEMBSn3F4AaABCQ 의 원본 영상은 ScPX26pdQik 인데, 겉보기에 둘은 아무 관계가 없다.
그래서 일을 두 단계로 나눴다.
1단계: URL 을 어디서 줍나
「전부」 가 보이는 곳은 하나뿐이다. 내 채널 영상으로 남이 만든 클립이다. YouTube 도움말에 따르면 크리에이터는 자기 영상으로 만든 클립을 YouTube Studio 와 앱의 라이브러리에서 볼 수 있다. 대신 본인 채널 한정이고 API 가 없어서 화면에서 긁어야 한다. 이 화면은 아직 직접 열어 보지 않았다.
내가 만든 클립은 라이브러리의 「내 클립」 에 있다. 남의 채널 클립까지 넓히려면 검색엔진에 site:youtube.com/clip "키워드" 를 넣거나, SNS · 커뮤니티에 공유된 링크를 줍는 수밖에 없다. 검색엔진은 색인된 일부만 나오고, SNS 는 인기 장면 위주로 모인다. 각 경로의 범위와 단점은 아래 상세에 표로 뒀다.
2단계: URL 하나에서 정보 꺼내기
클립 페이지 HTML 을 받아 보면 필요한 게 다 있다. 2026-09-29 에 공개 클립 하나를 curl 로 받아 확인했다. clipConfig 안에 startTimeMs 29000, endTimeMs 39700 이 있고, 원본 videoId 가 있고, og:title 에 클립 제목이 ✂️ 를 앞에 붙인 채로 들어 있었다.
같은 클립을 yt-dlp --skip-download -J 로 돌리면 section_start 29.0, section_end 39.7, 채널명이 나온다. 다만 yt-dlp 의 title 은 클립 제목이 아니라 원본 영상 제목이다.
그래서 고르는 기준은 간단하다. 클립 제목이 필요하면 HTML 을 파싱한다. 구간만 잘라서 내려받아야 하면 yt-dlp 를 쓴다. HTML 파싱은 YouTube 가 페이지 구조를 바꾸면 깨지고, yt-dlp 는 업데이트로 따라가 준다는 차이도 있다.
구간을 알면 원본 영상 자막에서 그 구간만 잘라 붙일 수 있다. 클립을 「무슨 말을 하는 장면인지」 로 검색하고 싶을 때 쓸모 있다.
아직 모르는 것
클립이 지워지거나 원본이 비공개가 됐을 때 페이지가 어떻게 응답하는지, 클립 조회수 · 작성자가 HTML 에 들어 있는지는 아직 확인하지 않았다. 크롤링할 거라면 YouTube 이용약관과 요청 간격도 먼저 봐야 한다.
영상 데이터를 모으는 도구나 파이프라인을 만들고 있는데 「API 에 없는 데이터」 에 막혔다면 negabaro 에 물어봐도 된다.
클립 URL 을 줍는 곳
| 경로 | 범위 | 좋은 점 | 아쉬운 점 |
|---|---|---|---|
| YouTube Studio · 라이브러리 | 내 채널 영상으로 남이 만든 클립 | 「전부」 가 보이는 유일한 곳 | 본인 채널 한정, API 없음 |
| 라이브러리 「내 클립」 | 내가 만든 클립 | 간단 | 내 것뿐 |
| 검색엔진 site:youtube.com/clip | 색인된 일부 | 남의 채널도 잡힌다 | 빠지는 게 많고 치우친다 |
| SNS · 커뮤니티 | 공유된 것 | 인기 장면이 모인다 | 수집 비용, 규약 확인 필요 |
HTML 파싱이냐 yt-dlp 냐
| HTML 파싱 | yt-dlp -J | |
|---|---|---|
| 클립 제목 | og:title 에 있다 | 없다 (title 은 원본 제목) |
| 구간 | ms 단위 | 초 단위 |
| 구간만 내려받기 | 못 한다 | 된다 |
| 깨질 때 | YouTube 가 HTML 을 바꾸면 | yt-dlp 업데이트로 따라간다 |
실제로 본 값 (2026-09-29, macOS)
# 클립 페이지 HTML 안
"clipConfig":{"postId":"UgytZKpehg-hEMBSn3F4AaABCQ","startTimeMs":"29000","endTimeMs":"39700"}
"videoId":"ScPX26pdQik"
<meta property="og:title" content="✂️ air">
# yt-dlp
yt-dlp --skip-download -J "https://www.youtube.com/clip/UgytZKpehg-hEMBSn3F4AaABCQ"
# section_start: 29.0 / section_end: 39.7 / channel: Scott The Woz
실전 순서
클립 URL 을 모은다 — 내 채널은 Studio, 내 클립은 라이브러리, 남의 것은 검색엔진 · SNS
클립 페이지 HTML 에서 clipConfig(startTimeMs · endTimeMs), videoId, og:title 을 꺼낸다
구간만 내려받으려면 yt-dlp -J 의 section_start · section_end 를 쓴다 (title 은 원본 제목)
필요하면 원본 자막에서 그 구간만 잘라 붙인다