Install
openclaw skills install kibanaKibana API integration with managed authentication. This is a write-capable integration — it can read, create, update, and delete saved objects, dashboards, data views, spaces, alerts, fleet resources, connectors/actions, security roles, and cases in your Kibana instance. All write operations require explicit user approval with specific resource identifiers before execution. Connector execution triggers external side effects (e.g., sending emails, invoking webhooks) — always confirm the connector ID, target, and payload with the user before executing. Use this skill when users want to interact with Kibana for observability, security, and search analytics. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
openclaw skills install kibanaAccess Kibana saved objects, dashboards, data views, spaces, alerts, and fleet via managed API authentication.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/kibana/api/saved_objects/_find?type=dashboard')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('kbn-xsrf', 'true')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/kibana/{native-api-path}
Maton proxies requests to your Kibana instance and automatically injects authentication.
All requests require the Maton API key and the kbn-xsrf header:
Authorization: Bearer $MATON_API_KEY
kbn-xsrf: true
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
The following endpoints are Maton platform operations for managing the connection to Kibana — they are not part of the Kibana API itself. Only the endpoints listed in the API Reference section below are proxied to Kibana.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=kibana&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'kibana'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Open the returned url in a browser to complete authentication. You'll need to provide your Kibana API key. Use a dedicated, least-privilege Kibana API key for this integration — avoid admin-level credentials unless specifically required. Scope the key to only the spaces and saved object types needed for the task, and remove the connection when no longer needed.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Important: All Kibana API requests require the kbn-xsrf: true header.
GET /kibana/api/status
Response:
{
"name": "kibana",
"uuid": "abc123",
"version": {
"number": "8.15.0",
"build_hash": "..."
},
"status": {
"overall": {"level": "available"}
}
}
GET /kibana/api/features
Returns list of all Kibana features and their capabilities.
GET /kibana/api/saved_objects/_find?type={type}
Query Parameters:
type - Object type: dashboard, visualization, index-pattern, search, lens, mapsearch - Search querypage - Page numberper_page - Results per page (default 20, max 10000)fields - Fields to returnResponse:
{
"page": 1,
"per_page": 20,
"total": 5,
"saved_objects": [
{
"id": "abc123",
"type": "dashboard",
"attributes": {
"title": "My Dashboard",
"description": "Dashboard description"
},
"version": "1",
"updated_at": "2024-01-01T00:00:00.000Z"
}
]
}
GET /kibana/api/saved_objects/{type}/{id}
POST /kibana/api/saved_objects/{type}/{id}
Content-Type: application/json
{
"attributes": {
"title": "My Index Pattern",
"timeFieldName": "@timestamp"
}
}
PUT /kibana/api/saved_objects/{type}/{id}
Content-Type: application/json
{
"attributes": {
"title": "Updated Title"
}
}
DELETE /kibana/api/saved_objects/{type}/{id}
POST /kibana/api/saved_objects/_bulk_get
Content-Type: application/json
[
{"type": "dashboard", "id": "abc123"},
{"type": "visualization", "id": "def456"}
]
GET /kibana/api/data_views
Response:
{
"data_view": [
{
"id": "abc123",
"title": "logs-*",
"timeFieldName": "@timestamp"
}
]
}
GET /kibana/api/data_views/data_view/{id}
POST /kibana/api/data_views/data_view
Content-Type: application/json
{
"data_view": {
"title": "logs-*",
"timeFieldName": "@timestamp"
}
}
Response:
{
"data_view": {
"id": "abc123",
"title": "logs-*",
"timeFieldName": "@timestamp"
}
}
POST /kibana/api/data_views/data_view/{id}
Content-Type: application/json
{
"data_view": {
"title": "updated-logs-*"
}
}
DELETE /kibana/api/data_views/data_view/{id}
GET /kibana/api/spaces/space
Response:
[
{
"id": "default",
"name": "Default",
"description": "Default space",
"disabledFeatures": []
}
]
GET /kibana/api/spaces/space/{id}
POST /kibana/api/spaces/space
Content-Type: application/json
{
"id": "marketing",
"name": "Marketing",
"description": "Marketing team space",
"disabledFeatures": []
}
PUT /kibana/api/spaces/space/{id}
Content-Type: application/json
{
"id": "marketing",
"name": "Marketing Team",
"description": "Updated description"
}
DELETE /kibana/api/spaces/space/{id}
GET /kibana/api/alerting/rules/_find
Query Parameters:
search - Search querypage - Page numberper_page - Results per pageResponse:
{
"page": 1,
"per_page": 10,
"total": 5,
"data": [
{
"id": "abc123",
"name": "CPU Alert",
"consumer": "alerts",
"enabled": true,
"rule_type_id": "metrics.alert.threshold"
}
]
}
GET /kibana/api/alerting/rule/{id}
POST /kibana/api/alerting/rule/{id}/_enable
POST /kibana/api/alerting/rule/{id}/_disable
POST /kibana/api/alerting/rule/{id}/_mute_all
POST /kibana/api/alerting/rule/{id}/_unmute_all
GET /kibana/api/alerting/_health
External side effects. Executing a connector triggers actions outside Kibana (sending emails, posting to Slack, invoking webhooks, etc.). Always confirm the connector ID, action type, and full payload with the user before executing. Do not execute connectors proactively.
GET /kibana/api/actions/connectors
Response:
[
{
"id": "abc123",
"name": "Email Connector",
"connector_type_id": ".email",
"is_preconfigured": false,
"is_deprecated": false
}
]
GET /kibana/api/actions/connector/{id}
GET /kibana/api/actions/connector_types
POST /kibana/api/actions/connector/{id}/_execute
Content-Type: application/json
{
"params": {
"to": ["user@example.com"],
"subject": "Alert",
"message": "Alert triggered"
}
}
GET /kibana/api/fleet/agent_policies
Response:
{
"items": [
{
"id": "abc123",
"name": "Default policy",
"namespace": "default",
"status": "active"
}
],
"total": 1,
"page": 1,
"perPage": 20
}
GET /kibana/api/fleet/agents
GET /kibana/api/fleet/epm/packages
Returns all available integrations/packages.
Admin scope. Security role inspection reveals privilege configurations across the Kibana instance. This is read-only but exposes access control details.
GET /kibana/api/security/role
Response:
[
{
"name": "admin",
"metadata": {},
"elasticsearch": {
"cluster": ["all"],
"indices": [...]
},
"kibana": [...]
}
]
GET /kibana/api/security/role/{name}
GET /kibana/api/cases/_find
Query Parameters:
status - open, in-progress, closedseverity - low, medium, high, criticalpage - Page numberperPage - Results per pageResponse:
{
"cases": [],
"page": 1,
"per_page": 20,
"total": 0
}
const response = await fetch('https://api.maton.ai/kibana/api/saved_objects/_find?type=dashboard', {
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
'kbn-xsrf': 'true'
}
});
const dashboards = await response.json();
console.log(dashboards);
import os
import requests
response = requests.get(
'https://api.maton.ai/kibana/api/saved_objects/_find?type=dashboard',
headers={
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
'kbn-xsrf': 'true'
}
)
print(response.json())
kbn-xsrf: true headerdashboard, visualization, index-pattern, search, lens, map| Status | Meaning |
|---|---|
| 200 | Success |
| 204 | No content (successful delete) |
| 400 | Invalid request |
| 401 | Invalid or missing authentication |
| 403 | Permission denied |
| 404 | Resource not found |
| 409 | Conflict (e.g., object already exists) |