채널 읽기
수신 웹훅의 URL 과 시크릿으로 그 채널의 메시지를 읽는 방법 — 허용, 요청, 응답, 페이지 넘기기, 오류
수신 웹훅으로 메시지를 보내는 외부 도구는 같은 URL 과 시크릿으로 그 채널의 메시지를 읽어 갈 수도 있습니다. 배포 스크립트가 채널에 남은 승인 답글을 확인하거나, 에이전트가 최근 대화를 읽고 요약하는 식으로 씁니다. 읽기는 웹훅마다 따로 허용해야 합니다. 보내는 방법은 수신 웹훅에 있습니다.
읽기 허용 켜기
발급할 때 채널 대화 읽기 허용을 켜거나, 이미 만든 웹훅이면 웹훅 관리하기 창의 ⋯ 메뉴에서 켭니다. 채널 관리자만 바꿀 수 있습니다. 끄면 그 즉시 읽기가 막히고, 보내기와 URL·시크릿은 그대로입니다.
읽기를 허용하면 시크릿 하나로 그 채널의 대화를 읽을 수 있습니다. 알림을 보내기만 하는 도구에는 켜지 마세요. 시크릿이 샜다면 웹훅을 삭제하고 새로 발급합니다.
요청 형식
| 항목 | 값 | 필수 |
|---|---|---|
| 메서드 | GET | 예 |
| 주소 | https://collabops.ai/api/v2/integration/webhook/<토큰>/messages | 예 |
Authorization 헤더 | Bearer <시크릿> (보낼 때와 같은 값) | 예 |
쿼리
| 이름 | 필수 | 설명 |
|---|---|---|
since | 예 | 이 시각부터 읽습니다 (포함). 시간대를 붙인 ISO 8601 시각이나 unix 초. |
until | 아니오 | 이 시각 전까지 읽습니다 (제외). 생략하면 지금입니다. since 와의 간격은 7일까지입니다. |
limit | 아니오 | 한 번에 받을 메시지 수. 1~100. |
after | 아니오 | 다음 쪽을 받을 때 직전 응답의 next_after_cursor 값. |
curl -G "https://collabops.ai/api/v2/integration/webhook/<토큰>/messages" \
-H "Authorization: Bearer <시크릿>" \
--data-urlencode "since=2026-10-12T09:00:00+09:00" \
--data-urlencode "limit=50"시각의 +09:00 에 든 + 는 쿼리 문자열에서 공백으로 읽힙니다. 위처럼 --data-urlencode 로 보내거나 %2B 로 적으세요. unix 초로 쓰면 이 문제가 없습니다.
응답
200 과 함께 채널의 메시지 목록이 옵니다. 스레드 답글은 목록에 나오지 않고, 원글의 reply_count 로 개수만 보입니다. 읽어도 읽음 표시는 남지 않습니다.
{
"messages": [
{
"id": "01a12efa-1da6-75f1-b4e2-6d3349b44b8e",
"parent_message_id": null,
"type": "user",
"created_at": "2026-10-12T07:18:25.958881Z",
"edited_at": null,
"deleted_at": null,
"reply_count": 1,
"blocks": [
{
"id": "054968bf-26fa-490e-968e-49f29f85bb44",
"type": "paragraph",
"parentId": null,
"attrs": null,
"children": [{"text": "야간 배치 시작", "marks": [{"type": "bold"}]}]
}
],
"author": {
"user_id": "37b6a1ef-35c3-454b-b610-929e5fc99384",
"full_name": "배포 알림",
"email": "37b6a1ef-35c3-454b-b610-929e5fc99384@hooks.collabops.bot"
}
}
],
"has_more": true,
"next_after_cursor": "01a12efa-1da6-75f1-b4e2-6d3349b44b8e"
}| 필드 | 설명 |
|---|---|
messages | 메시지 배열. 쪽은 오래된 범위부터 차례로 넘어가지만 한 쪽 안의 순서는 정해져 있지 않으므로 created_at 으로 정렬해 쓰세요. |
has_more | 같은 범위에 메시지가 더 있으면 true. |
next_after_cursor | 다음 쪽을 받을 때 after 로 넘길 값. 더 없으면 null. |
메시지 하나
| 필드 | 설명 |
|---|---|
id | 메시지 ID. |
parent_message_id | 스레드 답글이면 원글의 메시지 ID. 지금은 답글이 목록에 나오지 않아 늘 null 입니다. |
type | user 는 사람·봇이 쓴 글, system 은 멤버 추가 같은 안내입니다. system 은 blocks 가 null 입니다. 값이 늘어날 수 있으니 모르는 값은 건너뛰세요. |
created_at · edited_at | 쓴 시각과 마지막으로 고친 시각 (UTC). |
deleted_at | 삭제된 메시지면 삭제 시각. 이때 blocks 는 null 입니다. |
reply_count | 스레드 답글 수. |
blocks | 본문. 수신 웹훅의 blocks 형식과 같은 모양이고, 값이 없는 칸은 null 로 옵니다. 받은 그대로 다시 보낼 수 있습니다. 모양은 표현 레퍼런스에 있습니다. |
author | 쓴 사람의 user_id · full_name · email. 웹훅이 쓴 글은 웹훅 이름과 봇 전용 주소가 옵니다. 찾지 못하면 null. |
리액션과 첨부 파일은 싣지 않습니다.
다음 쪽 받기
has_more 가 true 면 같은 since · until 에 next_after_cursor 를 after 로 더해 다시 부릅니다. until 을 생략하면 부를 때마다 "지금" 이 바뀌므로, 여러 쪽을 받을 때는 첫 요청부터 until 을 적어 범위를 고정하세요.
# 첫 쪽 — 범위를 고정해 둔다
SINCE="2026-10-12T09:00:00+09:00"
UNTIL="2026-10-12T18:00:00+09:00"
curl -sS -G "https://collabops.ai/api/v2/integration/webhook/<토큰>/messages" -H "Authorization: Bearer <시크릿>" \
--data-urlencode "since=$SINCE" --data-urlencode "until=$UNTIL" > page1.json
# 다음 쪽 — 같은 since·until 에 after 만 더한다
AFTER=$(sed -n 's/.*"next_after_cursor":"\([^"]*\)".*/\1/p' page1.json)
curl -sS -G "https://collabops.ai/api/v2/integration/webhook/<토큰>/messages" -H "Authorization: Bearer <시크릿>" \
--data-urlencode "since=$SINCE" --data-urlencode "until=$UNTIL" \
--data-urlencode "after=$AFTER" > page2.json7일보다 긴 기간은 7일씩 끊어서 차례로 읽습니다.
오류 응답
오류 본문은 보낼 때와 같은 모양입니다 (수신 웹훅 — 오류 응답). error.title 의 사유로 원인을 가립니다.
| 상태 | 언제 | 어떻게 하나 |
|---|---|---|
| 401 | 시크릿이 틀렸거나, 웹훅이 꺼져 있거나, 읽기 허용이 꺼져 있을 때. 읽기 허용이 꺼져 있으면 error.title 이 read not allowed 로 끝납니다. | 시크릿을 고치거나 웹훅·읽기 허용을 켭니다. |
| 403 | 웹훅의 채널을 읽을 수 없을 때 (채널이 삭제된 경우 등) | 채널 상태를 확인합니다. |
| 404 | URL 의 토큰에 해당하는 웹훅이 없을 때 | 새로 발급한 URL 로 부릅니다. |
| 422 | since 가 없거나 형식이 틀렸을 때, since 가 until 보다 늦을 때, 간격이 7일을 넘을 때, limit 이 1~100 밖일 때 | 쿼리를 고칩니다. |
| 429 | 웹훅 하나에 분당 10회를 넘었을 때. 보내기 한도(분당 60회)와 따로 셉니다. | Retry-After 헤더의 초만큼 기다린 뒤 부릅니다. |
| 503 · 502 · 504 | 일시적인 내부 오류나 응답 지연 | 잠시 뒤 다시 부릅니다. |
읽기 요청은 전송 기록에 남지 않습니다.