
개인 개발의 고객 유치를 완전 자동화! 'X(Twitter) AI 홍보 에이전트'를 만들었다가 API의 숨겨진 사양($5의 벽)에 눈물 흘린
요약
개인 개발자가 SaaS 홍보를 자동화하기 위해 Gemini API와 X API를 결합한 AI 에이전트를 구축한 사례를 소개합니다. 시스템 구성 방식과 프롬프트 설계법을 다루며, X API 사용 시 발생하는 '402 Payment Required' 에러 문제와 해결 과정을 공유합니다.
핵심 포인트
- Node.js와 node-cron을 활용한 자동화 배치 시스템 구축
- Gemini API를 이용한 RPG 스타일의 매력적인 홍보 문구 생성
- X API v2 사용 시 발생하는 credits depleted 에러 대응
- LLM 프롬프트 설계를 통한 서비스 컨셉 유지 및 홍보 최적화
개인 개발의 고객 유치를 완전 자동화! 'X(Twitter) AI 홍보 에이전트'를 만들었다가 API의 숨겨진 사양($5의 벽)에 눈물 흘린 이야기
서론
개인 개발에 있어서 '만드는 것'만큼, 혹은 그 이상으로 어려운 것이 바로 '고객 유치(集客)'입니다.
현재 태스크나 목표를 RPG 게임처럼 즐길 수 있는 SaaS인 'LifeQuest'를 개발하고 있습니다만, 매일 SNS로 발신을 계속할 리소스가 부족합니다...
그래서, "앱의 컨셉에 맞는 매력적인 포스트를 매일 AI가 생각하여, 알아서 X(구 Twitter)에 게시하는 AI 에이전트"를 BFF(Node.js) 상에 구축했습니다.
본 기사에서는 그 구체적인 시스템 구성과 구현 사례, 그리고 현재 X API v2를 이용하는 개발자 다수가 절망하고 있는 402 Payment Required (credits depleted) 해결 방법에 대해 해설합니다.
구축한 시스템의 전체상
개발자가 자고 있어도 매일 19시에 자동으로 발신을 계속하는 배치(Batch) 시스템입니다.
실행 환경: Node.js (Express / Render에서 가동)
정기 실행: node-cron
AI (텍스트 생성): Gemini API (LLM)
X 연동: twitter-api-v2
(X API v2)
처리 플로우
node-cron이 매일 19시에 발화.
BFF 측에서 '오늘의 테마(운동, 학습, 업무 등)'를 랜덤하게 선정.
선정한 테마를 LLM에 전달하여 'RPG풍의 퀘스트 안'을 생성하게 함.
생성된 텍스트를 twitter-api-v2를 경유하여 X에 자동 게시.
구현의 포인트와 실제 코드
1. LLM을 위한 프롬프트(Prompt) 설계
단순한 '앱 홍보'로는 아무도 봐주지 않습니다. LifeQuest의 '일상의 게임화'라는 핵심 경험을 타임라인상에서 데모하기 위해 다음과 같은 프롬프트를 구성하고 있습니다.
const prompt =
당신은 태스크 관리 앱 『LifeQuest』의 홍보 AI입니다.
지정된 테마 "${theme}"로, 일상을 RPG풍으로 즐기는 『오늘의 퀘스트 안(목표, 달성 조건, 얻을 수 있는 스테이터스)』을 고안해 주세요.
조건:
- 130자 이내로 작성할 것
- 유머를 섞을 것
- 마지막에 반드시 해시태그 #LifeQuest #個人開発(개인개발)와 앱 URL(${APP_URL})을 넣을 것
;
2. X로의 자동 게시 로직 (twitter-api-v2)
게시 처리 자체는 매우 심플합니다.
const { TwitterApi } = require('twitter-api-v2');
const client = new TwitterApi({ appKey: process.env.TWITTER_API_KEY, appSecret: process.env.TWITTER_API_SECRET, accessToken: process.env.TWITTER_ACCESS_TOKEN, accessSecret: process.env.TWITTER_ACCESS_SECRET, });
const postToX = async (text) => { try { const { data } = await client.v2.tweet({ text }); console.log('게시 성공:', data.id); } catch (error) { console.error('X 게시 에러:', error); } };
🚨 최대의 함정: Free 플랜인데 「402 credits depleted」 에러가 발생한다
구현을 마치고 드디어 테스트 게시!
...이라며 의욕을 불태우던 찰나, 다음과 같은 에러를 마주했습니다.
bash ApiResponseError: Request failed with code 402 detail: 'credits depleted', title: 'Payment Required'
"어라, Free 플랜(무료 범위)으로 신청했을 텐데, 왜 결제 요구가?"
이 부분이 현재 X API의 최대 함정이었습니다.
원인과 해결책: 「입장료」로서의 $5 과금이 필요
현재의 X API는 스팸 봇 (Spam bot) 방지 대책으로 사양이 변경되어, Free 플랜이라 하더라도 계정에 최소한의 결제 실적 (크레딧 잔액)이 없으면 Write (쓰기) API가 거부되는 사양으로 되어 있습니다.
즉, "게시 권한 자체는 무료지만, 기능을 개방하기 위한 보증금이 필요"한 상태입니다.
【해결 절차】
- X Developer Portal의 「Billing (결제)」 메뉴를 연다.
- 「Top-up (충전)」에서 최소 금액인 **$5 (약 750엔)**를 충전한다.
- 대시보드의 크레딧 잔액이 "$5.00"가 된 것을 확인하고 다시 실행한다.
이것만으로 방금 전의 402 에러가 거짓말처럼 사라지고, 무사히 자동 게시가 성공했습니다.
⚠️ 또 다른 함정: 권한 변경과 토큰 재발급
API 키를 발급할 때, 앱의 권한 (App permissions)을 초기 상태인 「Read (읽기 전용)」에서 「Read and Write (읽기 및 쓰기)」로 변경해야 합니다.
이 권한 변경을 수행하기 전에 발급한 Access Token은 이전 권한 (읽기 전용) 상태로 남아 있습니다. 권한을 변경한 후에는 반드시 「Access Token and Secret」을 **Regenerate (재생성)하고, 환경 변수를 수정하는 것을 잊지 마세요. (저도 이 부분에서 조금 헤맸습니다.)
마치며: 운영 환경 배포 시 주의사항
로컬에서 작동하는 코드를 Render 등의 PaaS에 배포할 때, package.json에 twitter-api-v2와 node-cron을 추가하는 것을 잊어 MODULE_NOT_FOUND 에러를 내는 개인 개발자들의 흔한 실수도 경험했습니다 (웃음).
단돈 $5의 초기 투자로, 매일 불평 한마디 없이 자작 앱의 매력을 계속해서 발신해 주는 AI 홍보 담당자를 고용했다고 생각하면 매우 저렴한 투자입니다.
SNS 고객 유치로 고민하는 개인 개발자분들은 꼭 BFF와 LLM을 결합한 AI 에이전트 구축을 시도해 보세요!
이것이 제가 개발하여 운영 중인 앱입니다. 꼭 한번 플레이해 보세요.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기