Transfer only (skip AI) not working
# support
a
Hi this documented feature doesn't seem to work: https://docs.vapi.ai/server-url/events#transfer-only-skip-ai I've tried it a bunch of times, always an "unknown error". the status update shows the call being forwarded, but the audio always says "unknown error" and doesn't forward the call. I've tried with a few phone numbers, and these numbers are able to transfer during the call when the ai calls transferCall just fine. Call ids: 019a3759-f1c6-7886-839e-e725dec1cbb7 019a3759-85f3-7007-9379-7f4db92d8540 019a3758-5b7d-7007-a283-2d1a759c9529
v
Hey, I’ve seen this happen before — that “unknown error” usually means the transferOnly event isn’t matching the call session state or the number format VAPI expects. I can help you check the event payload and flow timing to pinpoint the issue. Often, adjusting when the event triggers or formatting the target number fixes it. Are you firing the event from your webhook or directly from the agent flow? @Alex QS
a
hi, i'm returning the TransferDestinationNumber from my webhook. Exactly as in the linked doc. ie Vapi sends ServerMessageAssistantRequest, I send a ServerMessageResponseAssistantRequest with a destination. I did have an inkling it could be due to timing, I might try adding a 1s wait to see if that helps/works
Yeah tried adding a delay, didn't work. Still "unknown error, contact Vapi support".
v
Thanks for the update! Since you’ve already tried adding a delay and followed the docs, it’s probably not just a timing issue. I’ve seen this happen when the session state or destination number format isn’t exactly what VAPI expects. I can help you check your webhook response and flow to figure out what’s causing that “unknown error.” Could you share your response payload (without sensitive info) so I can take a look? @Alex QS
c
Hi Alex QS, To configure AI-managed call transfers and end them after a period of silence, you should set up the
silenceTimeoutSeconds
parameter in your Transfer Assistant. By default, this timeout is 30 seconds, but you can adjust it to a value between 10 and 3600 seconds. This feature is part of the experimental warm transfer mode, which utilizes AI assistants to manage the transfer process. You can find more details on this in the [August 28, 2025 changelog](https://docs.vapi.ai/changelog/2025/8/28). To implement this, you can follow these steps: 1. Define a
transferAssistant
object within your
transferPlan
. 2. Set the
silenceTimeoutSeconds
to your preferred duration. 3. Ensure that the
mode
is set to
"warm-transfer-experimental"
. Here's a basic configuration example:
Copy code
json
{
  "type": "transferCall",
  "function": {
    "name": "yourTransferFunctionName"
  },
  "destinations": [
    {
      "type": "number",
      "number": "+14155551234",
      "transferPlan": {
        "mode": "warm-transfer-experimental",
        "transferAssistant": {
          "silenceTimeoutSeconds": 45,
          "firstMessage": "Hi, I have a customer on the line.",
          "maxDurationSeconds": 120,
          "model": {
            "provider": "openai",
            "model": "gpt-4o",
            "messages": [
              {
                "role": "system",
                "content": "Facilitate the transfer process by using transferSuccessful or transferCancel tools."
              }
            ]
          }
        }
      }
    }
  ]
}
For detailed steps and configurations, refer to the [Assistant-based warm transfer documentation](https://docs.vapi.ai/calls/assistant-based-warm-transfer).
a
@Aniah I'm not trying to configure an AI-managed call transfer. I provided a link to a Vapi doc (Transfer only skip AI) showing EXACTLY what i'm trying to configure. I'm following the doc exactly and it isn't working.
your response is irrelevant and not at all related to my question
c
Hi Alex, Thanks for clarifying — let’s try narrowing this down. Can you test using a minimal assistant configuration just to populate the
assistant
object, like this:
Copy code
json
{
  "assistant": {
    "firstMessage": "Transferring your call.",
    "model": {
      "provider": "openai", 
      "model": "gpt-3.5-turbo"
    },
    "voice": {
      "provider": "11labs",
      "voiceId": "minimal-voice"
    },
    "endCallFunctionEnabled": false,
    "backgroundSound": "off"
  },
  "destination": {
    "type": "number",
    "number": "+14156756020"
  }
}
If the
destination
object is present in the
assistant-request
, the assistant object should still be ignored — this setup just ensures the structure is valid. If that still doesn’t work, please double-check that your assistant-request-response looks like this:
Copy code
json
{
  "destination": {
    "type": "number",
    "number": "+14156756020",
    "message": ""
  }
}
That will help confirm whether the issue is related to how the event payload is structured. Best, Kyle ---
a
Hi @kyle I have tested with both of these setups already - response with assistant + destination as well as response with destination only. The call id's I shared above covered both scenarios. And tripple, quadruple checked the response's are the correct structure - tried with and without the empty message for example. I am a bit confused by your answer regarding the assistant-request vs assistant-request-response. I don't control the assistant-request really - that's generated by vapi and sent to my endpoint. If i configured an assistant, no such request would get sent to my server (i have a phone number configured without any assistantId etc, so it sends assistant-request to my endpoint).
c
Hi Alex, You’re correct that the
assistant-request
itself is generated and controlled by Vapi — however, the response is what comes from your ngrok endpoint, and that’s the part you can modify. As noted in the documentation, > “If the
destination
object is in the
assistant-request-response
, the AI will get skipped entirely.” So ensuring that your response includes a properly formatted
destination
object is crucial for this behavior to work. If you’re already returning it, please share an example payload (with any sensitive data redacted) so we can verify the structure matches what Vapi expects. Best, Kyle ---
2 Views