X API 키 없이 트윗을 JSON으로 받는 방법

X API 키 없이 트윗을 JSON으로 받는 방법
Unif Cookbooks team
Unif Cookbooks team

업데이트

개발자 계정 없이 공개 X 게시물 하나를 JSON으로 읽는 검증된 5가지 방법: FxTwitter, vxTwitter, syndication, oEmbed, UnifAPI.

한마디로: 공개 게시물 하나를 JSON으로 읽는 데 X 개발자 계정은 필요 없습니다. 2026년 10월 7일, 저희는 같은 NASA 게시물을 키 없이 응답하는 다섯 곳에서 curl로 가져와 봤습니다. FxTwitter와 vxTwitter는 단일 게시물이나 사용자에 대해 깔끔한 JSON 객체를 반환합니다. X 자체의 syndication 엔드포인트도 게시물을 JSON으로 반환하지만, 문서화되어 있지 않고 언제든 바뀔 수 있습니다. X의 oEmbed 엔드포인트는 데이터가 아니라 JSON으로 감싼 HTML 조각을 반환합니다. 로그인 없이 무료로 쓸 수 있고 방문자별 횟수 제한이 적용되는 UnifAPI의 /tools/x/post는 작성자, 미디어, 인용 게시물, 모든 지표가 포함된 게시물을 검색, 답글, 타임라인 엔드포인트와 같은 필드 이름으로 반환합니다. 게시물 하나만 필요하다면 FxTwitter로 충분합니다. 그 게시물이 이어서 검색하고, 답글을 읽고, 타임라인을 훑는 워크플로의 첫 단계라면, 그 모든 작업에서 엔벨로프가 같은 엔드포인트를 쓰세요.

"트윗을 JSON으로 어떻게 받나요"라는 질문의 답은 2022년과 다릅니다. 공식 API는 여전히 작동하지만, 무료 티어는 에이전트가 오후 한나절이면 다 써 버리는 토큰 할당량이고, 유료 티어는 몇 건 읽자고 쓰기에는 대부분의 사이드 프로젝트가 감당하기 어려운 월정액에서 시작합니다. 그 사이 임베드와 링크 미리보기 용도를 중심으로 공개 엔드포인트들이 자라났고, 이들은 자격 증명 없이 일반 HTTP 요청에 응답합니다.

이 글은 저희가 무엇을 만들지 결정하기 전에 돌려 본 테스트입니다. 아래의 모든 요청은 재현할 수 있습니다. 명령을 복사해 실행해 보세요.

테스트

공개 게시물 하나, https://x.com/NASA/status/2107237881668313108을 curl과 기본 User-Agent로, 쿠키 없이, 키 없이 가져왔습니다. 상태 코드, 콘텐츠 타입, 본문에 게시물 텍스트와 좋아요 수가 구조화된 필드로 들어 있는지를 기록했습니다.

엔드포인트상태본문텍스트 + 지표가 필드로미디어 URL인용 게시물그 외 기능
api.fxtwitter.com/NASA/status/<id>200JSON, 3.3 KB예예예사용자 하나
api.vxtwitter.com/NASA/status/<id>200JSON, 1.6 KB예예예 (URL)없음
cdn.syndication.twimg.com/tweet-result?id=<id>&token=x200JSON, 3.2 KB좋아요와 답글 수만예예없음
publish.twitter.com/oembed?url=…200HTML을 감싼 JSON아니요 (HTML blockquote)아니요아니요없음
unifapi.com/tools/x/post?id=<id>200JSON, 검색·답글·프로필과 같은 모델예예예검색, 답글, 미디어, 팔로워, 트렌드, 커뮤니티

표의 어느 것도 키를 요구하지 않습니다. 다섯 중 셋은 게시물의 쓸 만한 레코드를 줍니다. 차이는 그 밖에 무엇을 할 수 있는지, 얼마나 안정적인지, 그리고 작업이 커졌을 때 같은 필드 이름을 계속 쓸 수 있는지에 있습니다.

FxTwitter와 vxTwitter: 링크 미리보기용으로 만들어졌고, 읽기에는 충분합니다

두 프로젝트 모두 Discord와 Telegram에서 X 링크가 펼쳐지게 하려고 존재합니다. API는 그 부산물이고, 꽤 괜찮은 부산물입니다.

curl -s "https://api.fxtwitter.com/NASA/status/2107237881668313108" | jq '.tweet | {text, likes, retweets, views, created_at}'

텍스트, 좋아요·리포스트·답글·조회 수, 작성자 객체, 크기와 MP4 변형이 포함된 미디어, 인용 게시물, created_at 타임스탬프를 반환합니다. vxTwitter는 같은 핵심 정보와 mediaURLs 배열을 가진 더 평평한 객체를 반환합니다.

하지 못하는 것: 검색, 게시물 아래 답글, 사용자 타임라인, 팔로워. 사용자 엔드포인트(api.fxtwitter.com/NASA)는 수치와 소개를 반환하지만 게시물은 없습니다. 또한 공개된 속도 제한 없이 자원봉사 인프라로 운영되므로, 게시물 수백 건으로 뻗어 나가는 워크플로는 고객이 아니라 손님입니다.

X의 syndication 엔드포인트: 공식이지만 문서화되지 않았고, 깨지기 쉽습니다

X는 임베드 타임라인을 cdn.syndication.twimg.com에서 제공합니다. 단일 게시물 변형은 JSON으로 답합니다.

curl -s "https://cdn.syndication.twimg.com/tweet-result?id=2107237881668313108&token=x" | jq '{text, favorite_count, created_at, user: .user.screen_name}'

