Skip to main content

Using the REST API

This guide provides practical examples for the most common tasks in uxopian-ai: managing conversations, sending requests, orchestrating goals, and accessing admin endpoints.

For details on the security model and authentication headers, see Security Model (BFF Pattern).


Prerequisites: Authentication Headers

Uxopian-ai never handles authentication itself — it relies on a BFF Gateway to validate credentials and inject identity headers into every request. See Security Model (BFF Pattern) for the full architecture.

HeaderDescriptionRequired
X-User-TenantIdIsolates data per tenant (organization).Yes
X-User-IdUnique identifier for the user.Yes
X-User-RolesComma-separated list of roles (e.g., admin,user).No
X-User-TokenOriginal user token, forwarded to integrations (FlowerDocs, ARender).No

The Gateway authenticates the user (OAuth2, JWT, LDAP...), extracts identity from the session, and enriches the request with these X-User-* headers before forwarding it to uxopian-ai. The AI service trusts these headers implicitly — which is why uxopian-ai must never be exposed directly to the network.

Development Mode

In development mode (SPRING_PROFILES_ACTIVE=dev), the AI service accepts requests without headers and fills in defaults (User-development / Tenant-development). The examples below include explicit headers so they work in both dev and production environments. See Development Mode for details.


1. Creating a Conversation

Conversations are the container for all history and context. They are scoped to the specific X-User-TenantId provided in the headers.

  • Endpoint: POST /api/v1/conversations

Example: Gateway forwarding a creation request

cURL

curl -X POST "http://localhost:8080/api/v1/conversations" \
-H "Content-Type: application/json" \
-H "X-User-TenantId: enterprise-corp-a" \
-H "X-User-Id: user-james-bond" \
-H "X-User-Roles: user"

JavaScript (Node.js / Gateway Logic)

const createConversation = async (tenantId, userId) => {
const response = await fetch(
"http://uxopian-ai-service:8080/api/v1/conversations",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"X-User-TenantId": tenantId,
"X-User-Id": userId,
},
}
);

const data = await response.json();
console.log("New Conversation ID:", data.id);
return data;
};

2. Sending a Text Request (Non-Streaming)

Send a prompt to the LLM within a conversation. The X-User-TenantId ensures the user only accesses conversations they belong to.

  • Endpoint: POST /api/v1/requests
  • Query Parameter: conversation (Required)

Example: Standard User Query

cURL

curl -X POST "http://localhost:8080/api/v1/requests?conversation=123e4567-e89b-12d3-a456-426614174000" \
-H "Content-Type: application/json" \
-H "X-User-TenantId: enterprise-corp-a" \
-H "X-User-Id: user-james-bond" \
-d '{
"inputs": [
{
"role": "user",
"content": [
{
"type": "text",
"value": "How do I reset my password?"
}
]
}
]
}'

3. Triggering a Goal (Orchestration)

Use the goal type to let uxopian-ai select the correct prompt based on the payload context.

  • Content Type: goal
  • Payload: Context data for the filter engine.

Example: Intelligent Goal Routing

cURL

curl -X POST "http://localhost:8080/api/v1/requests?conversation=123e4567-e89b-12d3-a456-426614174000" \
-H "Content-Type: application/json" \
-H "X-User-TenantId: enterprise-corp-a" \
-H "X-User-Id: user-james-bond" \
-d '{
"inputs": [
{
"role": "user",
"content": [
{
"type": "goal",
"value": "analyze_document",
"payload": {
"docType": "financial_report",
"quarter": "Q3"
}
}
]
}
]
}'

4. Sending a Streaming Request

For real-time responses (typing effect), use the streaming endpoint.

  • Endpoint: POST /api/v1/requests/stream
  • Response Content-Type: text/event-stream

Example: Streaming Response

cURL

curl -X POST "http://localhost:8080/api/v1/requests/stream?conversation=123e4567-e89b-12d3-a456-426614174000" \
-H "Content-Type: application/json" \
-H "X-User-TenantId: enterprise-corp-a" \
-H "X-User-Id: user-james-bond" \
--no-buffer \
-d '{
"inputs": [
{
"role": "user",
"content": [{ "type": "text", "value": "Explain quantum physics." }]
}
]
}'

5. Administrative Operations

To access Admin endpoints, the Gateway must inject the admin role in the X-User-Roles header.

Example: Fetching Global Statistics

cURL

curl -X GET "http://localhost:8080/api/v1/admin/stats/global" \
-H "X-User-TenantId: enterprise-corp-a" \
-H "X-User-Id: admin-user" \
-H "X-User-Roles: admin"

Example: Listing LLM Provider Configurations

cURL

curl -X GET "http://localhost:8080/api/v1/admin/llm/provider-conf" \
-H "X-User-TenantId: enterprise-corp-a" \
-H "X-User-Id: admin-user" \
-H "X-User-Roles: admin"

Example: Creating an LLM Provider Configuration

cURL

curl -X POST "http://localhost:8080/api/v1/admin/llm/provider-conf" \
-H "Content-Type: application/json" \
-H "X-User-TenantId: enterprise-corp-a" \
-H "X-User-Id: admin-user" \
-H "X-User-Roles: admin" \
-d '{
"provider": "openai",
"defaultLlmModelConfName": "gpt5",
"globalConf": {
"apiSecret": "sk-your-api-key",
"temperature": 0.7,
"maxRetries": 3,
"timeout": "60s"
},
"llModelConfs": [
{
"llmModelConfName": "gpt5",
"modelName": "gpt-5.1",
"multiModalSupported": true,
"functionCallSupported": true
},
{
"llmModelConfName": "gpt5-mini",
"modelName": "gpt-5-mini",
"temperature": 0.3,
"multiModalSupported": true,
"functionCallSupported": true
}
]
}'

For the complete list of LLM provider management endpoints, see REST API Reference — LLM Providers.