Vapi Support Bot
09/26/2025, 8:58 PMhttps://dashboard.vapi.ai to the list of allowed origins.
3. Save your changes.
This will enable the dashboard to use your key without origin errors.
Source:
- [Web widget documentation](https://docs.vapi.ai/chat/web-widget)Chiranjeet Mishra
09/30/2025, 7:37 PMhttps://yourdomain.com
- https://app.yourdomain.com
- http://localhost:3000 (for development)
Note: Using * for all origins is not recommended for security reasons.
If you're still experiencing issues after updating the origins, verify:
1. The exact domain making the request matches what you've allowed
2. The protocol (http/https) matches
3. The port number matches (if specified)Roxxy
12/02/2025, 2:14 PMVapi Support Bot
12/02/2025, 2:16 PMbash
curl https://api.vapi.ai/tool \
-H "Authorization: Bearer <your_token>"
If the 403 error persists, ensure the allowed origin in your API key settings matches the request's domain, protocol, and port exactly as shown in the dashboard documentation.
Reference: [Vapi API Reference](https://docs.vapi.ai/api-reference/tools/list?explorer=true)
Source:
- [Vapi API Reference](https://docs.vapi.ai/api-reference/tools/list?explorer=true)Roxxy
12/02/2025, 2:20 PMVapi Support Bot
12/02/2025, 2:22 PMjs
// Backend proxy example
app.post('/vapi-proxy', async (req, res) => {
const response = await fetch('https://api.vapi.ai/call/web', {
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.VAPI_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify(req.body)
});
res.status(response.status).send(await response.json());
});
Call your proxy endpoint from your client instead of calling Vapi directly. This avoids CORS/origin issues and keeps your API key secure.
See: [Proxy server guide](https://docs.vapi.ai/security-and-privacy/proxy-server)
Source:
- [Proxy server guide](https://docs.vapi.ai/security-and-privacy/proxy-server)Roxxy
12/02/2025, 2:39 PMVapi Support Bot
12/02/2025, 2:41 PMjs
app.post('/vapi-proxy', async (req, res) => {
const response = await fetch('https://api.vapi.ai/call/web', {
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.VAPI_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify(req.body)
});
res.status(response.status).send(await response.json());
});
Call your /vapi-proxy endpoint from your client or Postman instead of calling Vapi directly. This will ensure the Vapi API receives a valid request and avoids the origin error.
See: [Proxy server guide](https://docs.vapi.ai/security-and-privacy/proxy-server)
Source:
- [Proxy server guide](https://docs.vapi.ai/security-and-privacy/proxy-server)Roxxy
12/02/2025, 2:43 PMRoxxy
12/08/2025, 9:47 AMVapi Support Bot
12/08/2025, 9:48 AMjs
app.post('/vapi-proxy', async (req, res) => {
const response = await fetch('https://api.vapi.ai/call/web', {
method: 'POST',
headers: { 'Authorization': `Bearer ${process.env.VAPI_API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify(req.body)
});
res.status(response.status).send(await response.json());
});
Call this /vapi-proxy endpoint from your client, passing the public token and assistant details in the body. This approach also supports handling first-message behavior and storing conversation history on your server.
See: [Proxy server guide](https://docs.vapi.ai/security-and-privacy/proxy-server)
Source:
- [Proxy server guide](https://docs.vapi.ai/security-and-privacy/proxy-server)Chiranjeet Mishra
01/09/2026, 2:35 AMOrigin.
If you’re making a server-side request (e.g. from Postman, backend code, or cURL), do not use a public/restricted token. Use your private API key instead. If your key is still throwing this error, create a new VAPI API private and public key with the assistants field empty to allow all assistants access.
Example working request:
curl -X POST "https://api.vapi.ai/call/web" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"assistantId": "YOUR_ASSISTANT_ID"
}'