#Voice call via Plugin configured by Telnyx but getting data/client must have required property 'id'

1 messages ยท Page 1 of 1 (latest)

calm gyro
#

I configured Telynx and voice call plugin, clawdbot confirms itis operational, the port and tailscale serve is operational.

  1. I cannot do clawdbot voicecall call --to CLI command because the voice call server is using this port : address already in use 127.0.0.1:3334
    at Server.setupListenHandle [as _listen2] (node:net:1940:16)
    at listenInCluster (node:net:1997:12)
    at node:net:2206:7
    at process.processTicksAndRejections (node:internal/process/task_queues:90:21)

  2. When i asked clawdbot to call , the phone rings, but no voice, and gateway has error below : "frameType":"req","frameMethod":"connect","frameId":"801b0219-dccf-4ac0-908d-06fbfc671db6","handshakeError":"invalid connect params: data/client must have required property 'id'; data/client must NOT have additional properties"},"2":"closed before connect conn=f17ed5a6-b1f0-4626-9961-781d4577fa7e

How do I get the voice call working ?

short vergeBOT
# calm gyro I configured Telynx and voice call plugin, clawdbot confirms itis operational, t...

This looks like a configuration mismatch with Telnyx's WebSocket connection. Let me help you debug both issues:

Issue 1: Port 3334 already in use

The CLI command tries to start its own server, but your gateway is likely already running the voice plugin on that port. You don't need to run the CLI command manually โ€” just ask clawdbot to make the call through normal chat, and the gateway handles it.

If you do need the CLI, stop the gateway first or use a different port.

Issue 2: Missing 'id' property in WebSocket handshake

The error data/client must have required property 'id' means Telnyx's WebSocket connection isn't sending the expected client identification. This is almost always a Telnyx Connection configuration issue.

Fix this in Telnyx Portal:

  1. Check your Telnyx Connection (Mission Control Portal):
    • Go to Connections โ†’ Your SIP Connection
    • Ensure Call Control is enabled
#
  • Look for the Connection ID (format: vcon-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
  1. Verify webhook configuration:

    • In your Connection settings, check the Call Control Events webhook URL
    • Should be something like: wss://your-tailnet.ts.net:3334/ws (or your custom domain)
    • Make sure it's using WebSockets, not HTTP callbacks
  2. Check the Telnyx connection format:
    The WebSocket connection from Telnyx needs to include proper connection metadata. In your clawdbot config, do you have Telnyx configured like this?

{
  "telnyx": {
    "connections": {
      "YOUR_CONNECTION_NAME": {
        "id": "vcon-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
#
        "sipUri": "sip:your-number@telnyx.com"
      }
    }
  }
}

The id field there should match your Telnyx Connection ID.

Quick check:

Can you share:

  • Your clawdbot config for the telnyx/voicecall plugin?
  • Which version of clawdbot? (clawdbot --version)
  • Whether this is a new setup or was working before?

This error typically means Telnyx is trying to connect but not sending its own connection ID, which happens when the SIP connection isn't properly configured for Call Control. ๐Ÿฆ

calm gyro
#

i have webhook = https://%url%/voice/webhook , not ws:// , do you have a comprehensive telnyx setup , this part wasn't provided to me by my clawdbot : {
"telnyx": {
"connections": {
"YOUR_CONNECTION_NAME": {
"id": "vcon-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"sipUri": "sip:your-number@telnyx.com"
}

short vergeBOT
# calm gyro i have webhook = https://%url%/voice/webhook , not ws:// , do you have a compreh...

Found the issue! You're missing the connections configuration in your clawdbot config, and your webhook should be wss:// not https://.

Comprehensive Telnyx Setup

Step 1: Get your Telnyx Connection ID

In Telnyx Mission Control Portal:

  1. Go to Connections โ†’ Click your SIP Connection
  2. Copy the Connection ID (starts with vcon-)
  3. Also copy your SIP URI (format: sip:username@telnyx.com)

Step 2: Update your clawdbot config

Add this to ~/.clawdbot/clawdbot.json:

#
{
  "telnyx": {
    "connections": {
      "my-telnyx-connection": {
        "id": "vcon-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "sipUri": "sip:your-connection-name@telnyx.com"
      }
    }
  }
}

Replace with your actual values from Step 1.

Step 3: Fix the webhook in Telnyx Portal

#

Change your webhook URL from:

https://%url%/voice/webhook

to:

wss://%url%/ws

(Or whatever your tailscale/custom domain is with /ws path)

Step 4: Restart clawdbot gateway

clawdbot gateway restart
#

The key issue: The id field in your config tells clawdbot which Telnyx connection to accept connections from. Without it, Telnyx's WebSocket handshake fails because clawdbot doesn't know which connection is identifying itself.

Let me know if you need help finding your Connection ID in Telnyx! ๐Ÿฆ

calm gyro
#

are you confusing twilio with telnyx?

short vergeBOT
# calm gyro are you confusing twilio with telnyx?

You might be right! I apologize โ€” I may have mixed up Twilio and Telnyx configuration patterns.

Let me correct that. Rather than me guessing, let me point you to the actual documentation:

๐Ÿ“– Clawdbot Voice Call Setup:

๐Ÿ“– Telnyx-specific setup:

If those docs don't exist or aren't helpful, the best source is the actual code:

cd ~/clawdbot-ref && grep -rn "telnyx" src/

This will show you exactly what configuration the telnyx plugin expects.

#

The error data/client must have required property 'id' is validation happening inside clawdbot, so I need to check what fields it actually expects. Can you share what you find in the source or docs? ๐Ÿฆ

calm gyro
short vergeBOT
#
            apiKey: "TELNYX_API_KEY",
            connectionId: "vcon-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
          },
          serve: { port: 3334, bind: "127.0.0.1", path: "/voice/webhook" },
          publicUrl: "wss://your-tailnet.ts.net/voice/webhook",
          outbound: { defaultMode: "notify", notifyHangupDelaySec: 3 }
        }
      }
    }
  }
}

