---
title: "A reply proposal for a person, or a refinement round of one"
method: POST
path: "/api/v1/contacts/{id}/replies"
---

# A reply proposal for a person, or a refinement round of one

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

## Request

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

Without `rootId`: a new negotiation; `theirMessage` is stored first as THEIR message at the end of the thread (not twice), then round 1 is written ("Mi lectura" plus 2-3 variants). With `rootId` and `request`: round n+1 with the previous rounds as context (at most 10 rounds). Dating persons spend one monthly dating proposal (demo: one of five per session); everyone else one weekly Alma analysis (degrading to the lighter model where the plan says so). Out of quota: the existing 429 shapes, nothing stored. Old builds keep /suggest-message and /alma/respond.

## Path parameters

- `id` integer, required

## Request body

- object
  - `theirMessage` string, nullable: "Lo que me ha dicho". New negotiation only.
  - `myTake` string, nullable: "Qué opino / qué quiero conseguir".
  - `intent` 'open' | 'reply' | 'revive' | 'propose_date', nullable: Default `reply`, or `open` on an empty thread. A refinement keeps the negotiation's.
  - `rootId` integer, nullable: Refine this negotiation (its first round id).
  - `request` string, nullable: The refinement ("Más corto", "tenle en cuenta que mañana viajo"). Required with rootId.
  - `charLimitOverride` integer, nullable: Dating only: a forced length.

## Response `200`

The negotiation with the new round

- object
  - `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 a refinement without `request` (code request_required)
- `404`: Not one of the account's contacts, or `rootId` is not a negotiation of this person (code negotiation_not_found)
- `409`: Too many rounds (code too_many_rounds)
- `429`: Out of quota: the dating proposals shape, the weekly Alma limit (with resetsAt), or the demo's five per session
- `502`: The model failed (code proposal_failed); a dating proposal is given back

---

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