Saved Objects Examples

Saved Objects are Kibana’s core entities representing dashboards, visualizations, index patterns, and other configuration items. This section demonstrates how to manage them programmatically.

Overview

Learn how to:

  • Create saved objects with and without IDs

  • Retrieve and update saved objects

  • Handle version control

  • Work with space-scoped objects

  • Manage object lifecycle

Example File

saved_objects_management.py

Purpose: Comprehensive saved objects management

What You’ll Learn:

  • CRUD operations for saved objects

  • Optimistic concurrency control with versions

  • Space-scoped object management

  • Error handling patterns

  • Bulk operations

View Management Example →

What Are Saved Objects?

Saved objects store Kibana configuration and user-created content:

  • Dashboards - Dashboard layouts and configurations

  • Visualizations - Charts, graphs, and visual elements

  • Index Patterns - Elasticsearch index configurations

  • Searches - Saved search queries

  • Config - Kibana configuration settings

Basic Operations

Create

# Auto-generated ID
viz = client.saved_objects.create(
    type="visualization",
    attributes={
        "title": "My Visualization",
        "visState": "{}",
        "uiStateJSON": "{}",
        "description": "Created via API",
        "version": 1,
        "kibanaSavedObjectMeta": {"searchSourceJSON": "{}"}
    }
)

# Specific ID
viz = client.saved_objects.create(
    type="visualization",
    id="my-viz-id",
    attributes={...}
)

Read

obj = client.saved_objects.get(
    type="visualization",
    id="my-viz-id"
)
print(obj.body["attributes"]["title"])

Update

updated = client.saved_objects.update(
    type="visualization",
    id="my-viz-id",
    attributes={"title": "Updated Title"}
)

Delete

client.saved_objects.delete(
    type="visualization",
    id="my-viz-id"
)

Version Control

Saved objects support optimistic concurrency:

# Get current version
obj = client.saved_objects.get(type="visualization", id="my-viz")
current_version = obj.body["version"]

# Update with version check
updated = client.saved_objects.update(
    type="visualization",
    id="my-viz",
    attributes={"title": "New Title"},
    version=current_version  # Fails if modified
)

Space-Scoped Objects

Create objects in specific spaces:

# Method 1: space_id parameter
viz = client.saved_objects.create(
    type="visualization",
    attributes={...},
    space_id="marketing-team"
)

# Method 2: Space-scoped client
marketing_client = client.space("marketing-team")
viz = marketing_client.saved_objects.create(
    type="visualization",
    attributes={...}
)

Common Object Types

Visualization

attributes = {
    "title": "Sales Chart",
    "visState": json.dumps({"type": "line", "params": {}}),
    "uiStateJSON": "{}",
    "description": "Monthly sales visualization",
    "version": 1,
    "kibanaSavedObjectMeta": {
        "searchSourceJSON": json.dumps({"query": "", "filter": []})
    }
}

Dashboard

attributes = {
    "title": "Sales Dashboard",
    "description": "Overview of sales metrics",
    "panelsJSON": "[]",
    "optionsJSON": "{}",
    "version": 1,
    "timeRestore": False,
    "kibanaSavedObjectMeta": {"searchSourceJSON": "{}"}
}

Index Pattern

attributes = {
    "title": "logs-*",
    "timeFieldName": "@timestamp",
    "fields": "[]",
    "fieldFormatMap": "{}"
}

Error Handling

from kibana.exceptions import ConflictError, NotFoundError

try:
    obj = client.saved_objects.create(
        type="visualization",
        id="my-viz",
        attributes={...}
    )
except ConflictError:
    print("Object with this ID already exists")

try:
    obj = client.saved_objects.get(type="visualization", id="nonexistent")
except NotFoundError:
    print("Object not found")

try:
    updated = client.saved_objects.update(
        type="visualization",
        id="my-viz",
        attributes={...},
        version=old_version
    )
except ConflictError:
    print("Version conflict - object was modified")

Best Practices

  1. Use auto-generated IDs unless you need specific IDs

  2. Include version for updates to prevent conflicts

  3. Validate attributes before creating objects

  4. Clean up test objects

  5. Use spaces for multi-tenancy

Next Steps