> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.heyreach.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.heyreach.io/_mcp/server.

# GetConversationsV3

POST https://api//api/public/inbox/GetConversationsV3
Content-Type: application/json

## Get a cursor-paginated collection of LinkedIn conversations. Up to 100 items per request.

Successor to **GetConversationsV2**. Two differences matter:

* **Paging is cursor-based, not offset-based.** There is no `offset` - pass the `nextCursor` from the previous response as `cursor` to fetch the next page. This removes the deep-paging limit that **GetConversationsV2** runs into on large inboxes.

* **`correspondentProfile` no longer carries email or custom fields.** The `emailAddress`, `enrichedEmailAddress`, `customEmailAddress` and `customFields` keys are not returned by this endpoint. The three email keys were already always `null` on **GetConversationsV2**. Use `/api/public/lead/GetLead` when you need them.

### Body Parameters

* **limit** *(int, optional)*: Page size, 1-100. Defaults to `10`.

* **cursor** *(string, optional)*: Opaque cursor taken from a previous response's `nextCursor`. Omit or send `null` for the first page.

* **from** *(datetime, optional)*: Lower bound on `lastMessageAt`, UTC. Omit for no lower bound.

* **to** *(datetime, optional)*: Upper bound on `lastMessageAt`, UTC. **Defaults to the current UTC time** when omitted. A `from` later than `to` is rejected with 400 `From must not be later than To.`

* **filters** *(object, optional)*

  * **linkedInAccountIds** (int\[]): The ids of the LinkedIn senders.

  * **campaignIds** (long\[])

  * **searchString** (string, optional)

  * **leadLinkedInId** (string, optional): The LinkedIn ID of the lead. You can find this ID as "linkedin\_id" in the response of many of our endpoints, for example in the '/api/public/lead/GetLead' endpoint. Cannot be combined with `leadProfileUrl`.

  * **leadProfileUrl** (string, optional): The LinkedIn URL of the lead. Cannot be combined with `leadLinkedInId`.

  * **tags** (string\[]): Case-insensitive list of lead tags. Only the conversations of leads that have at least one of the tags are returned. Every tag must already exist.

  * **latestAutoTagNames** (string\[]): Filter by the lead's most recent auto tag.

  * **seen** (bool, optional): `true` for read conversations, `false` for unread, `null` for both.

### Paging

Conversations are sorted by `lastMessageAt` descending, then `linkedInAccountId` ascending. Keep calling the endpoint with the returned `nextCursor` for as long as `hasNextPage` is `true`; `nextCursor` is `null` on the last page. `totalCount` is the total number of matching conversations, not the size of the current page. Treat the cursor as opaque - do not build or edit it yourself, an unparseable value returns 400 `Invalid cursor format.`

### Response fields

* **items** *(array)*: The conversations for this page.

* **totalCount** *(long)*: Total matching conversations across all pages.

* **nextCursor** *(string)*: Cursor for the next page, `null` when there are no more pages.

* **hasNextPage** *(bool)*

`items[].campaignId` is omitted entirely when the conversation is not tied to a campaign.

### Errors

All of the following return **400** with body `{ "errorMessage": "..." }`:

* `Invalid cursor format.`

* `Only one of LeadId or LeadProfileUrl parameters can be used at a time.`

* `'<url>' is invalid profile url.`

* `Lead with profile url: '<url>' does not exist`

* `Invalid LinkedIn Account Id is provided in the LinkedInAccountIds property`

* `The campaign you are trying to open does not exist.`

* `Cannot filter with Tags because the following tags do not exist: <names>`

* `Auto tag name is not supported, AutoTagName: <name>`

Reference: https://docs.heyreach.io/hey-reach-api/inbox/get-conversations-v-3

## Request

### Headers

- `X-API-KEY` (string, optional) — API key header using this scheme. Example: "X-API-KEY: \{API\_KEY}"

### Body (application/json)

This endpoint expects an object.

- `limit` (integer, required)
- `from` (datetime, required)
- `to` (datetime, required)
- `filters` (object, required)
  - `linkedInAccountIds` (list of any, required)
  - `campaignIds` (list of any, required)
  - `searchString` (string, required)
  - `tags` (list of any, required)
  - `latestAutoTagNames` (list of any, required)
  - `leadLinkedInId` (any, optional, nullable)
  - `leadProfileUrl` (any, optional, nullable)
  - `seen` (any, optional, nullable)
