채널
채널은 고객과 주고받는 상담의 단위입니다. 이 문서는 상담 목록과 단건 정보를 읽는 조회 API를 설명합니다. 상담의 메시지는 메시지에서, 상담을 닫거나 배정하는 쓰기 작업은 메시지·채널 쓰기에서 다룹니다.
목록 조회
GET /channels — 채널 목록을 cursor pagination으로 조회합니다.
- Scope:
channels:read - 쿼리:
limit(기본 50, 최대 100),cursor,tags,tag_match
삭제되지 않은 모든 채널을 상태에 관계없이 created_at 내림차순(최신 먼저)으로 반환합니다. 서버에는 상태 필터 파라미터가 없으므로, 특정 상태만 필요하면 응답의 status로 직접 거르세요.
태그 필터
| 쿼리 | 값 |
|---|---|
tags | 상담 태그 이름을 쉼표로 구분합니다(예: tags=환불요청,VIP). 이름 앞뒤 공백은 무시하고, 대소문자는 구분합니다. 값이 비어 있으면(?tags=) 필터를 적용하지 않습니다. |
tag_match | any(기본): 나열한 태그 중 하나라도 붙은 상담. all: 나열한 태그가 전부 붙은 상담. 그 외 값은 400 INVALID_QUERY이며, tags 없이 보내도 값이 틀리면 400입니다. |
쉼표로 나눈 뒤 남는 이름이 하나도 없으면(?tags=,,, ?tags=%20) 필터를 조용히 무시하고 전체 목록을 돌려주는 대신 400 INVALID_QUERY를 반환합니다. 카탈로그에 없는 이름으로 거르면 오류가 아니라 빈 결과가 나옵니다. 태그 이름 목록은 상담 태그에서 조회합니다.
cursor와 함께 쓸 때: meta.next_cursor로 다음 페이지를 받을 때 tags·tag_match를 다시 보내야 합니다. cursor는 목록에서의 위치만 담고 필터 조건은 담지 않으므로, cursor만 보내면 필터가 풀린 전체 목록이 이어집니다.
아래 명령은 환불요청과 VIP가 모두 붙은 상담을 조회합니다.
curl "https://api.talk.zeroworks.ai/api/public/v1/channels?tags=환불요청,VIP&tag_match=all" \
-H "Authorization: Bearer ztpat_..."
필터 없이 한 번에 50건씩 읽는 명령은 다음과 같습니다.
curl "https://api.talk.zeroworks.ai/api/public/v1/channels?limit=50" \
-H "Authorization: Bearer ztpat_..."
응답
{
"success": true,
"data": [
{
"id": "c1d2e3f4-...",
"type": "user_chat",
"provider": "kakao",
"status": "open",
"contact_id": "a1b2c3d4-...",
"assigned_member_id": "m1n2o3-...",
"assigned_type": "human",
"tags": [],
"last_message_at": "2026-05-01T10:00:00Z",
"message_count": 12,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-05-01T10:00:00Z"
}
],
"meta": { "has_more": false }
}
has_more가 true이면 meta.next_cursor가 함께 내려옵니다. 이 값을 cursor 쿼리로 넘겨 다음 페이지를 받으세요. 자세한 규칙은 페이지네이션을 참고하세요.
응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
id | string | 채널 UUID |
type | string | user_chat | team | direct | group. 공개 API로 볼 수 있는 상담 채널은 대부분 user_chat입니다. |
provider | string | 상담이 들어온 경로. native | web | kakao | naver | email | line | whatsapp | instagram | messenger | sms | voice | board | api |
status | string | 상담 상태. open | snoozed | closed | pending(워크플로가 응대 중인 단계) | abandoned(고객이 답하지 않아 워크플로 응대가 끝난 상태) |
name, description | string | 채널 이름과 설명. 값이 없으면 키가 생략됩니다. |
contact_id | string | 이 상담의 고객(연락처) UUID. 값이 없으면 키가 생략됩니다. |
assigned_member_id | string | 배정된 상담원의 멤버 ID. 값이 없으면 키가 생략됩니다. |
assigned_type | string | 배정 주체. ai | human | workflow. 미배정 채널에서는 키가 생략됩니다. |
tags | string[] | 이 상담에 붙어 있는 상담 태그 이름 배열. 없으면 빈 배열이며 키는 항상 있습니다. 워크스페이스 전체 태그 목록은 상담 태그에서 조회합니다. |
last_message_at | string | 마지막 메시지 시각(RFC3339). 값이 없으면 키가 생략됩니다. |
message_count | integer | 채널의 메시지 수 |
snoozed_until | string | 스누즈를 해제하는 시각(RFC3339). 값이 없으면 키가 생략됩니다. |
created_at | string | 생성 시각(RFC3339) |
updated_at | string | 마지막 수정 시각(RFC3339) |
값이 없는 선택 필드는 null이 아니라 키 자체가 생략됩니다. "key" in obj로 존재 여부를 판별하세요.
단건 조회
GET /channels/{id} — 채널 하나를 조회합니다. {id}는 채널 UUID입니다.
- Scope:
channels:read
curl "https://api.talk.zeroworks.ai/api/public/v1/channels/c1d2e3f4-..." \
-H "Authorization: Bearer ztpat_..."
응답 — data에 목록 조회와 같은 필드의 채널 객체 하나가 들어 있습니다. 아래는 배정·메시지가 없는 채널의 예시입니다.
{ "success": true, "data": { "id": "c1d2e3f4-...", "type": "user_chat", "status": "open", "provider": "kakao", "tags": [], "message_count": 12, "created_at": "2026-01-01T00:00:00Z", "updated_at": "2026-05-01T10:00:00Z" } }
오류
| HTTP | code | 발생 조건 |
|---|---|---|
| 400 | INVALID_QUERY | limit이 1~100 범위를 벗어남(값을 보정하지 않습니다), cursor가 만료되었거나 형식이 틀림, tag_match가 any·all이 아님, tags에 이름이 하나도 없음 |
| 400 | INVALID_INPUT | {id}가 UUID 형식이 아님 |
| 404 | NOT_FOUND | 채널이 없거나 이 워크스페이스에 속하지 않음, 또는 삭제됨 |
공통 오류는 에러 문서를 참고하세요.