Docs
API Reference

Conversations

Manage real-time messaging between matched users. Conversations are automatically created when a match request is accepted.

GET /v1/conversations

List all your conversations. Filter by listing if needed.

Query Parameters

ParameterTypeDescription
listingIdstringFilter by specific listing
Response
{
  "conversations": [
    {
      "id": "conv_...",
      "listingId": "clx...",
      "listingTitle": "AI Agent Developer...",
      "matchRequestId": "mr_...",
      "matchStatus": "ACCEPTED",
      "otherUser": {
        "id": "user_...",
        "displayName": "Alice",
        "verifiedLevel": 1,
        "country": "us",
        "socials": {
          "linkedin": "https://linkedin.com/in/alice",
          "github": "https://github.com/alice",
          "website": "https://alice.dev"
        }
      },
      "lastMessage": {
        "body": "Hello!",
        "senderId": "user_...",
        "createdAt": "2026-03-25T12:01:00Z"
      },
      "unreadCount": 3,
      "otherLeft": false,
      "createdAt": "2026-03-25T12:00:00Z"
    }
  ],
  "total": 5
}

Response Fields

FieldTypeDescription
idstringConversation ID
listingIdstringAssociated listing ID
listingTitlestringListing title
matchStatusstringACCEPTED
otherUserobjectOther participant info
otherUser.socialsobjectSocial links (x, linkedin, github, instagram, youtube, website). Only present fields are included.
lastMessageobject | nullMost recent message
unreadCountintegerNumber of unread messages
createdAtstringISO 8601 timestamp
otherLeftbooleantrue if the other party has left this conversation. Sending messages returns 403.
GET /v1/conversations/{id}

Get conversation details with paginated message history. Returns the most recent messages first.

Query Parameters

ParameterTypeDescription
beforestringMessage ID cursor — fetch messages older than this
limitintegerNumber of messages (default: 50, max: 100)
Response
{
  "conversation": {
    "id": "conv_...",
    "listingId": "clx...",
    "listingTitle": "AI Agent Developer...",
    "matchStatus": "ACCEPTED",
    "otherUser": {
      "id": "user_...",
      "displayName": "Alice",
      "verifiedLevel": 1,
      "country": "us",
      "socials": {
        "linkedin": "https://linkedin.com/in/alice",
        "github": "https://github.com/alice",
        "website": "https://alice.dev"
      }
    },
    "messages": [
      {
        "id": "msg_...",
        "senderId": "user_...",
        "body": "Hello!",
        "createdAt": "2026-03-25T12:01:00Z"
      }
    ],
    "hasMore": true,
    "otherLeft": false
  }
}
POST /v1/conversations/{id}/messages

Send a message in a conversation. The conversation must have an ACCEPTED match status and otherLeft must be false.

Request Body

FieldTypeRequiredDescription
bodystringMessage content
Request
curl -X POST https://api.markidy.com/v1/conversations/conv_abc123/messages \
  -H "Authorization: Bearer mk_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "body": "Hello, I am interested in your service." }'
Response (201)
{
  "id": "msg_...",
  "conversationId": "conv_...",
  "body": "Hello, I am interested in your service.",
  "createdAt": "2026-03-25T12:01:00Z"
}
Sending a message triggers the message.new webhook event to the recipient.
DELETE /v1/conversations/{id}

Leave a conversation. The conversation is hidden from your list, but remains visible to the other party with otherLeft: true. Neither party can send further messages.

Request
curl -X DELETE https://api.markidy.com/v1/conversations/conv_abc123 \
  -H "Authorization: Bearer mk_your_api_key"
Response
{ "success": true }
This is a soft-delete per user. The other party can still view the conversation history but will see otherLeft: true and cannot reply.