---
title: "Get a WhatsApp group thread with messages and participants"
method: GET
path: "/v2/groups/{id}"
tags: ["WhatsApp Groups"]
---

# Get a WhatsApp group thread with messages and participants

`GET /v2/groups/{id}`

## Request

- Base URL: `https://api.spurnow.com`
- URL: `https://api.spurnow.com/v2/groups/{id}`
- Auth: HTTP bearer

## Path parameters

- `id` number, required

## Query parameters

- `cursor` number
- `limit` number

## Response `200`

- GroupThreadResponseDto
  - `group` GroupConversationDto, required
    - `id` number, required
    - `metaGroupId` string, nullable, required
    - `channelId` number, required
    - `requestId` string, nullable, required
    - `subject` string, nullable, required
    - `description` string, nullable, required
    - `notes` string, nullable, required: Internal group-level notes used as AI context. Never sent to WhatsApp.
    - `inviteLink` string, nullable, required
    - `profilePictureUrl` string, nullable, required: S3 URL of the group icon Meta accepted. Rendered by the UI; Meta stores its own copy for delivery to WhatsApp. Null if never set or if a subsequent update was rejected by Meta.
    - `lifecycleStatus` 'creating' | 'active' | 'suspended' | 'deleted', required
    - `conversationStatus` 'OPEN' | 'CLOSED', required
    - `assignedAgentId` number, nullable, required
    - `assignedTeamId` number, nullable, required
    - `lastMessageAt` string, date-time, nullable, required
    - `agentLastSeenAt` string, date-time, nullable, required
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `lastInboundMessageAt` string, date-time, nullable, required: Latest inbound participant message timestamp. The WhatsApp group customer service window is measured from this value.
  - `messages` GroupMessageDto[], required
    - `id` number, required
    - `direction` 'inbound' | 'outbound', required
    - `participantWaId` string, nullable, required
    - `sendingUserId` number, nullable, required
    - `aiAgentId` number, nullable
    - `metaMessageId` string, nullable, required
    - `content` object, required: Raw inbound Meta WhatsApp message object with its type-specific payload.
    - `errorCode` number, nullable, required
    - `errorMessage` string, nullable, required: Human-readable mapping of errorCode (group-specific 1312xx codes and common send failures). Null when the message has no error.
    - `errorTimestamp` string, date-time, nullable, required
    - `sentAt` string, date-time, nullable, required
    - `deliveredAt` string, date-time, nullable, required
    - `readAt` string, date-time, nullable, required
    - `pinnedAt` string, date-time, nullable, required
    - `pinnedUntil` string, date-time, nullable, required
    - `participantReceipts` object, required: Receipt timestamps keyed by participant wa_id: { "<wa_id>": { deliveredAt, readAt } }.
    - `reactions` GroupMessageReactionDto[], required: Active participant and business reactions. Removal tombstones are not exposed.
      - `actorType` 'business' | 'participant', required
      - `contactId` number, nullable, required
      - `participantWaId` string, nullable, required
      - `userId` number, nullable, required
      - `reaction` string, required: The active emoji reaction from this actor.
      - `reactedAt` string, date-time, required
      - `eventMessageId` string, required: Meta message id for the reaction action.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `pinnedMessages` GroupMessageDto[], required: Currently active pinned messages, ordered by parent-message chronology newest first.
    - `id` number, required
    - `direction` 'inbound' | 'outbound', required
    - `participantWaId` string, nullable, required
    - `sendingUserId` number, nullable, required
    - `aiAgentId` number, nullable
    - `metaMessageId` string, nullable, required
    - `content` object, required: Raw inbound Meta WhatsApp message object with its type-specific payload.
    - `errorCode` number, nullable, required
    - `errorMessage` string, nullable, required: Human-readable mapping of errorCode (group-specific 1312xx codes and common send failures). Null when the message has no error.
    - `errorTimestamp` string, date-time, nullable, required
    - `sentAt` string, date-time, nullable, required
    - `deliveredAt` string, date-time, nullable, required
    - `readAt` string, date-time, nullable, required
    - `pinnedAt` string, date-time, nullable, required
    - `pinnedUntil` string, date-time, nullable, required
    - `participantReceipts` object, required: Receipt timestamps keyed by participant wa_id: { "<wa_id>": { deliveredAt, readAt } }.
    - `reactions` GroupMessageReactionDto[], required: Active participant and business reactions. Removal tombstones are not exposed.
      - `actorType` 'business' | 'participant', required
      - `contactId` number, nullable, required
      - `participantWaId` string, nullable, required
      - `userId` number, nullable, required
      - `reaction` string, required: The active emoji reaction from this actor.
      - `reactedAt` string, date-time, required
      - `eventMessageId` string, required: Meta message id for the reaction action.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
  - `participants` GroupParticipantDto[], required
    - `id` number, required
    - `waId` string, required
    - `contactId` number, nullable, required
    - `contact` GroupParticipantContactDto, required
      - `id` number, required
      - `name` string, nullable, required
      - `number` string, nullable, required
      - `profilePicUrl` string, nullable, required
    - `joinedAt` string, date-time, nullable, required
    - `removedAt` string, date-time, nullable, required
    - `removedBy` 'business' | 'participant', nullable, required: Who initiated the removal: `business` (removed from Spur / by the business) or `participant` (left on their own). Null while the participant is active or when the initiator is unknown.
  - `ticketEvents` GroupTicketEventDto[], required: All lifecycle events (open, close, reopen, assignment) recorded for this group, oldest → newest. Volume is intentionally low so pagination is not needed; new events after load arrive via the `groupAssignmentUpdate` socket event.
    - `id` number, required
    - `type` 'OPEN' | 'CLOSE' | 'REOPEN' | 'ASSIGNMENT', required
    - `data` object, required: Rendered event payload — `{ msg, agentMessage?, teamMessage?, agentId?, teamId? }` — the same shape TicketEvents rows carry for 1:1 threads. Rendered inline in the timeline.
    - `timestamp` string, date-time, required
    - `authorId` number, nullable, required
  - `hasMoreBefore` boolean, required
  - `cursor` number, nullable, required

## Other responses

- `404`: Group conversation not found in this workspace.

---

[API](https://skmtc.dev/spurnow/apis/spur-apis.md) - [All operations](https://skmtc.dev/spurnow/apis/spur-apis/llms.txt) - [OpenAPI document](https://skmtc.dev/spurnow/apis/spur-apis/revisions/27ca7bf002cb?raw)
