Match Persona
Score advertiser fit for a supplied persona and return audience facets, reasons, and supporting evidence.
curl --request POST \
--url https://api.upriver.ai/v1/catalogs/{catalog_id}/match \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"persona": {
"summary": "Tech founders interested in developer tools and automation"
},
"settings": {
"preset": "balanced",
"priorities": {},
"exclusions": {
"categories": [
"<string>"
],
"brands": [
"<string>"
],
"sensitive": true
},
"inferred_needs": "off",
"min_evidence": 0.35,
"price_tier_affinity": true,
"geo": "<string>",
"language": "<string>",
"limit": 10
}
}
'import requests
url = "https://api.upriver.ai/v1/catalogs/{catalog_id}/match"
payload = {
"persona": { "summary": "Tech founders interested in developer tools and automation" },
"settings": {
"preset": "balanced",
"priorities": {},
"exclusions": {
"categories": ["<string>"],
"brands": ["<string>"],
"sensitive": True
},
"inferred_needs": "off",
"min_evidence": 0.35,
"price_tier_affinity": True,
"geo": "<string>",
"language": "<string>",
"limit": 10
}
}
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({
persona: {summary: 'Tech founders interested in developer tools and automation'},
settings: {
preset: 'balanced',
priorities: {},
exclusions: {categories: ['<string>'], brands: ['<string>'], sensitive: true},
inferred_needs: 'off',
min_evidence: 0.35,
price_tier_affinity: true,
geo: '<string>',
language: '<string>',
limit: 10
}
})
};
fetch('https://api.upriver.ai/v1/catalogs/{catalog_id}/match', 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/v1/catalogs/{catalog_id}/match",
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([
'persona' => [
'summary' => 'Tech founders interested in developer tools and automation'
],
'settings' => [
'preset' => 'balanced',
'priorities' => [
],
'exclusions' => [
'categories' => [
'<string>'
],
'brands' => [
'<string>'
],
'sensitive' => true
],
'inferred_needs' => 'off',
'min_evidence' => 0.35,
'price_tier_affinity' => true,
'geo' => '<string>',
'language' => '<string>',
'limit' => 10
]
]),
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/v1/catalogs/{catalog_id}/match"
payload := strings.NewReader("{\n \"persona\": {\n \"summary\": \"Tech founders interested in developer tools and automation\"\n },\n \"settings\": {\n \"preset\": \"balanced\",\n \"priorities\": {},\n \"exclusions\": {\n \"categories\": [\n \"<string>\"\n ],\n \"brands\": [\n \"<string>\"\n ],\n \"sensitive\": true\n },\n \"inferred_needs\": \"off\",\n \"min_evidence\": 0.35,\n \"price_tier_affinity\": true,\n \"geo\": \"<string>\",\n \"language\": \"<string>\",\n \"limit\": 10\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/v1/catalogs/{catalog_id}/match")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"persona\": {\n \"summary\": \"Tech founders interested in developer tools and automation\"\n },\n \"settings\": {\n \"preset\": \"balanced\",\n \"priorities\": {},\n \"exclusions\": {\n \"categories\": [\n \"<string>\"\n ],\n \"brands\": [\n \"<string>\"\n ],\n \"sensitive\": true\n },\n \"inferred_needs\": \"off\",\n \"min_evidence\": 0.35,\n \"price_tier_affinity\": true,\n \"geo\": \"<string>\",\n \"language\": \"<string>\",\n \"limit\": 10\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upriver.ai/v1/catalogs/{catalog_id}/match")
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 \"persona\": {\n \"summary\": \"Tech founders interested in developer tools and automation\"\n },\n \"settings\": {\n \"preset\": \"balanced\",\n \"priorities\": {},\n \"exclusions\": {\n \"categories\": [\n \"<string>\"\n ],\n \"brands\": [\n \"<string>\"\n ],\n \"sensitive\": true\n },\n \"inferred_needs\": \"off\",\n \"min_evidence\": 0.35,\n \"price_tier_affinity\": true,\n \"geo\": \"<string>\",\n \"language\": \"<string>\",\n \"limit\": 10\n }\n}"
response = http.request(request)
puts response.read_body{
"interpretation": {
"mode": "summary",
"facets": [
{
"kind": "identity",
"text": "<string>",
"confidence": 0.5,
"sensitive": true,
"source_span": "<string>",
"parent_index": 1
}
],
"llm_calls": 1,
"language": "<string>",
"price_sensitivity": "budget"
},
"matches": [
{
"ref": "<string>",
"brand_url": "<string>",
"score": 0.5,
"evidence_grade": "grounded",
"contributions": [
{
"edge": "direct",
"user_facet": {
"kind": "identity",
"text": "<string>",
"confidence": 0.5,
"sensitive": true,
"source_span": "<string>",
"parent_index": 1
},
"product_facet": {
"kind": "identity",
"text": "<string>",
"confidence": 0.5,
"evidence_grade": "grounded"
},
"similarity": 123,
"weight": 123,
"delta": 123,
"evidence": [
{
"source": "<string>",
"snippet": "<string>",
"url": "<string>",
"similarity": 0.5,
"judge_probability": 0.5
}
]
}
],
"reasons": [
"<string>"
],
"matched_offer": {
"name": "<string>",
"description": "<string>",
"relevance_score": 0.5,
"url": "<string>",
"evidence": [
{
"source": "<string>",
"snippet": "<string>",
"url": "<string>",
"similarity": 0.5,
"judge_probability": 0.5
}
]
},
"price_tier_fit": "match"
}
],
"settings_applied": {
"preset": "balanced",
"priorities": {},
"exclusions": {
"categories": [
"<string>"
],
"brands": [
"<string>"
],
"sensitive": true
},
"inferred_needs": "off",
"min_evidence": 0.35,
"price_tier_affinity": true,
"geo": "<string>",
"language": "<string>",
"limit": 10
},
"strategy_version": "<string>",
"completeness": "complete",
"brief_fingerprint": "<string>",
"relevance_status": "disabled",
"judge_applied": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}completeness, relevance_status, and
strategy_version before comparing results.Authorizations
Path Parameters
Body
Request to match a persona against one catalog's entries.
Response
Successful Response
Ranked catalog entries for one persona, with an explained score each.
What was read from the supplied persona.
Show child attributes
Show child attributes
Ranked catalog entries that fit the persona.
Show child attributes
Show child attributes
The settings this match was computed under.
Show child attributes
Show child attributes
Version of the scoring strategy that produced this match.
Whether this response is complete.
complete, truncated, unavailable Stable identifier for this persona-and-settings pairing.
Full-context relevance assessment: applied, disabled, no_candidates, fallback after unavailability, skipped_sensitive to honor exclusions, or skipped_settings to preserve custom scoring preferences.
disabled, applied, fallback, skipped_sensitive, skipped_settings, no_candidates Whether a borderline-match verification pass, selected server-side, was in effect for this response: either it ran and its answers were applied, or there was nothing borderline enough to need verifying. A match still returns normally, with this false, when no verification pass is configured, it only measures without changing results, or the selected backend is unavailable.
curl --request POST \
--url https://api.upriver.ai/v1/catalogs/{catalog_id}/match \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"persona": {
"summary": "Tech founders interested in developer tools and automation"
},
"settings": {
"preset": "balanced",
"priorities": {},
"exclusions": {
"categories": [
"<string>"
],
"brands": [
"<string>"
],
"sensitive": true
},
"inferred_needs": "off",
"min_evidence": 0.35,
"price_tier_affinity": true,
"geo": "<string>",
"language": "<string>",
"limit": 10
}
}
'import requests
url = "https://api.upriver.ai/v1/catalogs/{catalog_id}/match"
payload = {
"persona": { "summary": "Tech founders interested in developer tools and automation" },
"settings": {
"preset": "balanced",
"priorities": {},
"exclusions": {
"categories": ["<string>"],
"brands": ["<string>"],
"sensitive": True
},
"inferred_needs": "off",
"min_evidence": 0.35,
"price_tier_affinity": True,
"geo": "<string>",
"language": "<string>",
"limit": 10
}
}
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({
persona: {summary: 'Tech founders interested in developer tools and automation'},
settings: {
preset: 'balanced',
priorities: {},
exclusions: {categories: ['<string>'], brands: ['<string>'], sensitive: true},
inferred_needs: 'off',
min_evidence: 0.35,
price_tier_affinity: true,
geo: '<string>',
language: '<string>',
limit: 10
}
})
};
fetch('https://api.upriver.ai/v1/catalogs/{catalog_id}/match', 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/v1/catalogs/{catalog_id}/match",
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([
'persona' => [
'summary' => 'Tech founders interested in developer tools and automation'
],
'settings' => [
'preset' => 'balanced',
'priorities' => [
],
'exclusions' => [
'categories' => [
'<string>'
],
'brands' => [
'<string>'
],
'sensitive' => true
],
'inferred_needs' => 'off',
'min_evidence' => 0.35,
'price_tier_affinity' => true,
'geo' => '<string>',
'language' => '<string>',
'limit' => 10
]
]),
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/v1/catalogs/{catalog_id}/match"
payload := strings.NewReader("{\n \"persona\": {\n \"summary\": \"Tech founders interested in developer tools and automation\"\n },\n \"settings\": {\n \"preset\": \"balanced\",\n \"priorities\": {},\n \"exclusions\": {\n \"categories\": [\n \"<string>\"\n ],\n \"brands\": [\n \"<string>\"\n ],\n \"sensitive\": true\n },\n \"inferred_needs\": \"off\",\n \"min_evidence\": 0.35,\n \"price_tier_affinity\": true,\n \"geo\": \"<string>\",\n \"language\": \"<string>\",\n \"limit\": 10\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/v1/catalogs/{catalog_id}/match")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"persona\": {\n \"summary\": \"Tech founders interested in developer tools and automation\"\n },\n \"settings\": {\n \"preset\": \"balanced\",\n \"priorities\": {},\n \"exclusions\": {\n \"categories\": [\n \"<string>\"\n ],\n \"brands\": [\n \"<string>\"\n ],\n \"sensitive\": true\n },\n \"inferred_needs\": \"off\",\n \"min_evidence\": 0.35,\n \"price_tier_affinity\": true,\n \"geo\": \"<string>\",\n \"language\": \"<string>\",\n \"limit\": 10\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upriver.ai/v1/catalogs/{catalog_id}/match")
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 \"persona\": {\n \"summary\": \"Tech founders interested in developer tools and automation\"\n },\n \"settings\": {\n \"preset\": \"balanced\",\n \"priorities\": {},\n \"exclusions\": {\n \"categories\": [\n \"<string>\"\n ],\n \"brands\": [\n \"<string>\"\n ],\n \"sensitive\": true\n },\n \"inferred_needs\": \"off\",\n \"min_evidence\": 0.35,\n \"price_tier_affinity\": true,\n \"geo\": \"<string>\",\n \"language\": \"<string>\",\n \"limit\": 10\n }\n}"
response = http.request(request)
puts response.read_body{
"interpretation": {
"mode": "summary",
"facets": [
{
"kind": "identity",
"text": "<string>",
"confidence": 0.5,
"sensitive": true,
"source_span": "<string>",
"parent_index": 1
}
],
"llm_calls": 1,
"language": "<string>",
"price_sensitivity": "budget"
},
"matches": [
{
"ref": "<string>",
"brand_url": "<string>",
"score": 0.5,
"evidence_grade": "grounded",
"contributions": [
{
"edge": "direct",
"user_facet": {
"kind": "identity",
"text": "<string>",
"confidence": 0.5,
"sensitive": true,
"source_span": "<string>",
"parent_index": 1
},
"product_facet": {
"kind": "identity",
"text": "<string>",
"confidence": 0.5,
"evidence_grade": "grounded"
},
"similarity": 123,
"weight": 123,
"delta": 123,
"evidence": [
{
"source": "<string>",
"snippet": "<string>",
"url": "<string>",
"similarity": 0.5,
"judge_probability": 0.5
}
]
}
],
"reasons": [
"<string>"
],
"matched_offer": {
"name": "<string>",
"description": "<string>",
"relevance_score": 0.5,
"url": "<string>",
"evidence": [
{
"source": "<string>",
"snippet": "<string>",
"url": "<string>",
"similarity": 0.5,
"judge_probability": 0.5
}
]
},
"price_tier_fit": "match"
}
],
"settings_applied": {
"preset": "balanced",
"priorities": {},
"exclusions": {
"categories": [
"<string>"
],
"brands": [
"<string>"
],
"sensitive": true
},
"inferred_needs": "off",
"min_evidence": 0.35,
"price_tier_affinity": true,
"geo": "<string>",
"language": "<string>",
"limit": 10
},
"strategy_version": "<string>",
"completeness": "complete",
"brief_fingerprint": "<string>",
"relevance_status": "disabled",
"judge_applied": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}