Developers

POST a conversation. Receive intelligence.

REST API. TypeScript SDK. Python SDK. OpenAPI 3.1. Webhook callbacks.

Send the whole conversation. BIE measures the human's side of it.

POST · /api/v1/ingest
# ingest one conversation arc, one object per turn
curl https://api.bieintel.com/api/v1/ingest \
  -H "Authorization: Bearer $BIE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "deployment_id": "cx_chatbot_prod",
    "events": [ /* one object per turn, in order */ ],
    "webhook_url": "https://yourapp.com/hooks/bie"
  }'
What gets scored

Human turns, in context.

BIE does not grade the model's answers. Your eval stack already does that. BIE measures what those answers did to the person reading them.

You send the whole arc, every turn in order. The engine scores the human turns in that context: trust calibration, frustration buildup, dependency drift, silent abandonment risk.

Scored dimensionsthe full behavioral set
What we readthe human side
Median time to first signal< 60s
GET · /api/v1/intelligence/:session_id
{
  "session_id": "c_4471",
  "archetype": "cx_chatbot",
  # one representative scored dimension
  "layer_z": {
    "trust_calibration": "at risk · drops sharply mid-arc"
    # the full dimension set and any derived
    # risk indicators are documented in the
    # authenticated reference
  },
  "key_finding": "Trust collapses on turn 4 of
    cancellation flow. The model offered policy
    when the user wanted action.",
  "falsifiable": true,
  "recommendation": "Rewrite the cancel-flow opener
    to acknowledge intent before explaining policy."
}

Every Layer Z dimension resolves to one calibrated number on one scale, so a healthy deployment and a struggling one never read the same. Each dimension also points a fixed direction (higher is healthier for trust calibration, higher is worse for frustration buildup and dependency drift), so a 0.03 difference can't flip a label between reports.

Three ways in

Same payload, your language.

curlTypeScriptPython
curl · ingest
curl https://api.bieintel.com/api/v1/ingest \
  -H "Authorization: Bearer $BIE_KEY" \
  -d '{ "deployment_id": "cx_chatbot_prod", "events": [...] }'
$ npm i @bie/sdkCopy

Python: pip install bie · both wrap the same OpenAPI 3.1 surface.

Reference

Three endpoints. One schema.

Exhibit 01Endpoint reference
MethodPathPurpose
POST/v1/ingestIngest a conversation
GET/v1/intelligence/:session_idRetrieve scored intelligence
POST/v1/driftCompare two model versions
BASE api.bieintel.comSPEC OpenAPI 3.1AUTH Bearer
Exhibit 02Event schema
FieldTypeNotes
actor_idstringStable per actor; not PII
conversation_idstringGroups the multi-turn arc
contentstringThe message text
timestampISO 8601UTC
NOTE a taste of the body; the full typed schema lives in the authenticated reference
Drift

Did shipping v1.3 change behavior?

POST · /v1/drift
{
  "before_label": "Model v1.2",
  "after_label": "Model v1.3",
  "question": "Did frustration buildup change
    after we shipped v1.3?"
}
Verdict

Significant regression. Frustration buildup up 0.06 on the cancel flow specifically. Other flows unchanged.

regressionsignificance-tested per dimension
Connectors

Thin adapters for ingestion.

Pre-built connectors normalize source data into the same event schema. The engine is the product; connectors are how data gets in.

IntercomZendeskOpenAI ConversationsAnthropic logsSlackDiscordFrontcustom webhook

SDKs

TypeScript and Python, both first-class, both generated against the same spec.

OpenAPI 3.1

The full surface as a machine-readable contract. Generate your own client.

MCP Server

Scoped API keys, read-only or read-write. Query intelligence from your agent.

Five minutes to first signal.

Read the docs Or run an audit