Messages and translation

Send a message

POST /v1/matches/{match_id}/messages
{ "from": "user-123", "text": "Привет! Как прошли выходные?" }

The response is the message as the sender sees it:

{
  "id": "…",
  "from": "me",
  "text": "Привет! Как прошли выходные?",
  "translated": false,
  "lang": "ru",
  "created_at": "2026-10-24T12:00:00Z"
}

Text must be 1 to 4000 characters. Text only: photos and voice messages are not supported in version 0.14.

New members

In their first 7 days in the network, a member can start at most 20 conversations a day. Beyond that, the network returns 429 first_messages_limit. Replying in conversations that have already started is unlimited. Tell the person they can start new conversations tomorrow.

Receive a message

The other person’s platform receives a message.created event once the translation is ready:

{
  "id": "evt_…",
  "type": "message.created",
  "data": {
    "match_id": "…",
    "to": "john-77",
    "message": {
      "id": "…",
      "from": "6f1c2b4e-…",
      "text": "Hi! How was your weekend?",
      "text_original": "Привет! Как прошли выходные?",
      "translated": true,
      "lang": "en",
      "created_at": "2026-10-24T12:00:00Z",
      "suspicious": false,
      "flags": []
    }
  }
}

How translation works

  1. The network detects the message language; short replies are matched against the author’s languages.
  2. If the recipient doesn’t speak it (it’s not in the recipient’s languages), the network translates it into the recipient’s primary language — the first in languages — preserving tone, emoji and style.
  3. The recipient sees the translation, and the original on tap.

Translation runs in the background: message.created goes to the other person once the translation is ready, so the message arrives already translated. If translation fails, the message is still delivered — in the original, with translated: false.

Matches across languages are possible only if both members turned on “open to chatting in other languages”. For those who haven’t, the network doesn’t show people without a shared language.

How to display a translation

  • An “AI-translated” label under the message.
  • Tap or long press shows the original (text_original).
  • Nothing needs to be translated in the input field: the user writes in their own language.

Scam signals

The network checks every message for simple signs of fraud:

Flag What it means
link A link early in the conversation
phone A phone number early in the conversation
messenger An invitation to another messenger early in the conversation
money Talk about money
mass_text The same text in several other matches within a day — only together with another flag: identical greeting templates are not flagged

The message is delivered anyway, with suspicious: true and a list of flags:

"message": { "id": "…", "text": "Text me on Telegram, it's easier", "suspicious": true, "flags": ["messenger"], … }

Show the recipient a warning next to the message. For example: “This person is asking you to move to another messenger. Scammers often do this — don’t send money and don’t open unfamiliar links.” Only messages from the other side carry signals; your user’s own messages never do.

Read receipts

POST /v1/matches/{match_id}/read
{ "as": "user-123", "up_to": "<message id>" }

The member has read the conversation up to and including this message. Take the id from message.created or the history. The response is 204. The other person’s platform receives a message.read event with up_to and read_at and can show “read” to its user.

History

GET /v1/matches/{match_id}/messages?as=user-123&limit=50

Newest first. The other person’s messages are in the language of as, with the original and scam signals. Your user’s own messages carry read_at once the other person has read them. For older messages, pass before=<id of the oldest message>.

History is for recovery after a failure or for new devices. The network retains ordinary messages for up to 90 days from sending; store the full history on your side based on events. If an erased chat has a report, a separate hidden moderation copy is retained for 90 days from erasure; it is not user-accessible history.

Unclear? Ask a developer

Read the reply and continue the conversation on this site using the private link you receive after sending. Incoming email is not accepted.