---
title: "Vapi Save"
method: POST
path: "/v1/voice/vapi/save"
tags: ["Voice"]
---

# Vapi Save

`POST /v1/voice/vapi/save`

## Request

- Base URL: `https://mengram.io` (the document declares no server; this is the origin it was published from)
- URL: `https://mengram.io/v1/voice/vapi/save`
- Auth: none declared. Required headers: `authorization`

Vapi end-of-call webhook: extract memories from the transcript.

Only processes `end-of-call-report` events. Vapi streams MANY events
to the same server URL — status-update, conversation-update, partial
transcript chunks (`message.type == "transcript"`, `transcriptType:
partial`), speech-update, hang, etc. Without a type guard, the save
endpoint would re-run extraction on every partial transcript chunk
(dozens of times per call), burning quota and creating duplicate
memory entries. The guard makes all other events benign no-ops.

For end-of-call-report the final transcript lives at
`message.transcript` AND `message.artifact.transcript` per
https://github.com/VapiAI/docs/blob/main/fern/server-url/events.mdx.
We read whichever is present.

## Headers

- `authorization` string, required

## Request body

- VapiWebhookRequest
  - `message` VapiWebhookMessage, required
    - `type` string, nullable
    - `toolCalls` object[], nullable
    - `toolCallList` object[], nullable
    - `call` VapiCall
      - `customer` VapiCustomer
        - `number` string, nullable
      - `id` string, nullable
      - `type` string, nullable
    - `transcript` string, nullable
    - `artifact` object, nullable
    - `transcriptType` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

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