- `cursor` (any, optional, nullable)

## Response

### 200

OK

- `items` (list of object, required)
  - `id` (string, required)
  - `read` (boolean, required)
  - `groupChat` (boolean, required)
  - `blockedByMe` (boolean, required)
  - `blockedByParticipant` (boolean, required)
  - `lastMessageAt` (datetime, required)
  - `lastMessageText` (string, required)
  - `lastMessageType` (string, required)
  - `lastMessageSender` (string, required)
  - `totalMessages` (integer, required)
  - `campaignId` (integer, required)
  - `linkedInAccountId` (integer, required)
  - `correspondentProfile` (object, required)
    - `id` (string, required)
    - `linkedin_id` (string, required)
    - `profileUrl` (string, required)
    - `firstName` (string, required)
    - `lastName` (string, required)
    - `headline` (string, required)
    - `imageUrl` (string, required)
    - `location` (string, required)
    - `companyName` (string, required)
    - `companyUrl` (string, required)
    - `position` (string, required)
    - `about` (string, required)
    - `connections` (integer, required)
    - `followers` (integer, required)
    - `tags` (list of string, required)
    - `autoTags` (list of object, required)
      - `name` (string, required)
      - `campaignId` (integer, required)
      - `campaignName` (string, required)
      - `linkedInAccountId` (string, required)
      - `linkedInAccountFullName` (string, required)
      - `creationTime` (datetime, required)
  - `linkedInAccount` (object, required)
    - `id` (integer, required)
    - `emailAddress` (string, required)
    - `firstName` (string, required)
    - `lastName` (string, required)
    - `authIsValid` (boolean, required)
    - `isValidNavigator` (boolean, required)
    - `isValidRecruiter` (boolean, required)
    - `profileUrl` (string, required)
  - `messages` (list of object, required)
    - `createdAt` (datetime, required)
    - `body` (string, required)
    - `subject` (string, required)
    - `postLink` (string, required)
    - `isInMail` (boolean, required)
    - `sender` (string, required)
- `totalCount` (integer, required)
- `nextCursor` (string, required)
- `hasNextPage` (boolean, required)

## Errors

### 400 Get Conversations V3inbox Request Bad Request Error

Bad Request

- `errorMessage` (string, required)

## Examples

**Request**

```json
{
  "limit": 10,
  "from": "2026-07-01T00:00:00Z",
  "to": "2026-07-30T23:59:59Z",
  "filters": {
    "linkedInAccountIds": [],
    "campaignIds": [],
    "searchString": "",
    "tags": [],
    "latestAutoTagNames": []
  }
}
```

**Response**

```json
{
  "items": [
    {
      "id": "string",
      "read": true,
      "groupChat": false,
      "blockedByMe": false,
      "blockedByParticipant": false,
      "lastMessageAt": "2026-07-29T12:00:19Z",
      "lastMessageText": "string",
      "lastMessageType": "TEXT",
      "lastMessageSender": "ME",
      "totalMessages": 1,
      "campaignId": 12345,
      "linkedInAccountId": 0,
      "correspondentProfile": {
        "id": "string",
        "linkedin_id": "string",
        "profileUrl": "string",
        "firstName": "string",
        "lastName": "string",
        "headline": "string",
        "imageUrl": "string",
        "location": "string",
        "companyName": "string",
        "companyUrl": "string",
        "position": "string",
        "about": "string",
        "connections": 0,
        "followers": 0,
        "tags": [
          "string"
        ],
        "autoTags": [
          {
            "name": "string",
            "campaignId": 12345,
            "campaignName": "string",
            "linkedInAccountId": "string",
            "linkedInAccountFullName": "string",
            "creationTime": "2026-07-29T12:00:19Z"
          }
        ]
      },
      "linkedInAccount": {
        "id": 0,
        "emailAddress": "string",
        "firstName": "string",
        "lastName": "string",
        "authIsValid": true,
        "isValidNavigator": true,
        "isValidRecruiter": true,
        "profileUrl": "https://www.linkedin.com/in/john_doe-12b36a384"
      },
      "messages": [
        {
          "createdAt": "2026-07-29T12:00:19Z",
          "body": "string",
          "subject": "string",
          "postLink": "string",
          "isInMail": false,
          "sender": "ME"
        }
      ]
    }
  ],
  "totalCount": 137,
  "nextCursor": "WzE3NTQwMDAwMDAwMDAsMTIzNF0=",
  "hasNextPage": true
}
```

