Assess a conversation against policies
/ai/bloobability/assessAnswers one question, per policy: how confident is the model that this policy applies to this conversation? The number you want is policies[].calibrated_probability.
Two passes, only the gauge is required
- The gauge scores every policy you send, independently (a yes/no plus a decision margin read from the served logprobs), and a frozen two-tier calibration map turns that margin into
calibrated_probability,verdict,calibration_tier, andaccepted. This is the whole product and the common, fastest path. - The matcher is a separate, optional pass. Set
include_evidence: trueand it runs in parallel with the gauge and attachesevidence_ids(the supporting message IDs). It adds roughly no wall-clock latency but is a second full inference, so leave it off unless you need provenance.
The call is stateless: nothing is persisted, reference_id is not an idempotency key, and replaying the same request re-runs inference. Policies come back in the same order you sent them — policies[i] in the response corresponds to policies[i] in the request.
Limitations and correct use
- Domain. Tuned for customer-support conversations in English. Other languages, other conversation genres, and non-conversational text are unmeasured.
- Estimating a rate. To measure how often a policy applies across many conversations, average
calibrated_probabilityover the cohort — do not countyesverdicts. The model deliberately favors precision over recall, so verdict counts undercount the true rate; the calibrated probabilities do not. - Tracking a trend. Reported movement is a conservative floor — magnitude is compressed, so the direction of change is more reliable than its size. Compare periods using the same policy
idanddescriptionthroughout; changing a definition (or refitting per period) mid-series can invert the trend. - Unseen policies (
pooled_unseen). Probabilities are usable for your own policies, but there is no validatedaccepteddecision and trend fidelity is unmeasured — keep a human in the loop. - Automation vs. review.
acceptedis intentionally strict; plan for a meaningful share of decisions (roughly a third to two fifths) to fall outside it, and route those to human review — seeevidence_ids. - Labels are model-derived. Scores reflect a model's judgment of your policy description, not human-verified ground truth. See the Conversation insights guide for the full method.
Headers
AuthorizationRequiredstringYour API key, sent as a bearer token: Authorization: Bearer <api_key>. Editing this stays in sync with the API key box on the right.
Body parameters
JSONreference_idoptionalstringOptional. Your own reference, echoed back verbatim so you can reconcile a response with your records. It is **not** sent to the model and does not affect the result, and it is **not** an idempotency key. If you omit it, it is simply absent from the response — the server never mints one.
conversationRequiredBloobabilityMessage[]The messages to assess, in order. Non-empty.
conversationRequiredBloobabilityMessage[]The messages to assess, in order. Non-empty.
Array of BloobabilityMessage
idRequiredstringThe evidence ID the model can cite back in evidence_ids. Must match ^[A-Za-z0-9][A-Za-z0-9_.:-]*$ (≤128 chars) and be unique across the conversation.
roleRequiredstringWho sent the message.
"customer""agent""system"contentRequiredstringThe message text. Must be non-empty.
policiesRequiredBloobabilityPolicy[]The policies to score, each independently. Non-empty.
policiesRequiredBloobabilityPolicy[]The policies to score, each independently. Non-empty.
Array of BloobabilityPolicy
idRequiredstringThe policy ID. This is the **calibration key**: an id matching a policy the calibration map was fitted on yields the roster tier; a novel id yields pooled_unseen. Must match ^[A-Za-z0-9][A-Za-z0-9_.:-]*$ (≤128 chars) and be unique across the request.
descriptionRequiredstringWhat the model actually judges the conversation against. Keep it consistent with what the id implies — a description that means something different from a known id produces a "trusted" roster label on a number that is not really trustworthy.
include_evidenceoptionalbooleanWhen true, the matcher runs in parallel with the gauge and each policy gains an evidence_ids array. Off by default.
Returns
reference_idoptionalstringVerbatim echo of your reference_id. Absent if you did not send one.
policiesRequiredBloobabilityPolicyResult[]One result per requested policy, in the same order as request.policies.
policiesRequiredBloobabilityPolicyResult[]One result per requested policy, in the same order as request.policies.
Array of BloobabilityPolicyResult
idRequiredstringThe policy ID from your request.
calibrated_probabilityRequirednumber**The answer.** The calibrated probability (0–1) that this policy applies to the conversation.
verdictRequiredstringThe gauge's discrete call — does this policy apply? calibrated_probability says how confident; the accept rule is computed against this side.
"yes""no"calibration_tierRequiredstringHow trustworthy the number is. roster: a policy the calibration map was fitted on, with its own per-label offset — accepted is meaningful. pooled_unseen: a novel policy scored by the pooled map with no per-label offset — the probability is usable but accepted is omitted.
"roster""pooled_unseen"acceptedoptionalbooleanThe frozen accept/defer decision, frozen at the release's validated risk bound. true means the confidence on the predicted side clears the frozen per-verdict threshold. Deliberately strict (a confident 0.879 yes is still not accepted). **Omitted for pooled_unseen** — treat a missing accepted as "no validated decision," never as false.
evidence_idsoptionalstring[]Supporting message IDs from the **matcher** pass — present only when include_evidence: true. This is an independent judgment from the gauge's score, so a policy can have a high calibrated_probability but an empty evidence_ids.
Response codes
Sends a live request with your values and shows the real response below. Your key is stored only in this browser.
curl -X POST https://api.blooio.com/v4/ai/bloobability/assess \{ "reference_id": "order-42", "policies": [ { "id": "refund_request", "calibrated_probability": 0.977, "verdict": "yes", "calibration_tier": "roster", "accepted": true } ]}