X 자체 임베드 위젯이 렌더링하는 데이터이므로 정확하지만, 위젯이 보여주는 것만 담겨 있습니다. favorite_count와 conversation_count뿐이고, 리포스트도 조회 수도 없습니다. 문서화되어 있지 않고, token 파라미터의 의미는 한 번 이상 바뀌었으며, 일부 게시물은 텍스트 대신 tombstone이 담긴 스텁으로 돌아옵니다. 의존 대상이 아니라 교차 확인용으로 쓰세요.

oEmbed: 데이터가 아닙니다

publish.twitter.com/oembed는 CMS가 게시물을 임베드할 때 쓰는 엔드포인트입니다. JSON을 반환하지만, 페이로드는 텍스트가 안에 든 HTML blockquote와 script 태그입니다. 지표도 미디어 URL도 없습니다. 텍스트를 원한다면 JSON 안에서 HTML을 파싱하게 되는데, 둘 중 최악의 조합입니다.

UnifAPI의 무료 게시물 엔드포인트

curl -s "https://unifapi.com/tools/x/post?id=2107237881668313108"
{
  "post": {
    "id": "2107237881668313108",
    "text": "Time to bring them home 🌎\n\nAfter nearly eight months aboard the @Space_Station, the four members of Crew-12 will soon head back to Earth…",
    "createdAt": "2026-10-05T22:33:56.000Z",
    "language": "en",
    "url": "https://x.com/NASA/status/2107237881668313108",
    "author": {
      "id": "11348282",
      "handle": "NASA",
      "name": "NASA",
      "verified": true,
      "followers": 92373840
    },
    "metrics": {
      "likes": 7210,
      "reposts": 846,
      "replies": 262,
      "quotes": 60,
      "bookmarks": 197,
      "views": 2823329
    },
    "media": [
      {
        "kind": "photo",
        "url": "https://pbs.twimg.com/media/HT5pcNwXwAAKdoM.jpg",
        "width": 2048,
        "height": 1365
      }
    ],
    "quoted": null
  }
}

id 파라미터는 전체 x.com 또는 twitter.com 상태 URL도 받으므로, 에이전트는 사용자가 붙여넣은 것을 그대로 넘길 수 있습니다. format=md를 붙이거나 Accept: text/markdown을 보내면 같은 게시물을 Markdown으로 받는데, 모델의 컨텍스트에 넣기에는 JSON보다 저렴합니다.

에이전트에게 중요한 속성 세 가지:

  • 엔벨로프가 공유됩니다. post, author, metrics, media는 /tools/x/search, /tools/x/replies, /tools/x/profile, /tools/x/media에서 같은 모양입니다. 한 곳에서 .metrics.likes를 읽는 프롬프트는 모든 곳에서 통합니다.
  • 제한이 표시됩니다. 모든 응답에 X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset이 실립니다. 무료 제한은 방문자당 10분에 20회 조회이며 검색은 2회로 계산됩니다. 429에는 Retry-After와 제한을 풀 수 있는 URL(종량제 X / Twitter API, 쓴 만큼 내고 구독 없음)이 포함됩니다.
  • 오류에 타입이 있습니다. id가 없거나 형식이 잘못되면 { "error": { "type": "validation_error", … } }, 삭제된 게시물은 not_found입니다. 에이전트는 메시지를 파싱하지 않고 error.type으로 분기할 수 있습니다.

전체 파라미터 표와 모든 엔드포인트의 캡처된 샘플은 각 도구의 Markdown 페이지(예: /tools/x-post-viewer/index.md)와 /llms.txt에 있습니다.

어느 것을 쓸까

  • 링크를 펼쳐 보여주는 봇에서 게시물 하나: FxTwitter. 그 용도로 만들어졌습니다.
  • 게시물의 텍스트가 X가 제공하는 그대로인지 교차 확인: syndication 엔드포인트.
  • 더 큰 작업의 첫 단계인 게시물(읽고, 답글을 읽고, 반응을 검색하고, 누가 답글을 달았는지 보기): UnifAPI의 무료 엔드포인트. 다음 단계가 존재하고 모양을 공유하기 때문입니다.
  • 물량, 최근 윈도를 넘는 이력, 보장: 워크스페이스 키를 쓰는 종량제 API. 필드 이름이 무료 엔드포인트와 일치하므로 프롬프트는 바뀌지 않습니다.

FAQ

공개 트윗을 읽으려면 Twitter 개발자 계정이 필요한가요?

아니요. 이 글의 다섯 엔드포인트는 모두 개발자 계정 없이 응답합니다. 공식 API가 필요한 것은 쓰기, 비공개 데이터, 보장된 처리량입니다.

x.com을 직접 스크레이핑하는 것도 방법인가요?

curl로는 안 됩니다. x.com/NASA/status/<id>는 147 KB짜리 HTML 껍데기를 반환하고, 게시물은 페이지 로드 후 JavaScript로 렌더링됩니다. 헤드리스 브라우저가 필요한데, 더 느리고, 비용이 더 들고, 마크업이 바뀌면 깨집니다.

UnifAPI 엔드포인트로 보호된 계정의 게시물을 읽을 수 있나요?

아니요. 보호된 게시물과 삭제된 게시물은 not_found를 반환합니다. 엔드포인트는 공개 데이터만 읽으며 X의 개인정보 설정을 우회하지 않습니다.

무료 제한은 어떻게 되나요?

모든 /tools/x/* 엔드포인트를 합쳐 방문자당 10분에 20회 조회이며(검색은 2회로 계산), 응답 헤더에 표시됩니다. 사용은 무료이며 로그인 없이, 계정 없이 쓸 수 있습니다. 제한을 푸는 것은 UnifAPI 워크스페이스 키를 쓰는 종량제입니다. 신청할 무료 키 티어는 없습니다.