> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raptora.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook

> Дуудлага, чат дуусахад мэдээллийг танай сервер рүү автоматаар илгээнэ.

Яриа бүрийн бичвэр, товч агуулга, харилцагчийн мэдээллийг өөрийн CRM-д автоматаар бүртгэнэ. Хуудсыг **Тохиргоо → Webhook** цэсээс нээнэ.

![Webhook-ийн жагсаалт](https://mintcdn.com/raptora-ai/yUv-rZM9Mm_JbqjR/images/webhooks/list-light.png?fit=max\&auto=format\&n=yUv-rZM9Mm_JbqjR\&q=85\&s=df81a95ad419e829a523474e71e407b2)

```mermaid theme={null}
sequenceDiagram
  participant R as Raptora
  participant S as Танай сервер
  Note over R: Яриа дуусаж, товч агуулга бэлэн болсон
  R->>S: POST + webhook-signature
  alt Амжилттай
    S-->>R: 2xx
  else Алдаа эсвэл 10 секундээс удсан
    S-->>R: 5xx
    R->>S: Дахин илгээх, 2 орчим хоног
  end
```

## Нэмэх

**1. Webhook нэмэх**

**Webhook нэмэх** дарж `https://` хаягаа оруулна.

**2. Үйл явдал сонгох**

**Хэзээ илгээх** хэсгээс сонгоод **Нэмэх** дарна. Анхнаасаа бүгд сонгогдсон байдаг.

**3. Турших**

Нээгдсэн цонхны **Туршилт илгээх** дарна. `webhook.test` үйл явдал очно.

**4. Сервер дээрээ шалгах**

[Гарын үсгээ шалгах](#гарын-үсэг-шалгах) кодоо нэмнэ.

Нэг байгууллага 5 хүртэл webhook нэмнэ. Нэмэх, засах эрх Эзэмшигч, Админд байна.

## Үйл явдлууд

| Үйл явдал | Хэзээ |
| - | - |
| `call.ended` | Дуудлага дууссан |
| `call.transferred` | Дуудлагыг хүн рүү шилжүүлсэн |
| `chat.ended` | Чат дууссан |
| `chat.transferred` | Чатыг хүн рүү шилжүүлсэн |

Нэг яриа нэг л үйл явдал илгээнэ: шилжсэн бол «шилжсэн», бусад нь «дууссан».

> [!NOTE]
>
> Товч агуулга бэлэн болсны дараа илгээдэг тул хэдэн минут хоцорч ирж болно.

## Payload

JSON body-той `POST` хүсэлт ирнэ. `data` нь API-ийн [`GET /v1/calls/{id}`](https://docs.raptora.io/api-reference/introduction) болон `GET /v1/chats/{id}` хариутай ижил.

```json theme={null}
{
  "id": "evt_9b1d…",
  "type": "call.ended",
  "createdAt": "2026-11-03T09:14:22.000Z",
  "data": {
    "object": "call",
    "id": "5f0c…",
    "status": "COMPLETED",
    "durationMs": 184000,
    "summary": "Захиалгын төлөв асуусан.",
    "sentiment": "POSITIVE",
    "customer": { "name": "Бат", "phone": "+97677112233" },
    "transcript": [{ "speaker": "CALLER", "text": "Сайн байна уу" }]
  }
}
```

[Нууцлал](https://docs.raptora.io/settings/privacy.md) хуудсанд далдалсан мэдээлэл webhook-оор ч далдалсан хэвээр очно.

## Хариу өгөх

| Таны хариу | Үр дүн |
| - | - |
| `2xx` | Амжилттай |
| 10 секундэд хариугүй | Дахин илгээнэ |
| `3xx` | Дагахгүй, дахин илгээнэ |
| Бусад алдаа | Дахин илгээнэ |
| `410` | Webhook шууд зогсоно |

> [!TIP]
>
> Ижил үйл явдал дахин ирж болно. `webhook-id` нэг үйл явдалд үргэлж ижил тул үүгээр давхардлыг шалга.

## Гарын үсэг шалгах

Хүсэлт бүр гурван header-тэй ирнэ. Энэ нь [Standard Webhooks](https://www.standardwebhooks.com) стандарт тул бэлэн сангуудыг нь ашиглаж болно.

| Header | Утга |
| - | - |
| `webhook-id` | Үйл явдлын дугаар |
| `webhook-timestamp` | Илгээсэн цаг, Unix секундээр |
| `webhook-signature` | `v1,<base64>` HMAC-SHA256 гарын үсэг |

Цонхны **Гарын үсгийн түлхүүр** хэсгээс **Харуулах** дарж түлхүүрээ хуулна. Түлхүүр `whsec_`-ээр эхэлнэ.

```js Node.js theme={null}
import { createHmac, timingSafeEqual } from "node:crypto";

// webhook-id, webhook-timestamp, webhook-signature: "v1,<base64> v1,<base64>"
export const fromRaptora = (secret, headers, rawBody) => {
  const id = headers["webhook-id"];
  const timestamp = Number(headers["webhook-timestamp"]);
  if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > 300) return false;

  const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64");
  const expected = createHmac("sha256", key)
    .update(`${id}.${timestamp}.${rawBody}`)
    .digest("base64");

  return headers["webhook-signature"].split(" ").some((part) => {
    const [, signature = ""] = part.split(",");
    return (
      signature.length === expected.length &&
      timingSafeEqual(Buffer.from(signature), Buffer.from(expected))
    );
  });
};
```

> [!WARNING]
>
> `rawBody` нь задлаагүй түүхий body байна. JSON болгож задалсны дараа гарын үсэг таарахгүй.

Webhook бүр өөрийн түлхүүртэй, [хэрэгслийн гарын үсгийн](https://docs.raptora.io/integrations/request-signing.md) түлхүүртэй холихгүй.

Сэргээх дүрстэй товчоор түлхүүрээ шинэчилнэ. Хуучин нь 24 цаг хүчинтэй, энэ хугацаанд header-т хоёр гарын үсэг ирнэ.

## Илгээлтүүд

![Webhook-ийн дэлгэрэнгүй ба илгээлтүүд](https://mintcdn.com/raptora-ai/yUv-rZM9Mm_JbqjR/images/webhooks/detail-light.png?fit=max\&auto=format\&n=yUv-rZM9Mm_JbqjR\&q=85\&s=50bc64bf0d59480b94974925206049a2)

Жагсаалтаас webhook-оо сонгоход сүүлийн 30 хоногийн илгээлтүүд харагдана. Илгээлт бүрээс хүсэлт, таны серверийн хариуг харж, **Дахин илгээх** дарж болно.

Амжилтгүй илгээлтийг 2 орчим хоногийн турш, нийт 10 хүртэл удаа автоматаар оролдоно. Завсар нь 30 секундээс эхэлж уртсана.

## Зогссон webhook

Дараалан 20 удаа амжилтгүй болж, 3 хоног нэг ч амжилттай илгээлтгүй бол webhook **Зогсоосон** төлөвт орж, хуудасны дээд хэсэгт улаан мэдэгдэл гарна.

Серверээ засаад унтраалгаар дахин асааж, **Туршилт илгээх** дарна.

> [!TIP]
>
> Сервер засвартай үед устгахын оронд унтраа.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.