Custom Domains
Create, configure, and manage custom domains via the Dashboard API.
Custom domains are the production path for LiyaEngine tenants. Use them to define your own AI domains with custom intents, agents, workflows, prompt templates, and knowledge sources. All custom domain management is done through the /dashboard/custom-domains endpoints.
For a guided walkthrough see Custom Domain Walkthrough.
GET /dashboard/custom-domains
List all custom domains for your tenant.
GET https://api.liyaengine.ai/dashboard/custom-domains
Authorization: Bearer <jwt>Response:
{
"success": true,
"data": {
"domains": [
{
"id": "cdom_01HZ...",
"domainKey": "legal_contracts",
"displayName": "Legal Contracts",
"description": "AI assistant for contract review and clause extraction",
"systemPrompt": "You are a legal assistant specialised in contract analysis...",
"isActive": true,
"intentCount": 3,
"createdAt": "2026-01-20T09:00:00Z",
"updatedAt": "2026-02-10T14:30:00Z"
}
]
}
}POST /dashboard/custom-domains
Create a new custom domain.
POST https://api.liyaengine.ai/dashboard/custom-domains
Authorization: Bearer <jwt>
Content-Type: application/json
{
"domainKey": "legal_contracts",
"displayName": "Legal Contracts",
"description": "AI assistant for contract review and clause extraction",
"systemPrompt": "You are a legal assistant specialised in contract analysis. You help users review, summarise, and extract key clauses from contracts."
}Request body:
| Field | Type | Required | Description |
|---|---|---|---|
domainKey | string | Yes | Unique identifier used in API calls — lowercase letters, numbers, underscores only |
displayName | string | Yes | Human-readable name shown in the dashboard |
description | string | No | Short description of the domain's purpose |
systemPrompt | string | Yes | Base system prompt applied to all intents in this domain |
domainKey rules:
- Lowercase letters, numbers, and underscores only
- Must be unique within your tenant
- Cannot conflict with reserved sample domain names (
hiring,fintech,healthcare,ehs) - Cannot be changed after creation
Response:
{
"success": true,
"data": {
"domain": {
"id": "cdom_01HZ...",
"domainKey": "legal_contracts",
"displayName": "Legal Contracts",
"isActive": true,
"createdAt": "2026-03-15T10:00:00Z"
}
}
}PATCH /dashboard/custom-domains/:domainKey
Update a custom domain's display name, description, or system prompt.
PATCH https://api.liyaengine.ai/dashboard/custom-domains/legal_contracts
Authorization: Bearer <jwt>
Content-Type: application/json
{
"displayName": "Legal Contract Review",
"systemPrompt": "Updated system prompt..."
}DELETE /dashboard/custom-domains/:domainKey
Permanently deletes a custom domain, all its intents, and any associated knowledge sources. This is irreversible.
DELETE https://api.liyaengine.ai/dashboard/custom-domains/legal_contracts
Authorization: Bearer <jwt>Intents
GET /dashboard/custom-domains/:domainKey/intents
GET https://api.liyaengine.ai/dashboard/custom-domains/legal_contracts/intents
Authorization: Bearer <jwt>Response:
{
"success": true,
"data": {
"intents": [
{
"id": "cint_01HZ...",
"intentKey": "clause_extraction",
"displayName": "Clause Extraction",
"promptTemplate": "Extract all {{clause_type}} clauses from the following contract:\n\n{{contract_text}}",
"outputSchema": null,
"isActive": true
}
]
}
}POST /dashboard/custom-domains/:domainKey/intents
POST https://api.liyaengine.ai/dashboard/custom-domains/legal_contracts/intents
Authorization: Bearer <jwt>
Content-Type: application/json
{
"intentKey": "clause_extraction",
"displayName": "Clause Extraction",
"promptTemplate": "Extract all {{clause_type}} clauses from the following contract:\n\n{{contract_text}}",
"outputSchema": {
"clauses": "array of extracted clause objects",
"summary": "brief summary of findings"
}
}| Field | Type | Required | Description |
|---|---|---|---|
intentKey | string | Yes | Lowercase, underscores — used in API path |
displayName | string | Yes | Human-readable name |
promptTemplate | string | Yes | Prompt with {{variable}} placeholders for input fields |
outputSchema | object | No | Describes expected output structure — used for documentation only |
Variables in promptTemplate (e.g. {{contract_text}}) become required input fields when calling the intent via the v1 API.
Calling a custom domain intent
Once created, custom intents use the same runtime contract as the sample domains:
POST https://api.liyaengine.ai/v1/legal_contracts/clause_extraction
X-API-Key: liya_prod_...
Content-Type: application/json
{
"input": {
"clause_type": "termination",
"contract_text": "This Agreement may be terminated by either party..."
},
"options": {
"session_id": "sess_01HZ..."
}
}See Defining Intents for full details on prompt templates and variable mapping.