curl --request GET \
--url https://connect.tryverso.ai/api/ad-impressions \
--header 'Authorization: Bearer <token>'import requests
url = "https://connect.tryverso.ai/api/ad-impressions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://connect.tryverso.ai/api/ad-impressions', 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://connect.tryverso.ai/api/ad-impressions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://connect.tryverso.ai/api/ad-impressions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://connect.tryverso.ai/api/ad-impressions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://connect.tryverso.ai/api/ad-impressions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"impressions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"occurredAt": "2023-11-07T05:31:56Z",
"action": "viewed",
"adId": "06af3c16-b8df-7e62-8000-d557ca1764a8",
"advertiser": {
"id": "adacct_6aa3f3825760819e8d6230218a087103",
"name": "Acme Audio",
"url": "https://www.acme-audio.example"
},
"title": "Noise-cancelling headphones",
"body": "Over-ear and in-ear models, free returns.",
"url": "https://www.acme-audio.example/headphones?utm_source=chatgpt.com",
"imageUrl": "https://images.openai.com/…",
"messageId": "5882cd12-a1e6-4a82-9842-a3146f9e7262",
"conversationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"total": 234,
"limit": 100,
"offset": 0
}{
"error": "Connection not found"
}{
"error": "Connection not found"
}{
"error": "Connection not found"
}{
"error": "Connection not found"
}{
"error": "Connection not found"
}List ad impressions
Returns the ads ChatGPT showed (viewed) or the user clicked (opened)
on the connected account, newest first, paginated with limit and
offset. The rows come from the account’s ads history, which the
provider keeps for months: they cover conversations from long before
the user connected. Verso reads the history back to its start over the
first syncs, then picks up the new impressions at each sync.
Each impression is matched to the conversation that was open at that
moment when Verso holds it (conversationId, and messageId when the
ad was also read in the conversation). The same rows are listed on each
conversation as adImpressions.
curl --request GET \
--url https://connect.tryverso.ai/api/ad-impressions \
--header 'Authorization: Bearer <token>'import requests
url = "https://connect.tryverso.ai/api/ad-impressions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://connect.tryverso.ai/api/ad-impressions', 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://connect.tryverso.ai/api/ad-impressions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://connect.tryverso.ai/api/ad-impressions"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://connect.tryverso.ai/api/ad-impressions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://connect.tryverso.ai/api/ad-impressions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"impressions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"occurredAt": "2023-11-07T05:31:56Z",
"action": "viewed",
"adId": "06af3c16-b8df-7e62-8000-d557ca1764a8",
"advertiser": {
"id": "adacct_6aa3f3825760819e8d6230218a087103",
"name": "Acme Audio",
"url": "https://www.acme-audio.example"
},
"title": "Noise-cancelling headphones",
"body": "Over-ear and in-ear models, free returns.",
"url": "https://www.acme-audio.example/headphones?utm_source=chatgpt.com",
"imageUrl": "https://images.openai.com/…",
"messageId": "5882cd12-a1e6-4a82-9842-a3146f9e7262",
"conversationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"total": 234,
"limit": 100,
"offset": 0
}{
"error": "Connection not found"
}{
"error": "Connection not found"
}{
"error": "Connection not found"
}{
"error": "Connection not found"
}{
"error": "Connection not found"
}Authorizations
Your API key (vsk_…), issued at onboarding. Keep it server-side.
Query Parameters
Connection UUID, from GET /api/connections or the connection.created webhook.
Page size, clamped to 1…500; a missing or unreadable value takes the default.
1 <= x <= 500Number of impressions to skip.
x >= 0