---
title: "Support Assistant finished event"
method: POST
path: "support.run.completed"
tags: ["Webhook Events"]
---

# Support Assistant finished event

`POST support.run.completed` (webhook)

Fired when the Support Assistant finishes a question. run.status is completed, or needs_human when the assistant handed the question to a person. The run object matches GET /v1/support/runs/{runId}.

## Payload

- WebhookPayloadSupportRun
  - `test` boolean: Always true when present: only a sample sent by POST /v1/webhooks/test with an event carries it. Real deliveries never do.
  - `id` string, required: Event id, the dedupe key.
  - `event` 'support.run.completed' | 'support.run.failed', required
  - `timestamp` string, date-time, required
  - `run` SupportRun, required
    - `runId` string, required: Run id, a 24-character hex string.
    - `threadId` string, required: Conversation thread id. Send it back as `threadId` to ask a follow-up in the same thread.
    - `status` 'queued' | 'running' | 'completed' | 'needs_human' | 'failed', required: queued and running are in progress. needs_human means the assistant handed the question to a person instead of answering; when `supportTicket` is set, a Zernio teammate has been notified and will follow up by email.
    - `stopReason` 'answered' | 'human_review' | 'cost_cap' | 'deadline' | 'max_iterations' | 'error' | 'expired' | 'null', nullable, required: Why the run stopped. Null while it is in progress.
    - `question` string, nullable, required: The question as asked, with leading and trailing whitespace trimmed. Null only on runs created before this field was added.
    - `answer` string, nullable, required: The assistant's answer. Null while the run is in progress or when it failed.
    - `diagnosis` SupportRunDiagnosis, required
      - `category` 'account_connection' | 'content_rejected' | 'rate_limited' | 'platform_issue' | 'zernio_issue' | 'billing' | 'configuration' | 'how_to' | 'other', required: What kind of problem the answer describes. New values may be added: treat any value you do not recognize as `other`.
      - `cause` string, nullable, required: The cause the answer gives, in one sentence. Null when the answer reports no problem, for example a how-to question.
      - `fixSteps` string[], required: The steps the answer recommends, in order. Empty when it recommends none.
      - `docsLinks` string[], required: Links to docs.zernio.com that the answer itself cites. Empty when it cites none.
      - `whoMustAct` 'integrator' | 'end_user' | 'zernio' | 'platform' | 'none', required: Who has to act to resolve it: you (`integrator`), your end user, Zernio, the social platform, or nobody. New values may be added: treat any value you do not recognize as `none`.
    - `usage` SupportRunUsage, required
      - `inputTokens` integer, required
      - `outputTokens` integer, required
      - `cacheReadTokens` integer, required
      - `cacheWriteTokens` integer, required
    - `costUsd` number, required: The exact amount charged for the question, in USD, never above `maxCostUsd`. 0 for a failed run.
    - `maxCostUsd` number, required: The cost cap this run was started with, in USD.
    - `createdAt` string, date-time, required
    - `startedAt` string, date-time, nullable, required
    - `finishedAt` string, date-time, nullable, required
    - `supportTicket` object, nullable, required: Set when the assistant opened a support ticket with the Zernio team. Null otherwise. A teammate follows up by email with the user whose API key started the run.
      - `openedAt` string, date-time, required
    - `pollAfterSeconds` integer: Seconds to wait before polling again. Present only while the run is queued or running.

## Acknowledgement `200`

Webhook received successfully

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/4e74db179e73?raw)
