---
title: "COPIAR: choose a variant (records the copied reply as assumed sent)"
method: POST
path: "/api/v1/contacts/{id}/replies/{roundId}/choose"
---

# COPIAR: choose a variant (records the copied reply as assumed sent)

`POST /api/v1/contacts/{id}/replies/{roundId}/choose`

## Request

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

The variant's STORED text becomes my assumed bubble at the end of the thread. One choice per negotiation: choosing another variant (any round) replaces the bubble. Idempotent. When the real message arrives (typed, screenshots, exports) the bubble is replaced by it and the negotiation gets `outcome` verbatim or edited; a conversation that moved on without it gets not_found.

## Path parameters

- `id` integer, required
- `roundId` integer, required

## Request body

- object
  - `variant` integer, required

## Response `200`

Chosen

- object
  - `message` ThreadMessage: One bubble of the unified person thread (any relationship type).
    - `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
  - `negotiation` Negotiation: A reply proposal and its refinement rounds. One choice per 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

## Other responses

- `400`: Invalid body or variant (codes invalid_body, invalid_variant)
- `404`: Not a round of this person (code round_not_found)
- `409`: The real message was already matched (code already_sent)

---

[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)