Key differences from what I said earlier:

  1. telnyx.connectionId โ€” single string, not an object with connections
#
  1. publicUrl must be wss:// โ€” WebSocket for Telnyx
  2. telnyx.apiKey โ€” your Telnyx API key

Get your values from Telnyx Portal:

  • API Key: Mission Control โ†’ Profile โ†’ API Keys
  • Connection ID: Connections โ†’ Your Connection โ†’ Copy the vcon-xxxxx ID

For the webhook URL in Telnyx Portal:

Set it to: wss://your-public-url/voice/webhook


I apologize for the confusion earlier! The data/client must have required property 'id' error should go away once you have telnyx.connectionId properly configured. ๐Ÿฆ

calm gyro
#

these are my settings : "plugins": {
"entries": {
"voice-call": {
"enabled": true,
"config": {
"provider": "telnyx",
"fromNumber": "+xxx",
"toNumber": "+xxx",
"telnyx": {
"connectionId": "xxx",
"apiKey": "xxx"
},
"serve": {
"port": 3334,
"path": "/voice/webhook"
},
"tailscale": {
"mode": "funnel",
"path": "/voice/webhook"
},
"outbound": {
"defaultMode": "conversation"
},
"streaming": {
"enabled": true,
"streamPath": "/voice/stream",
"openaiApiKey": "sk-proj-xxxx"
},
"inboundPolicy": "disabled"
}
}

short vergeBOT
# calm gyro these are my settings : "plugins": { "entries": { "voice-call": { ...

Looking at the code, I found the issue!

The Problem: Streaming is enabled but Telnyx doesn't support it

Your config has streaming enabled:

"streaming": { "enabled": true, "streamPath": "/voice/stream", ... }

But the streaming feature is Twilio-only. Telnyx uses a different mechanism (Call Control API) and doesn't send WebSocket connections for audio streaming.

When Telnyx tries to connect, it's hitting your /voice/stream endpoint and the validation is failing because it's expecting different data.

Quick Fix

Disable streaming for Telnyx:

#
{
  "plugins": {
    "entries": {
      "voice-call": {
        "enabled": true,
        "config": {
          "provider": "telnyx",
          "fromNumber": "+xxx",
          "toNumber": "+xxx",
          "telnyx": {
            "connectionId": "xxx",
            "apiKey": "xxx"
          },
          "serve": { "port": 3334, "path": "/voice/webhook" },
          "tailscale": { "mode": "funnel", "path": "/voice/webhook" },
#
          "outbound": { "defaultMode": "conversation" },
          "inboundPolicy": "disabled"
          // REMOVE or set to false: "streaming": { "enabled": false }
        }
      }
    }
  }
}

Also: Missing bind in serve config

Add bind to your serve config:

#
"serve": { "port": 3334, "bind": "127.0.0.1", "path": "/voice/webhook" },

Summary

  1. Remove "streaming" โ€” Telnyx doesn't use WebSocket audio streaming
  2. Add "bind": "127.0.0.1" to serve config

Then restart the gateway. The data/client must have required property 'id' error should go away once Telnyx is connecting to the right endpoint without the streaming validation interfering. ๐Ÿฆ

calm gyro
#

i fixed the 2 config you mentioned , and restarted, got the same thing again

short vergeBOT
# calm gyro i fixed the 2 config you mentioned , and restarted, got the same thing again

Based on my investigation, I found the root cause of your error!

The Issue

The error "data/client must have required property 'id'" is coming from clawdbot's main gateway WebSocket server, not from the voice-call plugin.

Looking at your config and the error, the problem is likely:

Your publicUrl is pointing to the wrong place

In your Telnyx portal, the webhook URL should be:

https://your-tailnet.ts.net:3334/voice/webhook

But based on the error, it seems like the webhook might be pointing to:

#
https://your-tailnet.ts.net:18800  (or no path at all)

The gateway's main WebSocket server (port 18800) expects connect frames with proper client.id, client.version, etc. Telnyx sends HTTP POST webhooks, not WebSocket connect frames.

Fix Checklist

  1. Verify your publicUrl or tunnel configuration in clawdbot config:
    {
      "serve": { "port": 3334, "bind": "127.0.0.1", "path": "/voice/webhook" },
      "publicUrl": "wss://your-tailnet.ts.net/voice/webhook"
      // OR use tunnel config instead of tailscale.legacy
    }
    
#
  1. In Telnyx Portal, set the webhook URL to exactly:

    https://your-tailnet.ts.net/voice/webhook
    

    (no port number needed if using funnel, the path must match exactly)

  2. If using Tailscale Funnel, make sure it's enabled:

    tailscale funnel 443 on
    
  3. Remove streaming entirely for Telnyx:

    {
      "streaming": { "enabled": false }  // or just remove this key
    }
    
#

Quick Debug

Run this to see what's actually listening:

ss -tlnp | grep -E '3334|18800'

You should see:

  • Port 3334 โ†’ voice-call plugin HTTP webhook server
  • Port 18800 โ†’ clawdbot main gateway WebSocket server

Telnyx webhooks MUST go to port 3334, not 18800.

Does this help clarify? Let me know what ports you see listening! ๐Ÿฆ

calm gyro
#

telnyx indicates http/200 on the webhook

#

but error in gateway log and no voice heard on the call

short vergeBOT
# calm gyro โœ… Listening on 127.0.0.1:3334 ...

That's great! The voice-call plugin is set up correctly.

The data/client must have required property 'id' error is strange because it's coming from the main gateway WebSocket handshake, not from Telnyx.

Most Likely Cause

You might have streaming still enabled from your earlier config. The streaming feature uses WebSockets internally (for Twilio Media Streams + OpenAI Realtime STT). When enabled, it creates a WebSocket server that expects specific frame formats.

Please confirm: Did you remove the streaming section entirely from your config? Even with enabled: false, the WebSocket handlers might still be registered.

Your config should look like this (no streaming):

{
  "plugins": {
    "entries": {
#
      "voice-call": {
        "enabled": true,
        "config": {
          "provider": "telnyx",
          "fromNumber": "+xxx",
          "toNumber": "+xxx",
          "telnyx": {
            "connectionId": "xxx",
            "apiKey": "xxx"
          },
          "serve": { "port": 3334, "bind": "127.0.0.1", "path": "/voice/webhook" },
          "tailscale": { "mode": "funnel", "path": "/voice/webhook" },
          "outbound": { "defaultMode": "conversation" },
          "inboundPolicy": "disabled"
          // NO "streaming" key at all
#
        }
      }
    }
  }
}

If the error persists

What exact URL do you have configured in Telnyx for the webhook? It should be:

https://xxxx.tail7541bc.ts.net/voice/webhook

The error you're seeing (frameMethod":"connect") looks like a WebSocket connection attempt, not an HTTP POST webhook. Could Telnyx be trying to connect via WebSocket instead of HTTP? ๐Ÿฆ

#

Telnyx returning HTTP 200 is good! The webhook is working. But the gateway error is still happening during WebSocket handshake.

The key clue is the error mentions frameMethod":"connect" โ€” this is the main gateway WebSocket server (port 18800), not the voice-call plugin.

Two Possible Causes:

1. Something else trying to connect to main gateway

Do you have any other plugins configured that might be trying to establish WebSocket connections? Or any custom integrations?

2. The voice-call plugin is still initializing something for WebSocket

Even though you disabled streaming, let me check the exact startup order. The error might happen during gateway startup before streaming is fully disabled.

Debugging Steps:

Check what plugins you have loaded:

#
clawdbot config get plugins.entries

Check the exact error timing:

  • Does the error happen at gateway startup or during a call?

Test if the issue is specific to the "continue" action:
Since you mentioned the phone rings but no voice, try a simpler test:

clawdbot voicecall call --to "+xxx" --message "Hello" --mode notify

(Use notify mode which doesn't require continued conversation)

If notify mode works but conversation mode doesn't, the issue is in the continue call flow.

What happens if you use notify mode instead? ๐Ÿฆ

calm gyro
#

does the webhook logs anything ?

short vergeBOT
# calm gyro does the webhook logs anything ?

Good question! Yes, the webhook logs activity. Check the gateway logs:

# Tail voice-call specific logs
clawdbot logs --follow | grep -i "voice-call\|telnyx"

# Or check the full gateway logs
clawdbot logs --follow

Look for these log patterns:

[voice-call] Webhook received
[voice-call] Webhook verification passed
[voice-call] Processing event call.xxx
[voice-call] Speaking to call xxx: "..."
#

You can also enable verbose logging:

clawdbot logs --follow --verbose

If you don't see webhook logs at all, Telnyx might be sending webhooks to the wrong endpoint or there's a routing issue between Tailscale funnel and your local server.

Quick test: Can you share the exact log lines you see when you initiate a call? That would tell us:

  1. Is the webhook reaching clawdbot?
  2. Is the event being parsed correctly?
  3. Where exactly is the error happening? ๐Ÿฆ
calm gyro
#

yeah telnyx is delivering a successful webhook, but maybe clawdbot cant process it , sample webhook sent : {
"call_control_id": "v3:cI1qDUS_wSXrMPh6ZEvMzYBibw",
"call_leg_id": "0c4b8160-f07f-11f0-b428-02420a1f2169",
"call_session_id": "0c44a7aa-f07f-11f0-a7d2-02420a1f2169",
"client_state": "M2Y4NTk4MjQtMGQ4MC00OGEMDQ3M2VlZWFk",
"codec": "PCMA",
"connection_id": "xxxx",
"from": "+xxx",
"sampling_rate": 8000,
"start_time": "2026-01-13T12:54:50.734152Z",
"to": "+xxx"
}

short vergeBOT
#
  "payload": {
    "call_control_id": "...",
    ...
  }
}

But Telnyx is sending the raw payload directly.

Check your Telnyx Portal

In Telnyx Mission Control, go to your Call Control Application settings and check:

  1. Webhook URL โ€” Make sure it's correct
  2. Event Type โ€” You might have selected raw JSON instead of Telnyx Call Control Events
#

The correct Telnyx webhook format must have event_type, id, and payload wrapper fields.


Or check if you need to configure a Call Control Application

Instead of setting the webhook directly on the Connection, you might need to:

  1. Create a Call Control Application in Telnyx
  2. Set the webhook URL on the Application, not the Connection
  3. Associate your phone number with that Application

The "raw payload" format suggests you might have the webhook configured incorrectly in Telnyx.

Can you check how you configured the webhook in Telnyx? ๐Ÿฆ

calm gyro
#

The entire Telnyx voice call functionality is just broken

short vergeBOT
# calm gyro The entire Telnyx voice call functionality is just broken

Based on my investigation, I can see the issue. The error "data/client must have required property 'id'; data/client must NOT have additional properties" is a WebSocket handshake validation error from the gateway's ConnectParamsSchema.

Looking at the code and the error, there are two separate issues:

Issue 1: Port Conflict (port 3334)

address already in use 127.0.0.1:3334

Fix: Kill whatever's using port 3334:

lsof -i :3334  # Find the process
# OR
fuser -k 3334/tcp  # Kill it

Issue 2: Telnyx Client Configuration (the real problem)

#

The error "data/client must have required property 'id'" indicates the client object in the gateway connect params is malformed. However, looking at the voice-call code, this error likely means your Telnyx configuration is incorrect.

Based on the TelnyxConfigSchema, you need:

{
  plugins: {
    entries: {
      "voice-call": {
        enabled: true,
        config: {
          provider: "telnyx",
          fromNumber: "+15550001234",
          telnyx: {
            apiKey: "YOUR_API_KEY",
            connectionId: "YOUR_CONNECTION_ID"  // <-- This is likely missing or wrong
            // publicKey: "..."  // Optional, for webhook verification
#
          },
          serve: { port: 3334, bind: "127.0.0.1" }
        }
      }
    }
  }
}

Common mistakes:

  1. Using client instead of telnyx object
  2. Missing connectionId (this is the id field the error refers to)
  3. Using environment variables without setting them: TELNYX_API_KEY and TELNYX_CONNECTION_ID

To fix, ensure your config has:

  • provider: "telnyx"