API Endpoints
Full reference for all REST API endpoints. All paths are relative to the base URL /api/v1. See the API Overview for authentication and rate limiting details.
GET /v1/health — Health Check
Returns the API status. Use for monitoring and uptime checks.
Request
curl https://better-openclaw.dev/api/v1/healthResponse 200 OK
{
"ok": true,
"data": {
"status": "healthy",
"version": "1.4.2",
"uptime": 86400,
"services": 58,
"skillPacks": 10,
"presets": 5
}
}GET /v1/services — List Services
Returns all available companion services grouped by category.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
category | string | Filter by category ID |
tag | string | Filter by tag |
maturity | string | Filter by maturity: stable, beta, experimental |
Request
curl https://better-openclaw.dev/api/v1/services?category=databaseResponse 200 OK
{
"ok": true,
"data": {
"total": 8,
"services": [
{
"id": "qdrant",
"name": "Qdrant",
"description": "Vector database for embeddings and similarity search",
"category": "database",
"image": "qdrant/qdrant",
"imageTag": "latest",
"maturity": "stable",
"ports": [{ "host": 6333, "container": 6333 }],
"requires": [],
"conflictsWith": [],
"minMemoryMB": 256,
"tags": ["vector", "embeddings", "rag"]
}
// ... more services
]
}
}GET /v1/skills — List Skill Packs
Returns all available skill packs with their descriptions and required services.
Request
curl https://better-openclaw.dev/api/v1/skillsResponse 200 OK
{
"ok": true,
"data": {
"total": 10,
"skillPacks": [
{
"id": "researcher",
"name": "Researcher",
"description": "Web search, content extraction, and citation skills",
"requiredServices": ["searxng", "browserless"],
"optionalServices": ["qdrant"],
"skills": [
"web-search",
"content-extract",
"citation-builder",
"fact-check"
]
}
// ... more skill packs
]
}
}GET /v1/presets — List Presets
Returns all preset configurations.
Request
curl https://better-openclaw.dev/api/v1/presetsResponse 200 OK
{
"ok": true,
"data": {
"presets": [
{
"id": "minimal",
"name": "Minimal",
"description": "OpenClaw + Redis for lightweight experimentation",
"services": ["redis"],
"skills": ["memory"]
},
{
"id": "researcher",
"name": "Researcher",
"description": "Web research and RAG pipeline",
"services": ["qdrant", "searxng", "browserless", "redis"],
"skills": ["researcher", "memory"]
}
// ... more presets
]
}
}GET /v1/presets/:name — Get Preset Detail
Returns detailed information about a specific preset, including the full service and skill pack configuration.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
name | string | Preset ID (e.g. researcher, devops) |
Request
curl https://better-openclaw.dev/api/v1/presets/researcherResponse 200 OK
{
"ok": true,
"data": {
"id": "researcher",
"name": "Researcher",
"description": "Web research and RAG pipeline",
"services": [
{ "id": "qdrant", "name": "Qdrant", "category": "database" },
{ "id": "searxng", "name": "SearXNG", "category": "search" },
{ "id": "browserless", "name": "Browserless", "category": "automation" },
{ "id": "redis", "name": "Redis", "category": "cache" }
],
"skills": [
{ "id": "researcher", "name": "Researcher", "skillCount": 4 },
{ "id": "memory", "name": "Memory", "skillCount": 3 }
],
"estimatedMemoryMB": 2048
}
}Response 404 Not Found
{
"ok": false,
"error": {
"code": "NOT_FOUND",
"message": "Preset 'invalid-preset' does not exist"
}
}POST /v1/validate — Validate Configuration
Validates a stack configuration without generating any files. Useful for checking for conflicts, missing dependencies, and invalid options before generating.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
services | string[] | No | Service IDs to include |
skills | string[] | No | Skill pack IDs |
preset | string | No | Preset name (alternative to services + skills) |
proxy | string | No | Proxy type: caddy, traefik, nginx |
Request
curl -X POST https://better-openclaw.dev/api/v1/validate \
-H "Authorization: Bearer $OPENCLAW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"services": ["qdrant", "redis", "milvus"],
"skills": ["researcher"]
}'Response 200 OK (valid)
{
"ok": true,
"data": {
"valid": true,
"warnings": [
{
"code": "CONFLICT",
"message": "qdrant and milvus are both vector databases; consider using only one"
}
],
"resolvedServices": ["openclaw", "qdrant", "redis", "milvus", "searxng", "browserless"],
"resolvedSkills": ["researcher"],
"estimatedMemoryMB": 3072
}
}Response 400 Bad Request (invalid)
{
"ok": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid configuration",
"details": {
"errors": [
"Service 'invalid-service' does not exist",
"Skill pack 'researcher' requires 'searxng' which is not selected"
]
}
}
}POST /v1/generate — Generate Stack
Generates a complete stack configuration and returns the files as a JSON bundle or downloadable archive.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Project name |
preset | string | No | Preset name |
services | string[] | No | Service IDs (ignored if preset is set) |
skills | string[] | No | Skill pack IDs (ignored if preset is set) |
proxy | string | No | Proxy type |
domain | string | No | Domain for proxy configuration |
gpu | boolean | No | Enable GPU passthrough |
platform | string | No | Target platform (e.g. linux/arm64) |
deploymentType | string | No | docker (default) or bare-metal. Bare-metal produces a native + Docker hybrid: install scripts in native/ and install.sh/install.ps1; see Deployment → Bare-metal. |
format | string | No | Response format: json (default) or tar |
Request
curl -X POST https://better-openclaw.dev/api/v1/generate \
-H "Authorization: Bearer $OPENCLAW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "my-stack",
"preset": "researcher",
"proxy": "caddy",
"domain": "ai.example.com"
}'Response 200 OK (format: json)
{
"ok": true,
"data": {
"name": "my-stack",
"files": {
"docker-compose.yml": "version: '3.8'\nservices:\n ...",
".env.example": "# OpenClaw Configuration\nOPENAI_API_KEY=\n...",
"Caddyfile": "ai.example.com {\n reverse_proxy openclaw:8080\n}",
"configs/openclaw/config.yaml": "gateway:\n port: 8080\n...",
"scripts/start.sh": "#!/bin/bash\n...",
"scripts/stop.sh": "#!/bin/bash\n...",
"scripts/update.sh": "#!/bin/bash\n...",
"scripts/backup.sh": "#!/bin/bash\n...",
"scripts/status.sh": "#!/bin/bash\n...",
"README.md": "# my-stack\n..."
},
"summary": {
"services": 5,
"skills": 2,
"proxy": "caddy",
"estimatedMemoryMB": 2048
}
}
}Download as Tar Archive
Set format: "tar" to get a downloadable .tar.gz archive instead of JSON:
curl -X POST https://better-openclaw.dev/api/v1/generate \
-H "Authorization: Bearer $OPENCLAW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "my-stack", "preset": "researcher", "format": "tar"}' \
-o my-stack.tar.gzNext Steps
- API Overview — authentication and general concepts
- Service Catalog — browse all services
- CLI Reference — generate stacks from the command line