Skip to main content

Endpoint

GET /v1/services
Returns a list of all 94 available services that can be included in generated stacks. Services are organized by category (AI platforms, databases, monitoring, etc.) and include metadata like maturity level, resource requirements, and dependencies.

Authentication

X-API-Key
string
Optional API key for authenticated requests with higher rate limits

Query Parameters

category
string
Filter services by category. Valid categories:
  • ai-agents - AI coding agents (Claude Code, Codex, etc.)
  • ai-platforms - AI chat UIs and platforms
  • ai-models - Local LLM and AI models
  • automation - Workflow automation tools
  • database - Databases and caching
  • vector-db - Vector databases
  • media - Media processing and storage
  • social - Social media tools
  • analytics - Analytics platforms
  • knowledge - Knowledge management and documents
  • storage - Object storage
  • devtools - Developer tools
  • proxy - Reverse proxies
  • monitoring - Monitoring and observability
  • browser - Browser automation
  • search - Search engines
  • communication - Chat and communication
  • streaming - Streaming services
  • security - Security tools
  • desktop - Desktop environments
maturity
string
Filter by maturity level:
  • stable - Production-ready services
  • beta - Feature-complete but not battle-tested
  • experimental - Early stage or limited testing

Response

services
array
required
Array of service definitions
categories
array
required
List of all available categories with counts
total
number
required
Total number of services returned

Examples

List All Services

curl http://localhost:3456/v1/services
Response (200):
{
  "services": [
    {
      "id": "postgresql",
      "name": "PostgreSQL",
      "description": "Open-source relational database",
      "category": "database",
      "maturity": "stable",
      "image": "postgres:16-alpine",
      "ports": [{ "container": 5432, "host": 5432 }],
      "dependencies": [],
      "conflicts": [],
      "estimatedMemoryMB": 256,
      "env": {
        "POSTGRES_USER": "openclaw",
        "POSTGRES_DB": "openclaw"
      },
      "volumes": [
        { "source": "postgres_data", "target": "/var/lib/postgresql/data" }
      ],
      "healthCheck": {
        "test": ["CMD-SHELL", "pg_isready -U openclaw"],
        "interval": "10s",
        "timeout": "5s",
        "retries": 5
      }
    },
    {
      "id": "redis",
      "name": "Redis",
      "description": "In-memory data structure store",
      "category": "database",
      "maturity": "stable",
      "image": "redis:7-alpine",
      "ports": [{ "container": 6379, "host": 6379 }],
      "dependencies": [],
      "conflicts": ["valkey"],
      "estimatedMemoryMB": 128,
      "volumes": [
        { "source": "redis_data", "target": "/data" }
      ]
    }
  ],
  "categories": [
    { "id": "database", "name": "Database & Caching", "count": 6 },
    { "id": "ai-platforms", "name": "AI Platforms & Chat UIs", "count": 6 }
  ],
  "total": 94
}

Filter by Category

Get all database services:
curl "http://localhost:3456/v1/services?category=database"
Response (200):
{
  "services": [
    {
      "id": "postgresql",
      "name": "PostgreSQL",
      "category": "database",
      "maturity": "stable"
    },
    {
      "id": "redis",
      "name": "Redis",
      "category": "database",
      "maturity": "stable"
    },
    {
      "id": "neo4j",
      "name": "Neo4j",
      "category": "database",
      "maturity": "stable"
    }
  ],
  "categories": [
    { "id": "database", "name": "Database & Caching", "count": 3 }
  ],
  "total": 3
}

Filter by Maturity Level

Get only stable services:
curl "http://localhost:3456/v1/services?maturity=stable"
Response (200):
{
  "services": [
    /* Array of stable services */
  ],
  "categories": [ /* ... */ ],
  "total": 78
}

Combine Filters

Get stable database services:
curl "http://localhost:3456/v1/services?category=database&maturity=stable"

With Authentication

curl http://localhost:3456/v1/services \
  -H "X-API-Key: sk_live_abc123"

Get Service by ID

GET /v1/services/{id}
Retrieve a single service by its unique identifier.

Path Parameters

id
string
required
Service identifier (e.g., postgresql, redis, n8n)

Example Request

curl http://localhost:3456/v1/services/postgresql
Response (200):
{
  "service": {
    "id": "postgresql",
    "name": "PostgreSQL",
    "description": "Open-source relational database",
    "category": "database",
    "maturity": "stable",
    "image": "postgres:16-alpine",
    "ports": [{ "container": 5432, "host": 5432 }],
    "dependencies": [],
    "conflicts": [],
    "estimatedMemoryMB": 256,
    "env": {
      "POSTGRES_USER": "openclaw",
      "POSTGRES_DB": "openclaw"
    },
    "volumes": [
      { "source": "postgres_data", "target": "/var/lib/postgresql/data" }
    ],
    "healthCheck": {
      "test": ["CMD-SHELL", "pg_isready -U openclaw"],
      "interval": "10s",
      "timeout": "5s",
      "retries": 5
    }
  }
}

Service Not Found

curl http://localhost:3456/v1/services/nonexistent
Response (404):
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Service \"nonexistent\" not found"
  }
}

Error Responses

error
object

Internal Error (500)

{
  "error": {
    "code": "INTERNAL_ERROR",
    "message": "Failed to fetch services"
  }
}

Unauthorized (401)

{
  "error": {
    "code": "UNAUTHORIZED",
    "message": "Invalid API key."
  }
}

Use Cases

Service Discovery UI

Build a service picker interface:
const response = await fetch('http://localhost:3456/v1/services');
const { services, categories } = await response.json();

// Group services by category for UI
const groupedServices = categories.map(cat => ({
  category: cat.name,
  services: services.filter(s => s.category === cat.id)
}));

Dependency Resolution

Check service dependencies before generation:
const response = await fetch('http://localhost:3456/v1/services/n8n');
const { service } = await response.json();

console.log('n8n requires:', service.dependencies); // ["postgresql"]

Filter Services by Memory

Find lightweight services:
const { services } = await fetch('http://localhost:3456/v1/services')
  .then(r => r.json());

const lightweight = services.filter(s => s.estimatedMemoryMB < 200);

Next Steps

Presets Endpoint

Browse pre-configured stack templates

Generate Endpoint

Generate stacks with selected services

Build docs developers (and LLMs) love