AIv4

Assess a conversation against policies

POST/ai/bloobability/assess

Answers 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, and accepted. This is the whole product and the common, fastest path.
  • The matcher is a separate, optional pass. Set include_evidence: true and it runs in parallel with the gauge and attaches evidence_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 thempolicies[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_probability over the cohort — do not count yes verdicts. 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 id and description throughout; 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 validated accepted decision and trend fidelity is unmeasured — keep a human in the loop.
  • Automation vs. review. accepted is 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 — see evidence_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

AuthorizationRequiredstring

Your API key, sent as a bearer token: Authorization: Bearer <api_key>. Editing this stays in sync with the API key box on the right.

Bearer

Body parameters

JSON
reference_idoptionalstring

Optional. 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.

Array of BloobabilityMessage

idRequiredstring

The 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.

roleRequiredstring

Who sent the message.

"customer""agent""system"
contentRequiredstring

The message text. Must be non-empty.

policiesRequiredBloobabilityPolicy[]

The policies to score, each independently. Non-empty.

Array of BloobabilityPolicy

idRequiredstring

The 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.

descriptionRequiredstring

What 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_evidenceoptionalboolean

When true, the matcher runs in parallel with the gauge and each policy gains an evidence_ids array. Off by default.

Returns

reference_idoptionalstring

Verbatim 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.

Array of BloobabilityPolicyResult

idRequiredstring

The policy ID from your request.

calibrated_probabilityRequirednumber

**The answer.** The calibrated probability (0–1) that this policy applies to the conversation.

verdictRequiredstring

The gauge's discrete call — does this policy apply? calibrated_probability says how confident; the accept rule is computed against this side.

"yes""no"
calibration_tierRequiredstring

How 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"
acceptedoptionalboolean

The 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

200Per-policy assessment, in the same order as the request.
401Your API key is missing or invalid. Pass it as a bearer token.
403Your API key isn't allowed to access this ai (blocked key or plan limit).
422Validation failed — one or more fields in the request are invalid or missing.
502The gauge endpoint returned a response whose yes/no logprobs could not be read, so no calibrated number can be produced. This indicates a serving misconfiguration rather than a problem with your request; retry, and contact support if it persists.

Sends a live request with your values and shows the real response below. Your key is stored only in this browser.

Request
curl -X POST https://api.blooio.com/v4/ai/bloobability/assess \
Body object
Response objectexample
{  "reference_id": "order-42",  "policies": [    {      "id": "refund_request",      "calibrated_probability": 0.977,      "verdict": "yes",      "calibration_tier": "roster",      "accepted": true    }  ]}