curl --request GET \
--url https://api.goextrovert.com/client/v2/main-feed \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.goextrovert.com/client/v2/main-feed"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.goextrovert.com/client/v2/main-feed', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.goextrovert.com/client/v2/main-feed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.goextrovert.com/client/v2/main-feed"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.goextrovert.com/client/v2/main-feed")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goextrovert.com/client/v2/main-feed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"comments": [
{
"postId": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"ownerId": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"author": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"linkedInUrl": "<string>",
"headline": "<string>",
"avatarUrl": "<string>"
},
"prospect": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"linkedInUrl": "<string>",
"headline": "<string>",
"avatarUrl": "<string>"
},
"engagementRoute": "Direct",
"campaign": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"prospectList": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"keyword": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"topic": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"engagementContexts": [
{
"campaign": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"prospectList": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"keyword": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"topic": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"engagementRoute": "Direct",
"prospect": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"linkedInUrl": "<string>",
"headline": "<string>",
"avatarUrl": "<string>"
}
}
],
"post": {
"text": "<string>",
"linkedInUrl": "<string>",
"publishedAt": "2025-06-30T14:02:07.456Z",
"format": "Text",
"likeCount": 4503599627370495,
"media": {
"kind": "None",
"urls": [
"<string>"
]
},
"externalLink": {
"url": "<string>",
"caption": "<string>",
"summary": "<string>"
},
"originalPost": {
"text": "<string>",
"linkedInUrl": "<string>",
"publishedAt": "2025-06-30T14:02:07.456Z",
"author": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"linkedInUrl": "<string>",
"headline": "<string>",
"avatarUrl": "<string>"
},
"media": {
"kind": "None",
"urls": [
"<string>"
]
},
"externalLink": {
"url": "<string>",
"caption": "<string>",
"summary": "<string>"
}
}
},
"draft": {
"text": "<string>",
"source": "Extrovert-generated",
"updatedAt": "2025-06-30T14:02:07.456Z"
},
"reactionBehavior": {
"behavior": "Comment only",
"reaction": null
},
"state": "Generating",
"plannedAt": "2025-06-30T14:02:07.456Z",
"completedAt": "2025-06-30T14:02:07.456Z",
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"occurredAt": "2025-06-30T14:02:07.456Z"
},
"allowedActions": [
"generate-or-improve-draft"
],
"updatedAt": "2025-06-30T14:02:07.456Z"
}
],
"pagination": {
"limit": 4503599627370495,
"offset": 4503599627370495,
"total": 4503599627370495
}
},
"message": "Operation completed successfully"
}{
"status": "error",
"data": null,
"message": "An error occurred while processing the request"
}List Main Feed comments
Lists one page of an owner’s Main Feed: the comment feed of every campaign that owner runs, merged into a single order and deduplicated so one LinkedIn post appears once even when several campaigns collected it. Each record carries the post, author, effective prospect context, current draft, state, and only the actions valid now; engagementContexts lists every campaign context the same comment is visible in. pagination.total counts the whole deduplicated owner-wide feed for the requested state, not one campaign. This action does not change feed state and never starts comment generation. After a mutation — approving or skipping a comment — restart paging from offset = 0, because a page taken at a stale offset can skip or repeat records; this matters most in Need approval, which is re-ranked on every request, while the other views are ordered by lifecycle transition time and do not reorder.
curl --request GET \
--url https://api.goextrovert.com/client/v2/main-feed \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.goextrovert.com/client/v2/main-feed"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.goextrovert.com/client/v2/main-feed', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.goextrovert.com/client/v2/main-feed",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.goextrovert.com/client/v2/main-feed"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.goextrovert.com/client/v2/main-feed")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goextrovert.com/client/v2/main-feed")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"comments": [
{
"postId": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"ownerId": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"author": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"linkedInUrl": "<string>",
"headline": "<string>",
"avatarUrl": "<string>"
},
"prospect": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"linkedInUrl": "<string>",
"headline": "<string>",
"avatarUrl": "<string>"
},
"engagementRoute": "Direct",
"campaign": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"prospectList": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"keyword": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"topic": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"engagementContexts": [
{
"campaign": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"prospectList": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"keyword": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"topic": {
"id": "8d256aa6-9b12-49a7-93ee-bf41634b5b60",
"name": "<string>"
},
"engagementRoute": "Direct",
"prospect": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"linkedInUrl": "<string>",
"headline": "<string>",
"avatarUrl": "<string>"
}
}
],
"post": {
"text": "<string>",
"linkedInUrl": "<string>",
"publishedAt": "2025-06-30T14:02:07.456Z",
"format": "Text",
"likeCount": 4503599627370495,
"media": {
"kind": "None",
"urls": [
"<string>"
]
},
"externalLink": {
"url": "<string>",
"caption": "<string>",
"summary": "<string>"
},
"originalPost": {
"text": "<string>",
"linkedInUrl": "<string>",
"publishedAt": "2025-06-30T14:02:07.456Z",
"author": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"linkedInUrl": "<string>",
"headline": "<string>",
"avatarUrl": "<string>"
},
"media": {
"kind": "None",
"urls": [
"<string>"
]
},
"externalLink": {
"url": "<string>",
"caption": "<string>",
"summary": "<string>"
}
}
},
"draft": {
"text": "<string>",
"source": "Extrovert-generated",
"updatedAt": "2025-06-30T14:02:07.456Z"
},
"reactionBehavior": {
"behavior": "Comment only",
"reaction": null
},
"state": "Generating",
"plannedAt": "2025-06-30T14:02:07.456Z",
"completedAt": "2025-06-30T14:02:07.456Z",
"error": {
"code": "<string>",
"message": "<string>",
"retryable": true,
"occurredAt": "2025-06-30T14:02:07.456Z"
},
"allowedActions": [
"generate-or-improve-draft"
],
"updatedAt": "2025-06-30T14:02:07.456Z"
}
],
"pagination": {
"limit": 4503599627370495,
"offset": 4503599627370495,
"total": 4503599627370495
}
},
"message": "Operation completed successfully"
}{
"status": "error",
"data": null,
"message": "An error occurred while processing the request"
}Authorizations
API Key for authentication
Query Parameters
LinkedIn account owner whose Main Feed is being read. Often a managed account rather than the authenticated user.
Feed view, not an exact item-state filter. Need approval may include manual generation; Pending includes accepted generation or posting. Inspect each item’s state and allowedActions.
Need approval, Pending, Error, Posted, Skipped Number of records requested for this page.
1 <= x <= 50Offset from the start of the owner-wide result set.
0 <= x <= 2147483647