결론부터
- 1양수는 사용자, 음수는 기본 그룹, -100 은 슈퍼그룹·채널.
- 2그룹이 슈퍼그룹이 되면 ID 가 바뀐다 — migrate_to_chat_id 로 고친다.
- 364비트로 저장하고, ID 는 내 봇의 업데이트에서 읽는다.
chat_id 는 모양으로 종류가 갈린다
봇 API 의 대화 ID(chat_id)는 숫자 하나지만, 부호와 앞자리만 보면 어떤 대화인지 알 수 있습니다.
| 모양(예시 값) | 대화 종류 | 읽는 법 |
|---|---|---|
123456789 | 개인 대화(사용자) | 양수 — 사용자 ID 와 같다 |
-123456789 | 기본 그룹 | 음수 — 그룹 번호에 마이너스 |
-1001234567890 | 슈퍼그룹 · 채널 | -100 으로 시작 — 앞에 큰 수를 붙여 음수로 |
텔레그램 안쪽(MTProto)에서는 그룹과 채널에도 양수 번호가 따로 있습니다. 봇 API 는 이 번호들이 서로 겹치지 않도록 그룹은 마이너스, 슈퍼그룹·채널은 -1000000000000 을 더 빼서 하나의 숫자 공간에 넣은 것입니다.
자주 하는 실수
- 그룹이 슈퍼그룹으로 바뀌면 ID 도 바뀝니다. 기본 그룹이 슈퍼그룹으로 올라가면(관리 기능을 켜거나 인원이 늘 때) 새 -100… ID 를 받습니다. 옛 ID 로 보내면 오류 응답에 새 ID(
migrate_to_chat_id)가 함께 오니, 그 값으로 저장값을 고칩니다. - 32비트 정수에 담지 않습니다. -100… ID 는 32비트 범위를 넘습니다. 공식 문서는 64비트 정수(또는 배정밀도 실수)로 저장하라고 안내합니다. 자바스크립트처럼 숫자를 실수로 다루는 언어도 이 범위는 안전합니다.
- -100 을 떼고 저장하지 않습니다. 표시용으로 줄이고 싶어도, 보낼 때는 반드시 원래 모양 그대로 씁니다.
내 대화의 ID 를 아는 방법
- 봇을 그 대화에 넣거나(개인 대화는 사용자가 봇을 시작) 메시지를 하나 보냅니다.
- 봇이 받은 업데이트의
message.chat.id가 그 대화의 ID 입니다(업데이트 받기). - 공개 채널·그룹은
@사용자명을 chat_id 자리에 바로 써도 됩니다. 비공개라면 숫자 ID 뿐입니다.
chat_id 로 메시지를 보내는 방법은 봇 API 첫 요청, 그룹·슈퍼그룹·채널이 API 에서 어떻게 다른지는 채널·슈퍼그룹·기본 그룹에 있습니다.
자주 묻는 질문
텔레그램 그룹 ID 가 왜 -100 으로 시작하나요?
슈퍼그룹과 채널의 봇 API ID 는 안쪽 번호에 큰 수를 더해 음수로 만든 것이라 -100 으로 시작합니다.
그룹 ID 가 갑자기 바뀌었어요.
기본 그룹이 슈퍼그룹으로 바뀌면 새 ID 를 받습니다. 옛 ID 로 보낸 요청의 오류 응답에 새 ID 가 함께 옵니다.
chat_id 는 어떻게 알아내나요?
봇이 그 대화에서 받은 업데이트의 message.chat.id 를 봅니다. 공개 채널·그룹은 @사용자명 도 쓸 수 있습니다.
chat_id 를 int 로 저장해도 되나요?
32비트 정수는 넘칠 수 있습니다. 64비트 정수로 저장합니다.
참고한 공식 문서
요약
한눈에 정리
- 1모양
양수 · 음수 · -100.
- 2바뀔 때
슈퍼그룹 전환 → 새 ID.
- 3저장
64비트 · 원래 모양 그대로.
최종 수정 2026-10-06