---
title: "The unified thread of a person (any relationship type), a page at a time"
method: GET
path: "/api/v1/contacts/{id}/thread"
---

# The unified thread of a person (any relationship type), a page at a time

`GET /api/v1/contacts/{id}/thread`

## Request

- Base URL: `https://memchats.com`
- URL: `https://memchats.com/api/v1/contacts/{id}/thread`
- Auth: HTTP bearer

Chat bubbles oldest first (copied replies included as `status: assumed`), `hasMore` for older pages, the negotiations anchored in this page and, on the first page (no `before`), the OPEN one: the latest negotiation with nothing chosen and no message of theirs since. Plus the person: `family` is `dating` (dating relationship or dating card) or `other`.

## Path parameters

- `id` integer, required

## Query parameters

- `before` integer
- `limit` integer

## Response `200`

One page

- object
  - `messages` ThreadMessage[]
    - `id` integer
    - `from` 'me' | 'them'
    - `text` string
    - `sentAt` string, date-time
    - `timeKnown` boolean: false: the time was not seen (screenshot without times, or typed without one); sentAt only keeps the order.
    - `language` string, nullable: ISO 639-1 of the text, when it can be told.
    - `status` 'sent' | 'assumed': `assumed`: a reply copied from a proposal, not yet seen sent (shown dashed, "Copiada · pendiente de confirmar").
    - `proposalId` integer, nullable: The negotiation (its root round id) this bubble belongs to: on an assumed bubble and on a real message matched to a choice.
    - `edit` object, nullable: Only when the real message is an edit of the copied text ("La cambiaste").
      - `copiedText` string
      - `note` string, nullable
  - `hasMore` boolean
  - `negotiations` Negotiation[]
    - `rootId` integer
    - `theirMessage` string, nullable
    - `myTake` string, nullable
    - `rounds` ProposalRound[]: Ascending.
      - `id` integer
      - `rootId` integer
      - `round` integer
      - `intent` 'open' | 'reply' | 'revive' | 'propose_date'
      - `request` string, nullable: The refinement asked in this round; null on round 1.
      - `analysis` string, nullable: "Mi lectura": 1-3 honest sentences, in the user's language.
      - `variants` object[]: 2 or 3 drafts of distinct tone (dating: direct, playful, curious; others: direct, warm, careful).
        - `text` string
        - `tone` string
      - `language` string, nullable
      - `createdAt` string, date-time
    - `chosen` object, nullable
      - `roundId` integer
      - `variant` integer
      - `text` string
      - `at` string, date-time
    - `outcome` 'verbatim' | 'edited' | 'not_found', nullable
    - `anchorMessageId` integer, nullable: The message the collapsed marker sits above: the assumed bubble, then the real one once matched; null when nothing was chosen or it was not sent.
    - `createdAt` string, date-time
  - `contact` object
    - `id` integer
    - `name` string
    - `relationshipType` string, nullable
    - `family` 'dating' | 'other'
    - `avatarUrl` string, nullable

## Other responses

- `400`: Invalid paging
- `404`: Not one of the account's contacts (code contact_not_found)

---

[API](https://skmtc.dev/memchats/apis/memchats-api.md) · [All operations](https://skmtc.dev/memchats/apis/memchats-api/llms.txt) · [OpenAPI document](https://skmtc.dev/memchats/apis/memchats-api/revisions/e62bca06f785?raw)
