Personas
Get detailed audience personas with psychographics, behaviors, motivators, and barriers. Ideal for creative strategy, targeting, and understanding your audience at a psychological level.
Input: Provide brand info, products, and industry context. Can chain output from Brand Research endpoint.
Output: 3-5 distinct personas with personality traits, behavioral patterns, motivations, and barriers.
Citations Mode:
async(recommended): Fast response, fetch citations separately via continuation tokensync: Include citations in response (slower)none: No citations (fastest)
curl --request POST \
--url https://api.upriver.ai/v2/audience_insights \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"brief": "headphones for gen z runners, waterproof, good bass, long battery",
"industries": [
"consumer electronics",
"fitness"
],
"brand": {
"voice": "energetic, motivational, friendly",
"values": [
"performance",
"self improvement",
"community"
]
},
"product": {
"category": "headphones",
"price_tier": "mid"
},
"audience": {
"age_range": "18-24"
}
}
'import requests
url = "https://api.upriver.ai/v2/audience_insights"
payload = {
"brief": "headphones for gen z runners, waterproof, good bass, long battery",
"industries": ["consumer electronics", "fitness"],
"brand": {
"voice": "energetic, motivational, friendly",
"values": ["performance", "self improvement", "community"]
},
"product": {
"category": "headphones",
"price_tier": "mid"
},
"audience": { "age_range": "18-24" }
}
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({
brief: 'headphones for gen z runners, waterproof, good bass, long battery',
industries: ['consumer electronics', 'fitness'],
brand: {
voice: 'energetic, motivational, friendly',
values: ['performance', 'self improvement', 'community']
},
product: {category: 'headphones', price_tier: 'mid'},
audience: {age_range: '18-24'}
})
};
fetch('https://api.upriver.ai/v2/audience_insights', 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.upriver.ai/v2/audience_insights",
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([
'brief' => 'headphones for gen z runners, waterproof, good bass, long battery',
'industries' => [
'consumer electronics',
'fitness'
],
'brand' => [
'voice' => 'energetic, motivational, friendly',
'values' => [
'performance',
'self improvement',
'community'
]
],
'product' => [
'category' => 'headphones',
'price_tier' => 'mid'
],
'audience' => [
'age_range' => '18-24'
]
]),
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.upriver.ai/v2/audience_insights"
payload := strings.NewReader("{\n \"brief\": \"headphones for gen z runners, waterproof, good bass, long battery\",\n \"industries\": [\n \"consumer electronics\",\n \"fitness\"\n ],\n \"brand\": {\n \"voice\": \"energetic, motivational, friendly\",\n \"values\": [\n \"performance\",\n \"self improvement\",\n \"community\"\n ]\n },\n \"product\": {\n \"category\": \"headphones\",\n \"price_tier\": \"mid\"\n },\n \"audience\": {\n \"age_range\": \"18-24\"\n }\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.upriver.ai/v2/audience_insights")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"brief\": \"headphones for gen z runners, waterproof, good bass, long battery\",\n \"industries\": [\n \"consumer electronics\",\n \"fitness\"\n ],\n \"brand\": {\n \"voice\": \"energetic, motivational, friendly\",\n \"values\": [\n \"performance\",\n \"self improvement\",\n \"community\"\n ]\n },\n \"product\": {\n \"category\": \"headphones\",\n \"price_tier\": \"mid\"\n },\n \"audience\": {\n \"age_range\": \"18-24\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upriver.ai/v2/audience_insights")
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 \"brief\": \"headphones for gen z runners, waterproof, good bass, long battery\",\n \"industries\": [\n \"consumer electronics\",\n \"fitness\"\n ],\n \"brand\": {\n \"voice\": \"energetic, motivational, friendly\",\n \"values\": [\n \"performance\",\n \"self improvement\",\n \"community\"\n ]\n },\n \"product\": {\n \"category\": \"headphones\",\n \"price_tier\": \"mid\"\n },\n \"audience\": {\n \"age_range\": \"18-24\"\n }\n}"
response = http.request(request)
puts response.read_body{
"meta": {
"generated_at": "2023-11-07T05:31:56Z",
"industries": [
"<string>"
],
"continuation_token": "<string>",
"counts": {
"total": 123,
"by_scope": {
"general": 0,
"multi_platform": 0,
"platform_specific": 0
}
},
"source_filters": {
"platforms": [
"<string>"
],
"source_names": [
"<string>"
],
"source_urls": [
"<string>"
],
"restriction": "none"
},
"debug_info": {
"duration_ms": 123,
"candidates_before_filter": 123,
"applied_filters": [
{
"name": "<string>",
"value": "<unknown>",
"reason": "<string>"
}
]
}
},
"personas": [
{
"label": "<string>",
"description": "<string>",
"personality_traits": [
{
"trait": "<string>",
"justification": "<string>"
}
],
"psychology": {
"motivations": [
"<string>"
],
"barriers": [
"<string>"
],
"triggers": [
"<string>"
]
},
"language_patterns": {
"common_phrases": [
"<string>"
],
"stylistic_features": [
"<string>"
],
"tone_descriptors": [
"<string>"
]
},
"supporting_evidence": {
"reddit_posts": [
{
"title": "<string>",
"summary": "<string>",
"url": "<string>",
"justification": "<string>",
"subreddit": "<string>"
}
]
},
"citations": [
{
"title": "<string>",
"text": "<string>",
"relevance_score": 123,
"reason": "<string>",
"url": "<string>",
"subreddit": "<string>",
"source": "<string>"
}
],
"behaviors_demonstrated": [
"<string>"
]
}
],
"rollup_summary": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Body
Creative brief describing the brand, product, and/or campaign.
Brand context including name, voice, and values.
Show child attributes
Show child attributes
Industry categories to guide the search.
Product details for better targeting.
Show child attributes
Show child attributes
Optional list of products to consider (top item treated as primary).
Show child attributes
Show child attributes
Target audience definition. Can be a simple string or structured object.
Show child attributes
Show child attributes
Retrieval scope: time window, geographic markets, social platforms, content sources.
Show child attributes
Show child attributes
Output configuration
Show child attributes
Show child attributes
Singular industry (from /brand endpoint, auto-converted to industries array)
Response
JSON object containing audience insights data
Persona-level audience insights for creative strategy. Each persona includes complete insight blocks; no global/override packs.
Generation context and diagnostics (e.g., input echoes, model versions, timing, provenance flags).
Show child attributes
Show child attributes
Primary and (optionally) recommended personas, each with full insight blocks.
Show child attributes
Show child attributes
One-paragraph cross-persona summary (1-2 sentences). Optional; informational only.
curl --request POST \
--url https://api.upriver.ai/v2/audience_insights \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"brief": "headphones for gen z runners, waterproof, good bass, long battery",
"industries": [
"consumer electronics",
"fitness"
],
"brand": {
"voice": "energetic, motivational, friendly",
"values": [
"performance",
"self improvement",
"community"
]
},
"product": {
"category": "headphones",
"price_tier": "mid"
},
"audience": {
"age_range": "18-24"
}
}
'import requests
url = "https://api.upriver.ai/v2/audience_insights"
payload = {
"brief": "headphones for gen z runners, waterproof, good bass, long battery",
"industries": ["consumer electronics", "fitness"],
"brand": {
"voice": "energetic, motivational, friendly",
"values": ["performance", "self improvement", "community"]
},
"product": {
"category": "headphones",
"price_tier": "mid"
},
"audience": { "age_range": "18-24" }
}
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({
brief: 'headphones for gen z runners, waterproof, good bass, long battery',
industries: ['consumer electronics', 'fitness'],
brand: {
voice: 'energetic, motivational, friendly',
values: ['performance', 'self improvement', 'community']
},
product: {category: 'headphones', price_tier: 'mid'},
audience: {age_range: '18-24'}
})
};
fetch('https://api.upriver.ai/v2/audience_insights', 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.upriver.ai/v2/audience_insights",
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([
'brief' => 'headphones for gen z runners, waterproof, good bass, long battery',
'industries' => [
'consumer electronics',
'fitness'
],
'brand' => [
'voice' => 'energetic, motivational, friendly',
'values' => [
'performance',
'self improvement',
'community'
]
],
'product' => [
'category' => 'headphones',
'price_tier' => 'mid'
],
'audience' => [
'age_range' => '18-24'
]
]),
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.upriver.ai/v2/audience_insights"
payload := strings.NewReader("{\n \"brief\": \"headphones for gen z runners, waterproof, good bass, long battery\",\n \"industries\": [\n \"consumer electronics\",\n \"fitness\"\n ],\n \"brand\": {\n \"voice\": \"energetic, motivational, friendly\",\n \"values\": [\n \"performance\",\n \"self improvement\",\n \"community\"\n ]\n },\n \"product\": {\n \"category\": \"headphones\",\n \"price_tier\": \"mid\"\n },\n \"audience\": {\n \"age_range\": \"18-24\"\n }\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.upriver.ai/v2/audience_insights")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"brief\": \"headphones for gen z runners, waterproof, good bass, long battery\",\n \"industries\": [\n \"consumer electronics\",\n \"fitness\"\n ],\n \"brand\": {\n \"voice\": \"energetic, motivational, friendly\",\n \"values\": [\n \"performance\",\n \"self improvement\",\n \"community\"\n ]\n },\n \"product\": {\n \"category\": \"headphones\",\n \"price_tier\": \"mid\"\n },\n \"audience\": {\n \"age_range\": \"18-24\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upriver.ai/v2/audience_insights")
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 \"brief\": \"headphones for gen z runners, waterproof, good bass, long battery\",\n \"industries\": [\n \"consumer electronics\",\n \"fitness\"\n ],\n \"brand\": {\n \"voice\": \"energetic, motivational, friendly\",\n \"values\": [\n \"performance\",\n \"self improvement\",\n \"community\"\n ]\n },\n \"product\": {\n \"category\": \"headphones\",\n \"price_tier\": \"mid\"\n },\n \"audience\": {\n \"age_range\": \"18-24\"\n }\n}"
response = http.request(request)
puts response.read_body{
"meta": {
"generated_at": "2023-11-07T05:31:56Z",
"industries": [
"<string>"
],
"continuation_token": "<string>",
"counts": {
"total": 123,
"by_scope": {
"general": 0,
"multi_platform": 0,
"platform_specific": 0
}
},
"source_filters": {
"platforms": [
"<string>"
],
"source_names": [
"<string>"
],
"source_urls": [
"<string>"
],
"restriction": "none"
},
"debug_info": {
"duration_ms": 123,
"candidates_before_filter": 123,
"applied_filters": [
{
"name": "<string>",
"value": "<unknown>",
"reason": "<string>"
}
]
}
},
"personas": [
{
"label": "<string>",
"description": "<string>",
"personality_traits": [
{
"trait": "<string>",
"justification": "<string>"
}
],
"psychology": {
"motivations": [
"<string>"
],
"barriers": [
"<string>"
],
"triggers": [
"<string>"
]
},
"language_patterns": {
"common_phrases": [
"<string>"
],
"stylistic_features": [
"<string>"
],
"tone_descriptors": [
"<string>"
]
},
"supporting_evidence": {
"reddit_posts": [
{
"title": "<string>",
"summary": "<string>",
"url": "<string>",
"justification": "<string>",
"subreddit": "<string>"
}
]
},
"citations": [
{
"title": "<string>",
"text": "<string>",
"relevance_score": 123,
"reason": "<string>",
"url": "<string>",
"subreddit": "<string>",
"source": "<string>"
}
],
"behaviors_demonstrated": [
"<string>"
]
}
],
"rollup_summary": "<string>"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}