Skip to content

Widget config API

The widget calls this endpoint on load to fetch appearance, greeting, and deployment settings. No API key is required — access is gated by deployment ID and domain allowlist.

GET /api/v1/widget/config?deployment_id={id}
Query paramRequiredDescription
deployment_idYesWeb widget deployment ID

The browser sends Origin (or Referer) automatically. Requests from unlisted domains receive 403.

Terminal window
curl "https://api.chatevo.ai/api/v1/widget/config?deployment_id=dep_abc123" \
-H "Origin: https://www.yourbusiness.com"
{
"deployment_id": "dep_abc123",
"assistant_id": "asst_7xK9mN2p",
"appearance": {
"primary_color": "#F97316",
"theme": "light",
"position": "bottom-right",
"greeting": "Hi! How can we help you today?",
"suggested_questions": [
"What are your hours?",
"How do I track my order?"
]
},
"features": {
"streaming": true,
"rich_content": true,
"jwt_required": false
},
"rate_limit": {
"messages_per_minute": 30
}
}

The embed script passes data-deployment-id and fetches config automatically:

<script
src="https://widget.chatevo.ai/chat.js"
data-deployment-id="YOUR_DEPLOYMENT_ID"
data-api-base="https://api.chatevo.ai"
async
></script>

Config responses are CDN-cacheable and target ≤ 300 ms p95. Combined with chat.js, total widget load should be ≤ 2 seconds. See Rate limits.

StatusCauseFix
403Domain not on allowlistDomain allowlist
404Invalid or archived deploymentCheck deployment ID in dashboard
429Widget rate limitRate limit troubleshooting