curl --request POST \
--url https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"postId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ownerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"instructions": "<string>"
}
'import requests
url = "https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft"
payload = {
"postId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ownerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"instructions": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
postId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
ownerId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
campaignId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
instructions: '<string>'
})
};
fetch('https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft', 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/{postId}/generate-or-improve-draft",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'postId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'ownerId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'campaignId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'instructions' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft"
payload := strings.NewReader("{\n \"postId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"ownerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"campaignId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"instructions\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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(string(body))
}HttpResponse<String> response = Unirest.post("https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"postId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"ownerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"campaignId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"instructions\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"postId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"ownerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"campaignId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"instructions\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"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"
},
"message": "Operation completed successfully"
}{
"status": "error",
"data": null,
"message": "An error occurred while processing the request"
}Generate or improve comment draft
Generate writes a new Extrovert comment draft, including when no draft exists, using the selected campaign’s Voice, optionally steered by one-off instructions. Improve rewrites the current draft text and requires both an existing draft with text and instructions. Both modes replace the current draft text, including text the user wrote or edited, and the replaced text is not kept. One-off instructions never change the Voice. Returns the comment with its new draft text. It does not approve or post the comment; a generation that produces no text is an error, never an empty success. The comment identity is postId + ownerId and the change is owner-global: it also applies to sibling campaign activities of the same owner, even when the feed context came from one campaign.
curl --request POST \
--url https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"postId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ownerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"instructions": "<string>"
}
'import requests
url = "https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft"
payload = {
"postId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ownerId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaignId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"instructions": "<string>"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
postId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
ownerId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
campaignId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
instructions: '<string>'
})
};
fetch('https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft', 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/{postId}/generate-or-improve-draft",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'postId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'ownerId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'campaignId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'instructions' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft"
payload := strings.NewReader("{\n \"postId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"ownerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"campaignId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"instructions\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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(string(body))
}HttpResponse<String> response = Unirest.post("https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"postId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"ownerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"campaignId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"instructions\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goextrovert.com/client/v2/comments/{postId}/generate-or-improve-draft")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"postId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"ownerId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"campaignId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"instructions\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"data": {
"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"
},
"message": "Operation completed successfully"
}{
"status": "error",
"data": null,
"message": "An error occurred while processing the request"
}Authorizations
API Key for authentication
Path Parameters
Body
LinkedIn post identity inside Extrovert.
LinkedIn account owner whose comment is addressed. Often a managed account rather than the authenticated user — call user_list-shared first and pick the owner whose LinkedIn profile runs the campaign.
Accessible campaign whose Voice must be used for generation.
Generate writes a new draft; Improve rewrites the current draft text and requires instructions.
Generate, Improve Plain-text direction: optional for Generate, required for Improve.
1 - 1250