Get the AI processing progress

Add MCP server to your AI tool

Allow AI tools and LLMs to interact with the API documentation portal through MCP.

MCP server URL

https://docs.usehearsay.com/mcp

Standard setup for AI tools providing an mcp.json file

mcp.json
{
  "integrations MCP server": {
    "url": "https://docs.usehearsay.com/mcp"
  }
}

Close
GET /ai/cases/{caseId}/progress

Returns the AI processing status of the case for one evidence source (device messages by default): chunking, embedding and summarization progress with an overall percentage, timings, an embedding time estimate and the last error. Returns 404 when processing has not started for that source. Requires commenter access or above to the case and an active plan (403 otherwise); not available to opposing counsel.

Path parameters

  • caseId string Required

    Id of the case

Query parameters

  • source string

    Source to inspect; defaults to device_message

    Values are device_message, linkedin, reddit, discord, email, or ai_chat.

Responses

  • 200 application/json
    Hide response attributes Show response attributes object
    • data object Required
      Hide data attributes Show data attributes object
      • case string Required
      • organization string | null
      • source string Required

        Values are device_message, linkedin, reddit, discord, email, or ai_chat.

      • status string Required

        Values are not_started, in_progress, ready, or failed.

      • chunking object Required
        Hide chunking attributes Show chunking attributes object
        • conversationsTotal number Required
        • conversationsDone number Required
        • percent number Required

          0–100

        • startedAt string(date-time) | null
        • finishedAt string(date-time) | null
      • embedding object Required
        Hide embedding attributes Show embedding attributes object
        • messagesTotal number Required
        • messagesDone number Required
        • percent number Required

          0–100

        • startedAt string(date-time) | null
        • finishedAt string(date-time) | null
        • ratePerSec number | null
        • etaSeconds number | null

          Estimated seconds remaining for the embedding phase

      • summarization object Required
        Hide summarization attributes Show summarization attributes object
        • chunksTotal number Required
        • chunksDone number Required
        • percent number Required

          0–100

        • startedAt string(date-time) | null
        • finishedAt string(date-time) | null
      • overallPercent number Required

        Combined progress across the running phases (0–100)

      • startedAt string(date-time) | null
      • lastProgressAt string(date-time) | null
      • finishedAt string(date-time) | null
      • errorCount number Required
      • lastError string | null
    • statusCode number Required
    • timestamp string(date-time) Required
GET /ai/cases/{caseId}/progress
curl \
 --request GET 'http://api.example.com/ai/cases/{caseId}/progress' \
 --header "Authorization: Bearer $ACCESS_TOKEN"
Response examples (200)
{
  "data": {
    "case": "65a1b2c3d4e5f6a7b8c9d0e2",
    "organization": "65a1b2c3d4e5f6a7b8c9d0e3",
    "source": "device_message",
    "status": "in_progress",
    "chunking": {
      "conversationsTotal": 40,
      "conversationsDone": 40,
      "percent": 100,
      "startedAt": "2026-01-15T10:15:00.000Z",
      "finishedAt": "2026-01-15T10:20:00.000Z"
    },
    "embedding": {
      "messagesTotal": 12000,
      "messagesDone": 9000,
      "percent": 75,
      "startedAt": "2026-01-15T10:15:00.000Z",
      "finishedAt": "2026-05-04T09:42:00Z",
      "ratePerSec": 25,
      "etaSeconds": 120
    },
    "summarization": {
      "chunksTotal": 300,
      "chunksDone": 0,
      "percent": 0,
      "startedAt": "2026-05-04T09:42:00Z",
      "finishedAt": "2026-05-04T09:42:00Z"
    },
    "overallPercent": 58,
    "startedAt": "2026-01-15T10:15:00.000Z",
    "lastProgressAt": "2026-01-15T10:20:00.000Z",
    "finishedAt": "2026-05-04T09:42:00Z",
    "errorCount": 0,
    "lastError": "string"
  },
  "statusCode": 200,
  "timestamp": "2026-01-15T10:15:00.000Z"
}