curl --request GET \
--url https://api.goextrovert.com/client/v2/comments \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.goextrovert.com/client/v2/comments"
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/comments', 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/comments",
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/comments"
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/comments")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goextrovert.com/client/v2/comments")
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 comments
Lists one campaign’s comment feed for an owner and review state. Results include the post, author, effective prospect context, current draft, state, and only actions valid now. plannedAt fills only when the campaign spaces approved comments with a posting interval — null means posting starts right after approval. This action does not change feed state. 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/comments \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.goextrovert.com/client/v2/comments"
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/comments', 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/comments",
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/comments"
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/comments")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goextrovert.com/client/v2/comments")
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 campaign feed is being read. Often a managed account rather than the authenticated user — call user_list-shared first and pick the owner whose LinkedIn profile runs the campaign.
Campaign that scopes this feed. Aggregated cross-campaign feed is not part of this action.
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 Optional Prospect List filter. Cannot be combined with keywordId.
Optional Keyword filter. Cannot be combined with prospectListId.
Number of records requested for this page.
1 <= x <= 50Offset from the start of the filtered result set.
0 <= x <= 2147483647