텔레그램 chat id 확인방법: 개인, 그룹, 채널, 토픽별 chat id 찾기
텔레그램 chat id 확인방법 중 가장 확실한 것은 봇에게 메시지를 보낸 다음 Bot API의 getUpdates를 호출해 응답의 message.chat.id 값을 읽는 것입니다. 개인 채팅은 양수, 일반 그룹은 음수, 슈퍼그룹과 채널은 -100으로 시작하는 숫자입니다. 아래에서 개인 채팅, 그룹, 채널, 포럼 토픽별로 chat id를 찾는 방법과 결과가 비어 있을 때의 해결책을 차례로 설명합니다.
chat id란: 채팅 종류별 숫자 형식
chat id는 텔레그램의 각 채팅을 가리키는 고유 번호입니다. sendMessage를 비롯한 거의 모든 전송 메서드가 chat_id 파라미터로 메시지를 보낼 곳을 지정합니다. 응답의 chat.type을 보면 어떤 종류의 채팅인지 알 수 있습니다.
| 채팅 종류 | chat.type | chat id 예시 |
|---|---|---|
| 개인 채팅(1:1) | private | 123456789 (양수) |
| 일반 그룹 | group | -123456789 (음수) |
| 슈퍼그룹 | supergroup | -1001234567890 |
| 채널 | channel | -1001234567890 |
- 개인 채팅의 chat id는 상대 사용자의 ID와 같습니다.
-100은 ID의 일부입니다. 떼어 내고 보내면Bad Request: chat not found오류가 납니다.- chat id는 32비트 정수 범위를 넘을 수 있습니다. 공식 문서에 따르면 유효 비트는 최대 52비트이므로 64비트 정수나 배정밀도 부동소수점으로 저장하십시오. 데이터베이스 컬럼은
BIGINT가 안전합니다. - 봇 토큰의 콜론 앞 숫자는 봇 자신의 ID입니다. chat id로 착각하지 마십시오.
방법 1: getUpdates로 텔레그램 chat id 찾기 (개인 채팅)
봇 토큰이 아직 없다면 텔레그램 봇 토큰 가이드를 먼저 참고하십시오. 토큰이 있다면 다음 순서로 진행합니다.
- 텔레그램에서 내 봇(
t.me/your_bot)을 열고 시작을 누르거나 아무 메시지나 보냅니다. - 브라우저 주소창이나 터미널에서
getUpdates를 호출합니다. 브라우저 도구가 편하다면 Bot API Tester의 getUpdates에 토큰만 넣고 실행해도 됩니다. - 응답 JSON에서
message.chat.id를 찾습니다.
curl "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/getUpdates"
{
"ok": true,
"result": [
{
"update_id": 870000001,
"message": {
"message_id": 5,
"from": {"id": 123456789, "is_bot": false, "first_name": "서연", "language_code": "ko"},
"chat": {"id": 123456789, "first_name": "서연", "type": "private"},
"date": 1793266200,
"text": "안녕"
}
}
]
}
여기서 "chat": {"id": 123456789, ...}의 숫자가 chat id입니다. 주소창에 입력한 URL에는 토큰이 그대로 들어 있으므로 화면을 캡처해 공유하지 마십시오.
업데이트가 많아 눈으로 찾기 어렵다면 다음 Python 스크립트로 채팅별 ID만 뽑아 볼 수 있습니다. 일반 메시지, 수정된 메시지, 채널 게시물, 봇의 멤버 상태 변경 등 업데이트 종류마다 chat이 들어 있는 위치가 다르다는 점을 반영했습니다.
import requests
TOKEN = "123456789:AAEexampleTokenReplaceWithYours"
data = requests.get(f"https://api.telegram.org/bot{TOKEN}/getUpdates", timeout=10).json()
if not data["ok"]:
raise SystemExit(f'{data["error_code"]}: {data["description"]}')
chats = {}
for update in data["result"]:
for key in ("message", "edited_message", "channel_post", "my_chat_member"):
if key in update:
chat = update[key]["chat"]
chats[chat["id"]] = (chat["type"], chat.get("title") or chat.get("first_name"))
for chat_id, (chat_type, name) in chats.items():
print(chat_id, chat_type, name)
방법 2: 텔레그램 그룹 chat id 확인
그룹에서는 봇의 프라이버시 모드가 기본으로 켜져 있습니다. 이 상태의 봇은 자신을 지목한 명령(/command@your_bot), 자신의 메시지에 대한 답장, 봇을 통해 보낸 메시지, 서비스 메시지만 받습니다. 그래서 그룹에 "안녕"이라고 써도 getUpdates에는 아무것도 나타나지 않습니다. 다음 순서를 따르십시오.
- 그룹 정보 화면에서 멤버 추가를 눌러 봇의 username을 검색해 초대합니다.
- 그룹 채팅에
/start@your_bot을 보냅니다.your_bot자리에는 실제 봇 username을 넣습니다. 봇을 지목한 명령이므로 프라이버시 모드에서도 전달됩니다. getUpdates를 호출해message.chat.id를 확인합니다.chat.type이group이면 음수,supergroup이면-100으로 시작하는 값입니다.
"chat": {
"id": -1001234567890,
"title": "개발팀 알림방",
"type": "supergroup"
}
사실 봇을 그룹에 추가하는 순간에도 업데이트가 생깁니다. 봇의 멤버 상태가 바뀌었음을 알리는 my_chat_member 업데이트와 new_chat_members 서비스 메시지에도 그룹의 chat.id가 들어 있으므로, 추가 직후 getUpdates를 호출해도 ID를 찾을 수 있습니다.
그룹의 모든 메시지를 받아야 하는 봇이라면 @BotFather의 /setprivacy에서 프라이버시 모드를 끄거나 봇을 그룹 관리자로 지정합니다. 관리자인 봇은 항상 모든 메시지를 받습니다. 프라이버시 설정을 바꾼 뒤에는 봇을 그룹에서 내보냈다가 다시 추가해야 적용됩니다.
슈퍼그룹 전환에 주의하십시오. 일반 그룹이 슈퍼그룹으로 업그레이드되면 chat id가 -100… 형식의 새 값으로 바뀝니다. 예전 ID로 메시지를 보내면 Bad Request: group chat was upgraded to a supergroup chat 오류와 함께 parameters.migrate_to_chat_id에 새 ID가 담겨 오므로, 이 값으로 저장된 ID를 교체한 뒤 다시 보내면 됩니다.
방법 3: 채널 chat id 확인
공개 채널은 숫자 ID를 몰라도 됩니다. chat_id에 "@channelusername" 문자열을 그대로 넣으면 됩니다. 단, 채널에 글을 올리려면 봇이 메시지 게시 권한을 가진 관리자여야 합니다. 숫자 ID가 필요하다면 getChat에 chat_id=@channelusername을 넣어 호출하고 응답의 id를 확인하십시오. username은 채널 소유자가 바꿀 수 있으므로 장기간 저장할 값으로는 숫자 ID가 더 안전합니다.
비공개 채널은 username이 없으므로 다음 방법으로 숫자 ID를 알아냅니다.
- 채널 설정의 관리자 메뉴에서 봇을 관리자로 추가하고 메시지 게시 권한을 줍니다.
- 채널에 아무 글이나 게시합니다. 봇은 자신이 멤버인 채널의 모든 게시물을 받습니다.
getUpdates를 호출합니다. 채널 글은message가 아니라channel_post로 들어오므로channel_post.chat.id를 읽습니다.
{
"update_id": 870000010,
"channel_post": {
"message_id": 12,
"chat": {"id": -1001234567890, "title": "서비스 공지", "type": "channel"},
"date": 1793266800,
"text": "테스트 게시물"
}
}
채널에 연결된 토론(댓글) 그룹은 채널과 별개의 슈퍼그룹이므로 chat id도 다릅니다. 댓글 그룹으로 메시지를 보내려면 앞의 그룹 방법으로 그 그룹의 ID를 따로 확인하십시오.
포럼 토픽: chat id와 message_thread_id
토픽 기능을 켠 슈퍼그룹(포럼)은 토픽마다 chat id가 따로 있지 않습니다. chat id는 슈퍼그룹의 -100… 값 하나이고, 각 토픽은 message_thread_id로 구분합니다. 원하는 토픽 안에서 /start@your_bot을 보낸 뒤 getUpdates를 호출하면, 해당 메시지에 message_thread_id와 "is_topic_message": true가 함께 들어 있습니다. 그 토픽으로 메시지를 보낼 때는 두 값을 모두 지정합니다.
curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendMessage" \
-H "Content-Type: application/json" \
-d '{"chat_id": -1001234567890, "message_thread_id": 42, "text": "이 토픽으로 보내는 알림입니다"}'
방법 4: 봇이 chat id를 직접 알려 주게 만들기
여러 그룹이나 토픽의 ID를 자주 확인해야 한다면, JSON을 매번 뒤지는 대신 /id 명령에 chat id를 답장하는 작은 봇을 돌려 두는 방법이 편합니다. 아래 스크립트는 getUpdates의 timeout으로 롱 폴링을 하고, 처리한 업데이트는 offset을 마지막 update_id + 1로 올려 확인 처리합니다. 그룹에서는 프라이버시 모드 때문에 /id@your_bot처럼 봇을 지목해서 보내야 합니다.
import requests
TOKEN = "123456789:AAEexampleTokenReplaceWithYours"
API = f"https://api.telegram.org/bot{TOKEN}"
offset = None
while True:
params = {"timeout": 30}
if offset is not None:
params["offset"] = offset
data = requests.get(f"{API}/getUpdates", params=params, timeout=40).json()
for update in data.get("result", []):
offset = update["update_id"] + 1
msg = update.get("message") or update.get("channel_post")
if not msg or not msg.get("text", "").startswith("/id"):
continue
text = f'chat id: {msg["chat"]["id"]} ({msg["chat"]["type"]})'
reply = {"chat_id": msg["chat"]["id"], "text": text}
if msg.get("is_topic_message"):
reply["text"] += f'\nmessage_thread_id: {msg["message_thread_id"]}'
reply["message_thread_id"] = msg["message_thread_id"]
requests.post(f"{API}/sendMessage", json=reply, timeout=10)
이 스크립트가 실행되는 동안에는 같은 토큰으로 다른 곳에서 getUpdates를 호출하지 마십시오. 두 프로그램이 동시에 폴링하면 한쪽이 409 Conflict로 끊깁니다. 확인이 끝나면 Ctrl+C로 종료합니다.
getUpdates 결과가 비어 있거나 오류가 날 때
| 증상 | 원인 | 해결 |
|---|---|---|
"result": [] | 봇이 받은 새 업데이트가 없음 | 봇에게 새 메시지를 보낸 뒤 다시 호출합니다. 이미 확인된 업데이트는 다시 나오지 않습니다. |
| 어제 보낸 메시지가 안 보임 | 업데이트는 서버에 최대 24시간만 보관됨 | 메시지를 새로 보내고 바로 호출합니다. |
| 그룹 메시지만 안 보임 | 프라이버시 모드로 일반 메시지가 전달되지 않음 | /start@your_bot처럼 봇을 지목한 명령을 보냅니다. |
409 Conflict: can't use getUpdates method while webhook is active | 웹훅이 설정되어 있음 | getWebhookInfo로 확인하고 deleteWebhook을 호출합니다. |
409 Conflict: terminated by other getUpdates request | 같은 토큰으로 다른 프로그램이 폴링 중 | 다른 인스턴스를 멈추거나 테스트용 봇을 따로 만듭니다. |
전송 시 400 Bad Request: chat not found | ID 오타, -100 누락, 봇이 채팅에 없음, 사용자가 봇을 시작하지 않음 | ID를 다시 확인하고 봇을 채팅에 추가합니다. |
웹훅을 지우면 웹훅으로 업데이트를 받던 서버나 자동화 도구는 더 이상 업데이트를 받지 못한다는 점에 유의하십시오. 운영 중인 봇이라면 chat id 확인이 끝난 뒤 웹훅을 다시 등록하거나, 처음부터 확인용 봇을 따로 두는 편이 안전합니다. 웹훅 설정과 해제는 텔레그램 웹훅 설정 가이드에서 다룹니다.
chat id는 어디에 쓰이나: 알림, n8n, AI 비서
chat id가 필요한 대표적인 경우는 다음과 같습니다.
- 서버·배포 알림: 모니터링 스크립트나 CI 파이프라인이 장애와 배포 결과를 특정 채팅으로 보냅니다.
- 자동화 도구: n8n 같은 워크플로 도구에서 텔레그램으로 메시지를 보낼 때 봇 토큰과 함께 대상 chat id를 입력합니다.
- AI 비서 연동: OpenClaw 같은 AI 비서를 텔레그램에 연결할 때도 보통 봇 토큰과 chat id를 요구합니다. 대화를 허용할 사용자나 결과를 받을 채팅을 지정하는 데 쓰입니다.
chat id 자체는 토큰처럼 비밀 값은 아니지만, 봇이 누구의 명령을 따를지 정하는 기준으로 쓰인다면 신중하게 다뤄야 합니다. 예를 들어 관리자 전용 명령은 그룹 chat id만 볼 것이 아니라 message.from.id가 허용 목록에 있는지 코드에서 확인해야 합니다. 그룹 ID만 검사하면 그 그룹의 누구나 명령을 실행할 수 있기 때문입니다.
chat id를 확인했다면 바로 메시지를 보내 값이 맞는지 시험해 보십시오. 성공하면 "ok": true가 돌아오고 해당 채팅에 메시지가 나타납니다.
curl -X POST "https://api.telegram.org/bot123456789:AAEexampleTokenReplaceWithYours/sendMessage" \
-H "Content-Type: application/json" \
-d '{"chat_id": 123456789, "text": "chat id 확인 완료"}'
서식, 버튼, 그룹과 채널 전송 옵션은 텔레그램 봇 API 메시지 보내기에서 이어서 설명합니다.
자주 묻는 질문
텔레그램 chat id는 어디서 확인하나요?
봇에게 메시지를 보낸 뒤 https://api.telegram.org/bot<token>/getUpdates를 호출하면 응답의 message.chat.id에 chat id가 있습니다. 개인 채팅이면 양수입니다.
텔레그램 그룹 chat id는 어떻게 확인하나요?
봇을 그룹에 추가하고 그룹에서 /start@your_bot처럼 봇을 지목한 명령을 보낸 뒤 getUpdates를 호출합니다. 일반 그룹은 음수, 슈퍼그룹은 -100으로 시작하는 값이 나옵니다.
chat id 앞에 붙은 -100은 무엇인가요?
슈퍼그룹과 채널의 chat id는 -1001234567890처럼 -100으로 시작합니다. 이 접두사도 ID의 일부이므로 메시지를 보낼 때 빼지 말고 그대로 써야 합니다.
getUpdates 결과가 빈 배열(result: [])로 나옵니다. 왜 그런가요?
봇이 받은 새 메시지가 없거나, 24시간이 지나 업데이트가 삭제됐거나, 그룹의 프라이버시 모드 때문에 일반 메시지가 전달되지 않은 경우입니다. 웹훅이 설정돼 있으면 빈 배열 대신 409 Conflict가 반환되므로 deleteWebhook을 먼저 호출하십시오.
채널은 chat id 대신 @username을 써도 되나요?
공개 채널과 공개 슈퍼그룹은 chat_id에 @channelusername을 그대로 쓸 수 있습니다. 비공개 채널은 숫자 ID가 필요하며, 어느 경우든 채널에 글을 올리려면 봇이 관리자여야 합니다.
내 사용자 ID와 개인 채팅의 chat id는 같은가요?
네. 봇과의 개인 채팅에서는 message.chat.id가 보낸 사람의 사용자 ID인 message.from.id와 같습니다. 다만 봇 토큰의 콜론 앞 숫자는 봇 자신의 ID이므로 chat id로 쓰면 안 됩니다.
관련 가이드
텔레그램 봇 만들기: @BotFather로 생성하고 첫 메시지 보내기
텔레그램 봇 만들기 가이드입니다. @BotFather의 /newbot으로 봇을 생성하고 토큰을 getMe로 확인한 뒤, getUpdates와 sendMessage로 첫 메시지를 보내는 과정을 curl과 Python 예제로 설명합니다.
텔레그램 봇 API로 메시지 보내기: sendMessage 사용법과 예제
텔레그램 봇 API 메시지 보내기 가이드입니다. sendMessage를 curl·Python·JavaScript로 호출하는 예제, HTML·MarkdownV2 서식, 인라인 버튼, 그룹·채널 전송, 400·403·429 오류 해결법을 정리했습니다.
텔레그램 봇 토큰: 발급부터 확인, 폐기, 안전한 보관까지
텔레그램 봇 토큰을 @BotFather에서 발급받는 법, 기존 봇의 토큰 찾기, getMe로 유효성 확인, 유출 시 폐기 방법을 정리했습니다. n8n·AI 비서 연동에 필요한 bot token과 chat id도 안내합니다.
텔레그램 웹훅 설정 가이드: setWebhook, secret_token, getWebhookInfo
텔레그램 봇 웹훅 설정 방법을 단계별로 정리했습니다. setWebhook 파라미터, secret_token 헤더 검증 코드, getWebhookInfo 상태 확인, deleteWebhook으로 되돌리기, 409·HTTPS 오류 해결까지 다룹니다.