Skip to content

Changelog

Changes to /v1 responses and webhook payloads, newest first. Within /v1, changes are additive: new fields, event types and enum values can appear, so accept values you don’t recognise. See Versioning.

Agreed and not yet live. Each moves to a dated entry when it ships.

  • Clearer value names. outcome escalated becomes handed_to_person, not_real_inquiry becomes not_customer_call, and decided_by llm_judge becomes second_review. Accept both names until the change is dated here; the SDKs already do. The field name verdict stays.
  • JSON errors everywhere. Unknown paths answer 404 not_found and unsupported methods 405 method_not_allowed with an Allow header, as JSON. Every error carries request_id, also sent as the Midwater-Request-Id header.
  • Listing. Endpoints to list a project’s checks and its conversations, cursor-paginated (limit and cursor in, data and next_cursor out).
  • Key prefixes. New API keys start mw_test_ or mw_live_.
  • Webhook headers. Deliveries carry Midwater-Signature, Midwater-Event and Midwater-Delivery, with the user agent Midwater-Webhooks/1.0.
  • Groups. group in a conversation files the agent only until someone places it in the app; after that it’s ignored for that agent, and the conversation is still accepted. GET /v1/groups/{group_id}/health is always available, and group.health_changed fires whenever a group’s status changes with Watch or At risk involved.
  • Low-volume health. Below 5 conversations with an outcome in 7 days, an agent with a high-severity compliance failure is watch (1) or at_risk (2 or more) instead of not_enough_calls, and reason names the failure.
  • not_enough_calls. New health_status value on the health endpoints and webhooks: fewer than 5 conversations with an outcome in the last 7 days. agent.health_changed and group.health_changed fire only when watch or at_risk is the old or new status.
  • Safe IDs. agent.id and group.id must match ^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$; anything else is a 422 with a field error. IDs never need URL-encoding.
  • scorer_version. Each result carries scorer_version, Midwater’s own version of how the result was scored. It changes whenever the scoring changes.
  • Agents. POST /v1/conversations takes agent: { id?, name?, version? } (a new agent.id creates the agent; without one the conversation goes to the Default agent) and group: { id, name? }. GET /v1/conversations/{id} returns agent and group. New endpoints: GET /v1/agents/{agent_id}/health and GET /v1/groups/{group_id}/health. Webhooks carry agent and group, and health events are agent.health_changed and group.health_changed.
  • Health windows. Each window has handed_to_person_rate (handed to a person: a transfer, or a person requested and provided) and requests_for_person_not_honored.
  • Environment on every webhook. Every payload has a top-level environment, test or live.