Creating a Kibana space separates dashboards, visualizations, alerts, and other saved objects so multiple teams or environments can share one Kibana instance without mixing content or risking accidental edits in the wrong place.

A space is a logical container that scopes Kibana saved objects and some UI settings into an isolated context. The default space loads without a space prefix, while other spaces are accessed under a /s/<space-id>/ URL prefix, and navigation switches context based on the selected space.

Space ids become part of URLs and should be treated as stable identifiers, since changing an id typically requires creating a new space and moving content. Creating and managing spaces also depends on Kibana permissions, and spaces do not replace Elasticsearch index access controls or role-based privileges that govern what data can be viewed and modified.

Steps to create a Kibana space:

  1. List existing spaces to check the currently used ids.
    $ curl --silent --show-error --cacert /etc/kibana/certs/kibana-ca.crt --user elastic:password "https://localhost:5601/kibana/api/spaces/space" | jq
    [
      {
        "id": "default",
        "name": "Default",
        "description": "This is your default space!",
        "color": "#00bfb3",
        "disabledFeatures": [],
        "_reserved": true
      }
    ]
  2. Create the space with the API.
    $ curl --silent --show-error --cacert /etc/kibana/certs/kibana-ca.crt --user elastic:password -H "kbn-xsrf: true" -H "Content-Type: application/json" -X POST "https://localhost:5601/kibana/api/spaces/space" -d '{
      "id": "ops",
      "name": "Operations",
      "description": "Operations dashboards and alerts",
      "initials": "OP",
      "color": "#1BA9F5",
      "disabledFeatures": []
    }' | jq '{id: .id, name: .name, description: .description, disabledFeatures: .disabledFeatures, initials: .initials, color: .color}'
    {
      "id": "ops",
      "name": "Operations",
      "description": "Operations dashboards and alerts",
      "disabledFeatures": [],
      "initials": "OP",
      "color": "#1BA9F5"
    }

    The kbn-xsrf header is required for non-GET requests to Kibana APIs, and Kibana deployments with a configured base path must include that base path before /api/.

    Using -u can expose credentials in shell history and process listings, so prefer an API key or a dedicated least-privilege Kibana user for automation.

  3. List spaces to confirm the new entry.
    $ curl --silent --show-error --cacert /etc/kibana/certs/kibana-ca.crt --user elastic:password "https://localhost:5601/kibana/api/spaces/space" | jq '[.[] | {id: .id, name: .name, description: .description, disabledFeatures: .disabledFeatures, _reserved: ._reserved}]'
    [
      {
        "id": "default",
        "name": "Default",
        "description": "This is your default space!",
        "disabledFeatures": [],
        "_reserved": true
      },
      {
        "id": "ops",
        "name": "Operations",
        "description": "Operations dashboards and alerts",
        "disabledFeatures": [],
        "_reserved": null
      }
    ]

    Non-default spaces load under the /s/<space-id>/ URL prefix, such as /s/ops/ for the example space.