**SDK Code**

```python
import requests

url = "https://api//api/public/inbox/GetConversationsV3"

payload = {
    "limit": 10,
    "from": "2026-07-01T00:00:00Z",
    "to": "2026-07-30T23:59:59Z",
    "filters": {
        "linkedInAccountIds": [],
        "campaignIds": [],
        "searchString": "",
        "tags": [],
        "latestAutoTagNames": []
    }
}
headers = {
    "X-API-KEY": "{{HR_API_KEY}}",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api//api/public/inbox/GetConversationsV3';
const options = {
  method: 'POST',
  headers: {'X-API-KEY': '{{HR_API_KEY}}', 'Content-Type': 'application/json'},
  body: '{"limit":10,"from":"2026-07-01T00:00:00Z","to":"2026-07-30T23:59:59Z","filters":{"linkedInAccountIds":[],"campaignIds":[],"searchString":"","tags":[],"latestAutoTagNames":[]}}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api//api/public/inbox/GetConversationsV3"

	payload := strings.NewReader("{\n  \"limit\": 10,\n  \"from\": \"2026-07-01T00:00:00Z\",\n  \"to\": \"2026-07-30T23:59:59Z\",\n  \"filters\": {\n    \"linkedInAccountIds\": [],\n    \"campaignIds\": [],\n    \"searchString\": \"\",\n    \"tags\": [],\n    \"latestAutoTagNames\": []\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("X-API-KEY", "{{HR_API_KEY}}")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api//api/public/inbox/GetConversationsV3")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '{{HR_API_KEY}}'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"limit\": 10,\n  \"from\": \"2026-07-01T00:00:00Z\",\n  \"to\": \"2026-07-30T23:59:59Z\",\n  \"filters\": {\n    \"linkedInAccountIds\": [],\n    \"campaignIds\": [],\n    \"searchString\": \"\",\n    \"tags\": [],\n    \"latestAutoTagNames\": []\n  }\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api//api/public/inbox/GetConversationsV3")
  .header("X-API-KEY", "{{HR_API_KEY}}")
  .header("Content-Type", "application/json")
  .body("{\n  \"limit\": 10,\n  \"from\": \"2026-07-01T00:00:00Z\",\n  \"to\": \"2026-07-30T23:59:59Z\",\n  \"filters\": {\n    \"linkedInAccountIds\": [],\n    \"campaignIds\": [],\n    \"searchString\": \"\",\n    \"tags\": [],\n    \"latestAutoTagNames\": []\n  }\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api//api/public/inbox/GetConversationsV3', [
  'body' => '{
  "limit": 10,
  "from": "2026-07-01T00:00:00Z",
  "to": "2026-07-30T23:59:59Z",
  "filters": {
    "linkedInAccountIds": [],
    "campaignIds": [],
    "searchString": "",
    "tags": [],
    "latestAutoTagNames": []
  }
}',
  'headers' => [
    'Content-Type' => 'application/json',
    'X-API-KEY' => '{{HR_API_KEY}}',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api//api/public/inbox/GetConversationsV3");
var request = new RestRequest(Method.POST);
request.AddHeader("X-API-KEY", "{{HR_API_KEY}}");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"limit\": 10,\n  \"from\": \"2026-07-01T00:00:00Z\",\n  \"to\": \"2026-07-30T23:59:59Z\",\n  \"filters\": {\n    \"linkedInAccountIds\": [],\n    \"campaignIds\": [],\n    \"searchString\": \"\",\n    \"tags\": [],\n    \"latestAutoTagNames\": []\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "X-API-KEY": "{{HR_API_KEY}}",
  "Content-Type": "application/json"
]
let parameters = [
  "limit": 10,
  "from": "2026-07-01T00:00:00Z",
  "to": "2026-07-30T23:59:59Z",
  "filters": [
    "linkedInAccountIds": [],
    "campaignIds": [],
    "searchString": "",
    "tags": [],
    "latestAutoTagNames": []
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api//api/public/inbox/GetConversationsV3")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```