Sense
Compare two interactions
Measure two interactions against the same protocol and return the differential.
Use cases:
- Before/after training assessment
- A/B testing of interaction approaches
- Agent version comparison
- Quality trend analysis across time periods
POST
/
api
/
v1
/
sense
/
compare
Compare two interactions
curl --request POST \
--url https://ibf.blankstate.ai/api/v1/sense/compare \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target": {
"type": "protocol",
"id": "customer-service-quality"
},
"interaction_a": {
"label": "Before training",
"content": "Your complaint has been noted. Someone will get back to you."
},
"interaction_b": {
"label": "After training",
"content": "I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day."
}
}
'import requests
url = "https://ibf.blankstate.ai/api/v1/sense/compare"
payload = {
"target": {
"type": "protocol",
"id": "customer-service-quality"
},
"interaction_a": {
"label": "Before training",
"content": "Your complaint has been noted. Someone will get back to you."
},
"interaction_b": {
"label": "After training",
"content": "I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day."
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
target: {type: 'protocol', id: 'customer-service-quality'},
interaction_a: {
label: 'Before training',
content: 'Your complaint has been noted. Someone will get back to you.'
},
interaction_b: {
label: 'After training',
content: 'I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.'
}
})
};
fetch('https://ibf.blankstate.ai/api/v1/sense/compare', 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://ibf.blankstate.ai/api/v1/sense/compare",
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([
'target' => [
'type' => 'protocol',
'id' => 'customer-service-quality'
],
'interaction_a' => [
'label' => 'Before training',
'content' => 'Your complaint has been noted. Someone will get back to you.'
],
'interaction_b' => [
'label' => 'After training',
'content' => 'I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://ibf.blankstate.ai/api/v1/sense/compare"
payload := strings.NewReader("{\n \"target\": {\n \"type\": \"protocol\",\n \"id\": \"customer-service-quality\"\n },\n \"interaction_a\": {\n \"label\": \"Before training\",\n \"content\": \"Your complaint has been noted. Someone will get back to you.\"\n },\n \"interaction_b\": {\n \"label\": \"After training\",\n \"content\": \"I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://ibf.blankstate.ai/api/v1/sense/compare")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"target\": {\n \"type\": \"protocol\",\n \"id\": \"customer-service-quality\"\n },\n \"interaction_a\": {\n \"label\": \"Before training\",\n \"content\": \"Your complaint has been noted. Someone will get back to you.\"\n },\n \"interaction_b\": {\n \"label\": \"After training\",\n \"content\": \"I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://ibf.blankstate.ai/api/v1/sense/compare")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"target\": {\n \"type\": \"protocol\",\n \"id\": \"customer-service-quality\"\n },\n \"interaction_a\": {\n \"label\": \"Before training\",\n \"content\": \"Your complaint has been noted. Someone will get back to you.\"\n },\n \"interaction_b\": {\n \"label\": \"After training\",\n \"content\": \"I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.\"\n }\n}"
response = http.request(request)
puts response.read_body{
"target": {
"type": "protocol",
"id": "customer-service-quality",
"version": "1.0"
},
"interaction_a": {
"label": "Before training",
"score": 0.31,
"resonance": {
"Empathetic Acknowledgment": 0.15,
"Clear Resolution": 0.42
},
"metamarkers_triggered": 1
},
"interaction_b": {
"label": "After training",
"score": 0.91,
"resonance": {
"Empathetic Acknowledgment": 0.95,
"Clear Resolution": 0.88
},
"metamarkers_triggered": 2
},
"delta": {
"score_change": 0.6,
"direction": "improvement",
"resonance_shifts": {
"Empathetic Acknowledgment": {
"a": 0.15,
"b": 0.95,
"change": 0.8
},
"Clear Resolution": {
"a": 0.42,
"b": 0.88,
"change": 0.46
}
},
"metamarker_change": 1
},
"ics": {
"consumed": 3,
"cost_usd": 0.009
}
}{
"error": {
"code": "invalid_request",
"message": "The 'interaction.content' field is required for type 'text'"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired API token. Obtain a new token from atlas.blankstate.ai"
}
}{
"error": {
"code": "quota_exhausted",
"message": "Your free ICS quota for this period has been consumed. Add a payment method at atlas.blankstate.ai to continue.",
"details": {
"quota": 50,
"used": 50,
"reset": "2026-03-01T00:00:00Z"
}
}
}{
"error": {
"code": "target_not_found",
"message": "Protocol 'non-existent-protocol' not found or not available to your organization"
}
}⌘I
Compare two interactions
curl --request POST \
--url https://ibf.blankstate.ai/api/v1/sense/compare \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"target": {
"type": "protocol",
"id": "customer-service-quality"
},
"interaction_a": {
"label": "Before training",
"content": "Your complaint has been noted. Someone will get back to you."
},
"interaction_b": {
"label": "After training",
"content": "I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day."
}
}
'import requests
url = "https://ibf.blankstate.ai/api/v1/sense/compare"
payload = {
"target": {
"type": "protocol",
"id": "customer-service-quality"
},
"interaction_a": {
"label": "Before training",
"content": "Your complaint has been noted. Someone will get back to you."
},
"interaction_b": {
"label": "After training",
"content": "I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day."
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
target: {type: 'protocol', id: 'customer-service-quality'},
interaction_a: {
label: 'Before training',
content: 'Your complaint has been noted. Someone will get back to you.'
},
interaction_b: {
label: 'After training',
content: 'I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.'
}
})
};
fetch('https://ibf.blankstate.ai/api/v1/sense/compare', 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://ibf.blankstate.ai/api/v1/sense/compare",
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([
'target' => [
'type' => 'protocol',
'id' => 'customer-service-quality'
],
'interaction_a' => [
'label' => 'Before training',
'content' => 'Your complaint has been noted. Someone will get back to you.'
],
'interaction_b' => [
'label' => 'After training',
'content' => 'I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://ibf.blankstate.ai/api/v1/sense/compare"
payload := strings.NewReader("{\n \"target\": {\n \"type\": \"protocol\",\n \"id\": \"customer-service-quality\"\n },\n \"interaction_a\": {\n \"label\": \"Before training\",\n \"content\": \"Your complaint has been noted. Someone will get back to you.\"\n },\n \"interaction_b\": {\n \"label\": \"After training\",\n \"content\": \"I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://ibf.blankstate.ai/api/v1/sense/compare")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"target\": {\n \"type\": \"protocol\",\n \"id\": \"customer-service-quality\"\n },\n \"interaction_a\": {\n \"label\": \"Before training\",\n \"content\": \"Your complaint has been noted. Someone will get back to you.\"\n },\n \"interaction_b\": {\n \"label\": \"After training\",\n \"content\": \"I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://ibf.blankstate.ai/api/v1/sense/compare")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"target\": {\n \"type\": \"protocol\",\n \"id\": \"customer-service-quality\"\n },\n \"interaction_a\": {\n \"label\": \"Before training\",\n \"content\": \"Your complaint has been noted. Someone will get back to you.\"\n },\n \"interaction_b\": {\n \"label\": \"After training\",\n \"content\": \"I completely understand how frustrating this must be. Let me personally ensure this is resolved by end of day.\"\n }\n}"
response = http.request(request)
puts response.read_body{
"target": {
"type": "protocol",
"id": "customer-service-quality",
"version": "1.0"
},
"interaction_a": {
"label": "Before training",
"score": 0.31,
"resonance": {
"Empathetic Acknowledgment": 0.15,
"Clear Resolution": 0.42
},
"metamarkers_triggered": 1
},
"interaction_b": {
"label": "After training",
"score": 0.91,
"resonance": {
"Empathetic Acknowledgment": 0.95,
"Clear Resolution": 0.88
},
"metamarkers_triggered": 2
},
"delta": {
"score_change": 0.6,
"direction": "improvement",
"resonance_shifts": {
"Empathetic Acknowledgment": {
"a": 0.15,
"b": 0.95,
"change": 0.8
},
"Clear Resolution": {
"a": 0.42,
"b": 0.88,
"change": 0.46
}
},
"metamarker_change": 1
},
"ics": {
"consumed": 3,
"cost_usd": 0.009
}
}{
"error": {
"code": "invalid_request",
"message": "The 'interaction.content' field is required for type 'text'"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired API token. Obtain a new token from atlas.blankstate.ai"
}
}{
"error": {
"code": "quota_exhausted",
"message": "Your free ICS quota for this period has been consumed. Add a payment method at atlas.blankstate.ai to continue.",
"details": {
"quota": 50,
"used": 50,
"reset": "2026-03-01T00:00:00Z"
}
}
}{
"error": {
"code": "target_not_found",
"message": "Protocol 'non-existent-protocol' not found or not available to your organization"
}
}