무료지만 최신이 아니다 — syndication 429 실측과 종량제 API v2
2026-09-11 · 2 min read
$ syndication.twitter.com/srv/timeline-profile/screen-name/karpathy
200, 100건, 최신 287일 전
X 크롤링은 된다. 다만 인증 없이 되는 그 경로가, 원하는 걸 주지 않는다.
syndication.twitter.com/srv/timeline-profile/screen-name/<핸들>은 인증 없이 200을 반환하고 트윗 100건을 준다. 여기까지만 보면 뚫린 것 같다. 그런데 계정별로 실측해보니 반환값의 정체가 다르다.
| 핸들 | 반환 | 최신 트윗 | 7일 이내 |
|---|---|---|---|
@OpenAI | 20건 | 0일 전 | 13건 |
@karpathy | 100건 | 287일 전 | 0건 |
@ylecun | 101건 | 286일 전 | 0건 |
@OpenAI는 실시간 타임라인이 오지만, @karpathy와 @ylecun은 100건을 채워서 주는데도 가장 최근 트윗이 287일 전이다. 즉 이 엔드포인트는 최신순 타임라인이 아니라 인기순으로 골라낸 과거 트윗 묶음을 준다.
"100건짜리 응답은 몇 년 치 인기 트윗 모음(greatest hits)이다(중앙값 686일 전)." —
docs/crawling-plan.md
무료이지만 최신순이 아니라 인기순이고, 200이 뜨지만 그게 오늘 쓸 데이터라는 뜻은 아니다. 날짜 필터 없이 그대로 파이프라인에 넣으면 2023년 트윗이 오늘 다이제스트에 실린다. 그래서 X_MAX_AGE_DAYS 필터는 옵션이 아니라 필수로 바뀌었다.
레이트리밋은 처음 잰 것보다 훨씬 가혹하다
같은 문서에서 초기 판정은 "2~3회 후 분 단위 회복"이었다. 그런데 뒤이은 실측에서 이 판정도 뒤집혔다.
"레이트리밋도 처음 잰 것보다 훨씬 가혹하다. 검증 중 약 25콜을 쓴 뒤 13분 쿨다운에도 429가 풀리지 않았다." —
docs/crawling-plan.md
가벼운 호출량에서만 분 단위 회복이 맞고, 실제 운영 부하에 가까운 호출량에서는 13분을 넘겨도 풀리지 않는다. IP당 연속 23회 성공 후 429가 뜨는 것도 그대로다. 하루 1회 배치 기준으로 이 경로가 감당할 수 있는 건 핸들 35개가 상한이다.
결론은 "안 쓴다"가 아니라 "폴백 순서를 정한다"
여기서 선택지는 셋이다. syndication만 쓰거나, 공식 API로 넘어가거나, 다른 소스로 대체하거나.
공식 X API v2는 종량제로 가격이 명시돼 있다.
"X API v2 종량제 — 읽기 $0.005/건, 본인 데이터 $0.001/건, 월 300만 읽기" —
docs/research-2026-09-10.md(출처: docs.x.com/x-api/getting-started/pricing)
2026년 2월 Free 티어가 폐지됐으니 지금은 무료 공식 경로 자체가 없다. syndication은 공짜지만 최신성이 없고 429에 취약하고, 공식 API는 최신성이 보장되지만 건당 과금이다. 무료가 아니라 유료를 택하는 순간 최신성과 신뢰성을 사는 셈이다.
그래서 결정은 조건부 폴백이다. X_BEARER_TOKEN이 있으면 API v2로, 없으면 syndication에 날짜 필터를 강제로 걸고 Bluesky로 보완한다. 하나의 경로에 전부 걸지 않는다는 게 요점이다.
안 한 것
이 실측은 syndication과 공식 API v2 판정까지다. xcancel·Nitter류 미러 인스턴스는 서비스 자체가 불안정해서(신뢰 가능한 우회로 취급하지 않는다) 이 글에서 다루지 않았고, 브라우저 세션으로 로그인해서 긁는 방식도 시도하지 않았다. 계정 잠금 리스크가 있는 경로는 이번 검증 범위 밖이다.
인증 없이 되는 건 맞지만 최신도 아니고 안정적이지도 않다 — 최신성을 사려면 공식 API 종량제로 넘어가야 한다.