Elastic Stack (ELK Stack) Transform API
The transform API from Elastic Stack (ELK Stack) — 13 operation(s) for transform.
The transform API from Elastic Stack (ELK Stack) — 13 operation(s) for transform.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/elk-stack-transform-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Elasticsearch Request & Response Specification Transform API
license:
name: Apache 2.0
url: https://github.com/elastic/elasticsearch-specification/blob/main/LICENSE
version: ''
tags:
- name: transform
paths:
/_transform/{transform_id}:
get:
tags:
- transform
summary: Get transforms
description: 'Get configuration information for transforms.
## Required authorization
* Cluster privileges: `monitor_transform`
'
operationId: transform-get-transform
parameters:
- $ref: '#/components/parameters/transform.get_transform-transform_id'
- $ref: '#/components/parameters/transform.get_transform-allow_no_match'
- $ref: '#/components/parameters/transform.get_transform-from'
- $ref: '#/components/parameters/transform.get_transform-size'
- $ref: '#/components/parameters/transform.get_transform-exclude_generated'
responses:
'200':
$ref: '#/components/responses/transform.get_transform-200'
x-state: Generally available; Added in 7.5.0
x-metaTags:
- content: Elasticsearch
name: product_name
put:
tags:
- transform
summary: Create a transform
description: 'Creates a transform.
A transform copies data from source indices, transforms it, and persists it into an entity-centric destination index. You can also think of the destination index as a two-dimensional tabular data structure (known as
a data frame). The ID for each document in the data frame is generated from a hash of the entity, so there is a
unique row per entity.
You must choose either the latest or pivot method for your transform; you cannot use both in a single transform. If
you choose to use the pivot method for your transform, the entities are defined by the set of `group_by` fields in
the pivot object. If you choose to use the latest method, the entities are defined by the `unique_key` field values
in the latest object.
You must have `create_index`, `index`, and `read` privileges on the destination index and `read` and
`view_index_metadata` privileges on the source indices. When Elasticsearch security features are enabled, the
transform remembers which roles the user that created it had at the time of creation and uses those same roles. If
those roles do not have the required privileges on the source and destination indices, the transform fails when it
attempts unauthorized operations.
NOTE: You must use Kibana or this API to create a transform. Do not add a transform directly into any
`.transform-internal*` indices using the Elasticsearch index API. If Elasticsearch security features are enabled, do
not give users any privileges on `.transform-internal*` indices. If you used transforms prior to 7.5, also do not
give users any privileges on `.data-frame-internal*` indices.
## Required authorization
* Index privileges: `create_index`,`read`,`index`,`view_index_metadata`
* Cluster privileges: `manage_transform`
'
operationId: transform-put-transform
parameters:
- in: path
name: transform_id
description: 'Identifier for the transform. This identifier can contain lowercase alphanumeric characters (a-z and 0-9),
hyphens, and underscores. It has a 64 character limit and must start and end with alphanumeric characters.'
required: true
deprecated: false
schema:
$ref: '#/components/schemas/_types.Id'
style: simple
- in: query
name: defer_validation
description: 'When the transform is created, a series of validations occur to ensure its success. For example, there is a
check for the existence of the source indices and a check that the destination index is not part of the source
index pattern. You can use this parameter to skip the checks, for example when the source index does not exist
until after the transform is created. The validations are always run when you start the transform, however, with
the exception of privilege checks.'
deprecated: false
schema:
default: false
type: boolean
style: form
- in: query
name: timeout
description: Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error.
deprecated: false
schema:
default: 30s
allOf:
- $ref: '#/components/schemas/_types.Duration'
style: form
requestBody:
content:
application/json:
schema:
type: object
properties:
dest:
description: The destination for the transform.
allOf:
- $ref: '#/components/schemas/transform._types.Destination'
description:
description: Free text description of the transform.
type: string
frequency:
description: 'The interval between checks for changes in the source indices when the transform is running continuously. Also
determines the retry interval in the event of transient failures while the transform is searching or indexing.
The minimum value is `1s` and the maximum is `1h`.'
default: 1m
allOf:
- $ref: '#/components/schemas/_types.Duration'
latest:
description: The latest method transforms the data by finding the latest document for each unique key.
allOf:
- $ref: '#/components/schemas/transform._types.Latest'
_meta:
description: Defines optional transform metadata.
allOf:
- $ref: '#/components/schemas/_types.Metadata'
pivot:
description: 'The pivot method transforms the data by aggregating and grouping it. These objects define the group by fields
and the aggregation to reduce the data.'
allOf:
- $ref: '#/components/schemas/transform._types.Pivot'
retention_policy:
description: 'Defines a retention policy for the transform. Data that meets the defined criteria is deleted from the
destination index.'
allOf:
- $ref: '#/components/schemas/transform._types.RetentionPolicyContainer'
settings:
description: Defines optional transform settings.
allOf:
- $ref: '#/components/schemas/transform._types.Settings'
source:
description: The source of the data for the transform.
allOf:
- $ref: '#/components/schemas/transform._types.Source'
sync:
description: Defines the properties transforms require to run continuously.
allOf:
- $ref: '#/components/schemas/transform._types.SyncContainer'
required:
- dest
- source
examples:
PutTransformRequestExample1:
summary: A pivot transform
description: Run `PUT _transform/ecommerce_transform1` to create a transform that uses the pivot method.
value: "{\n \"source\": {\n \"index\": \"kibana_sample_data_ecommerce\",\n \"query\": {\n \"term\": {\n \"geoip.continent_name\": {\n \"value\": \"Asia\"\n }\n }\n }\n },\n \"pivot\": {\n \"group_by\": {\n \"customer_id\": {\n \"terms\": {\n \"field\": \"customer_id\",\n \"missing_bucket\": true\n }\n }\n },\n \"aggregations\": {\n \"max_price\": {\n \"max\": {\n \"field\": \"taxful_total_price\"\n }\n }\n }\n },\n \"description\": \"Maximum priced ecommerce data by customer_id in Asia\",\n \"dest\": {\n \"index\": \"kibana_sample_data_ecommerce_transform1\",\n \"pipeline\": \"add_timestamp_pipeline\"\n },\n \"frequency\": \"5m\",\n \"sync\": {\n \"time\": {\n \"field\": \"order_date\",\n \"delay\": \"60s\"\n }\n },\n \"retention_policy\": {\n \"time\": {\n \"field\": \"order_date\",\n \"max_age\": \"30d\"\n }\n }\n}"
PutTransformRequestExample2:
summary: A latest transform
description: Run `PUT _transform/ecommerce_transform2` to create a transform that uses the latest method.
value: "{\n \"source\": {\n \"index\": \"kibana_sample_data_ecommerce\"\n },\n \"latest\": {\n \"unique_key\": [\n \"customer_id\"\n ],\n \"sort\": \"order_date\"\n },\n \"description\": \"Latest order for each customer\",\n \"dest\": {\n \"index\": \"kibana_sample_data_ecommerce_transform2\"\n },\n \"frequency\": \"5m\",\n \"sync\": {\n \"time\": {\n \"field\": \"order_date\",\n \"delay\": \"60s\"\n }\n }\n}"
PutTransformRequestExample3:
summary: A transform with destination aliases
description: 'Run `PUT _transform/ecommerce_transform3` to create a transform that adds the destination index to aliases. With `move_on_creation` set to `true`, the destination index becomes the only index in that alias.
'
value: "{\n \"source\": {\n \"index\": \"kibana_sample_data_ecommerce\"\n },\n \"latest\": {\n \"unique_key\": [\n \"customer_id\"\n ],\n \"sort\": \"order_date\"\n },\n \"description\": \"Latest order for each customer\",\n \"dest\": {\n \"index\": \"kibana_sample_data_ecommerce_transform3\",\n \"aliases\": [\n {\n \"alias\": \"kibana_sample_data_ecommerce_transform\"\n },\n {\n \"alias\": \"kibana_sample_data_ecommerce_transform_latest\",\n \"move_on_creation\": true\n }\n ]\n },\n \"frequency\": \"5m\",\n \"sync\": {\n \"time\": {\n \"field\": \"order_date\",\n \"delay\": \"60s\"\n }\n }\n}"
required: true
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/_types.AcknowledgedResponseBase'
examples:
PutTransformResponseExample1:
description: A successful response when creating a transform.
value: "{\n \"acknowledged\": true\n}"
x-state: Generally available; Added in 7.2.0
x-metaTags:
- content: Elasticsearch
name: product_name
delete:
tags:
- transform
summary: Delete a transform
description: '
## Required authorization
* Cluster privileges: `manage_transform`
'
operationId: transform-delete-transform
parameters:
- in: path
name: transform_id
description: Identifier for the transform.
required: true
deprecated: false
schema:
$ref: '#/components/schemas/_types.Id'
style: simple
- in: query
name: force
description: 'If this value is false, the transform must be stopped before it can be deleted. If true, the transform is
deleted regardless of its current state.'
deprecated: false
schema:
default: false
type: boolean
style: form
- in: query
name: delete_dest_index
description: 'If this value is true, the destination index is deleted together with the transform. If false, the destination
index will not be deleted'
deprecated: false
schema:
default: false
type: boolean
style: form
- in: query
name: timeout
description: Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error.
deprecated: false
schema:
default: 30s
allOf:
- $ref: '#/components/schemas/_types.Duration'
style: form
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/_types.AcknowledgedResponseBase'
examples:
DeleteTransformResponseExample1:
description: A successful response when the transform is deleted.
value: "{\n \"acknowledged\": true\n}"
x-state: Generally available; Added in 7.5.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform/_node_stats:
get:
tags:
- transform
summary: Get node stats
description: Get per-node information about transform usage.
operationId: transform-get-node-stats
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/transform.get_node_stats.TransformNodeFullStats'
x-state: Generally available; Added in 8.15.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform:
get:
tags:
- transform
summary: Get transforms
description: 'Get configuration information for transforms.
## Required authorization
* Cluster privileges: `monitor_transform`
'
operationId: transform-get-transform-1
parameters:
- $ref: '#/components/parameters/transform.get_transform-allow_no_match'
- $ref: '#/components/parameters/transform.get_transform-from'
- $ref: '#/components/parameters/transform.get_transform-size'
- $ref: '#/components/parameters/transform.get_transform-exclude_generated'
responses:
'200':
$ref: '#/components/responses/transform.get_transform-200'
x-state: Generally available; Added in 7.5.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform/{transform_id}/_stats:
get:
tags:
- transform
summary: Get transform stats
description: 'Get usage information for transforms.
## Required authorization
* Index privileges: `read`,`view_index_metadata`
* Cluster privileges: `monitor_transform`
'
operationId: transform-get-transform-stats
parameters:
- in: path
name: transform_id
description: 'Identifier for the transform. It can be a transform identifier or a
wildcard expression. You can get information for all transforms by using
`_all`, by specifying `*` as the `<transform_id>`, or by omitting the
`<transform_id>`.'
required: true
deprecated: false
schema:
$ref: '#/components/schemas/_types.Names'
style: simple
- in: query
name: allow_no_match
description: 'Specifies what to do when the request:
1. Contains wildcard expressions and there are no transforms that match.
2. Contains the _all string or no identifiers and there are no matches.
3. Contains wildcard expressions and there are only partial matches.
If this parameter is false, the request returns a 404 status code when
there are no matches or only partial matches.'
deprecated: false
schema:
default: true
type: boolean
style: form
- in: query
name: basic
description: 'If true, the response includes `id`, `state`, `node`, `stats`, `health`,
and basic `checkpointing` information (the last and next checkpoint
numbers, and the next checkpoint''s `position` and `progress`). Skips
statistics that require heavy computations to calculate:
`operations_behind`, `changes_last_detected_at`, `last_search_time`, and
the checkpoint timestamps.'
deprecated: false
schema:
default: false
type: boolean
x-state: Generally available; Added in 8.13.0
style: form
- in: query
name: from
description: Skips the specified number of transforms.
deprecated: false
schema:
default: 0.0
type: number
style: form
- in: query
name: size
description: Specifies the maximum number of transforms to obtain.
deprecated: false
schema:
default: 100.0
type: number
style: form
- in: query
name: timeout
description: Controls the time to wait for the stats
deprecated: false
schema:
default: 30s
allOf:
- $ref: '#/components/schemas/_types.Duration'
style: form
responses:
'200':
description: ''
content:
application/json:
schema:
type: object
properties:
count:
type: number
transforms:
type: array
items:
$ref: '#/components/schemas/transform.get_transform_stats.TransformStats'
required:
- count
- transforms
examples:
GetTransformStatsResponseExample1:
description: A successful response that contains usage information for a transform.
value: "{\n \"count\": 1,\n \"transforms\": [\n {\n \"id\": \"ecommerce-customer-transform\",\n \"state\": \"started\",\n \"node\": {\n \"id\": \"cpTIGMsVQ8Gqwqlxxxxxxx\",\n \"name\": \"my.home\",\n \"ephemeral_id\": \"5-L21nFsQxxxxxxxxxx-xx\",\n \"transport_address\": \"127.0.0.1:9300\",\n \"attributes\": {}\n },\n \"stats\": {\n \"pages_processed\": 78,\n \"documents_processed\": 6027,\n \"documents_indexed\": 68,\n \"documents_deleted\": 22,\n \"delete_time_in_ms\": 214,\n \"trigger_count\": 168,\n \"index_time_in_ms\": 412,\n \"index_total\": 20,\n \"index_failures\": 0,\n \"search_time_in_ms\": 353,\n \"search_total\": 78,\n \"search_failures\": 0,\n \"processing_time_in_ms\": 8,\n \"processing_total\": 78,\n \"exponential_avg_checkpoint_duration_ms\": 97.30637923893185,\n \"exponential_avg_documents_indexed\": 2.2064915040974062,\n \"exponential_avg_documents_processed\": 179.89419945785045\n },\n \"checkpointing\": {\n \"last\": {\n \"checkpoint\": 20,\n \"timestamp_millis\": 1585344558220,\n \"time_upper_bound_millis\": 1585344498220\n },\n \"changes_last_detected_at\": 1585344558219\n },\n \"health\": {\n \"status\": \"green\"\n }\n }\n ]\n}"
x-state: Generally available; Added in 7.5.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform/{transform_id}/_preview:
get:
tags:
- transform
summary: Preview a transform
description: 'Generates a preview of the results that you will get when you create a transform with the same configuration.
It returns a maximum of 100 results. The calculations are based on all the current data in the source index. It also
generates a list of mappings and settings for the destination index. These values are determined based on the field
types of the source index and the transform aggregations.
## Required authorization
* Index privileges: `read`,`view_index_metadata`
* Cluster privileges: `manage_transform`
'
operationId: transform-preview-transform
parameters:
- $ref: '#/components/parameters/transform.preview_transform-transform_id'
- $ref: '#/components/parameters/transform.preview_transform-timeout'
requestBody:
$ref: '#/components/requestBodies/transform.preview_transform'
responses:
'200':
$ref: '#/components/responses/transform.preview_transform-200'
x-state: Generally available; Added in 7.2.0
x-metaTags:
- content: Elasticsearch
name: product_name
post:
tags:
- transform
summary: Preview a transform
description: 'Generates a preview of the results that you will get when you create a transform with the same configuration.
It returns a maximum of 100 results. The calculations are based on all the current data in the source index. It also
generates a list of mappings and settings for the destination index. These values are determined based on the field
types of the source index and the transform aggregations.
## Required authorization
* Index privileges: `read`,`view_index_metadata`
* Cluster privileges: `manage_transform`
'
operationId: transform-preview-transform-1
parameters:
- $ref: '#/components/parameters/transform.preview_transform-transform_id'
- $ref: '#/components/parameters/transform.preview_transform-timeout'
requestBody:
$ref: '#/components/requestBodies/transform.preview_transform'
responses:
'200':
$ref: '#/components/responses/transform.preview_transform-200'
x-state: Generally available; Added in 7.2.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform/_preview:
get:
tags:
- transform
summary: Preview a transform
description: 'Generates a preview of the results that you will get when you create a transform with the same configuration.
It returns a maximum of 100 results. The calculations are based on all the current data in the source index. It also
generates a list of mappings and settings for the destination index. These values are determined based on the field
types of the source index and the transform aggregations.
## Required authorization
* Index privileges: `read`,`view_index_metadata`
* Cluster privileges: `manage_transform`
'
operationId: transform-preview-transform-2
parameters:
- $ref: '#/components/parameters/transform.preview_transform-timeout'
requestBody:
$ref: '#/components/requestBodies/transform.preview_transform'
responses:
'200':
$ref: '#/components/responses/transform.preview_transform-200'
x-state: Generally available; Added in 7.2.0
x-metaTags:
- content: Elasticsearch
name: product_name
post:
tags:
- transform
summary: Preview a transform
description: 'Generates a preview of the results that you will get when you create a transform with the same configuration.
It returns a maximum of 100 results. The calculations are based on all the current data in the source index. It also
generates a list of mappings and settings for the destination index. These values are determined based on the field
types of the source index and the transform aggregations.
## Required authorization
* Index privileges: `read`,`view_index_metadata`
* Cluster privileges: `manage_transform`
'
operationId: transform-preview-transform-3
parameters:
- $ref: '#/components/parameters/transform.preview_transform-timeout'
requestBody:
$ref: '#/components/requestBodies/transform.preview_transform'
responses:
'200':
$ref: '#/components/responses/transform.preview_transform-200'
x-state: Generally available; Added in 7.2.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform/{transform_id}/_reset:
post:
tags:
- transform
summary: Reset a transform
description: 'Before you can reset it, you must stop it; alternatively, use the `force` query parameter.
If the destination index was created by the transform, it is deleted.
## Required authorization
* Cluster privileges: `manage_transform`
'
operationId: transform-reset-transform
parameters:
- in: path
name: transform_id
description: 'Identifier for the transform. This identifier can contain lowercase alphanumeric characters (a-z and 0-9),
hyphens, and underscores. It has a 64 character limit and must start and end with alphanumeric characters.'
required: true
deprecated: false
schema:
$ref: '#/components/schemas/_types.Id'
style: simple
- in: query
name: force
description: 'If this value is `true`, the transform is reset regardless of its current state. If it''s `false`, the transform
must be stopped before it can be reset.'
deprecated: false
schema:
default: false
type: boolean
style: form
- in: query
name: timeout
description: Period to wait for a response. If no response is received before the timeout expires, the request fails and returns an error.
deprecated: false
schema:
default: 30s
allOf:
- $ref: '#/components/schemas/_types.Duration'
style: form
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/_types.AcknowledgedResponseBase'
examples:
ResetTransformResponseExample1:
description: A successful response when the transform is reset.
value: "{\n \"acknowledged\": true\n}"
x-state: Generally available; Added in 8.1.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform/{transform_id}/_schedule_now:
post:
tags:
- transform
summary: Schedule a transform to start now
description: 'Instantly run a transform to process data.
If you run this API, the transform will process the new data instantly,
without waiting for the configured frequency interval. After the API is called,
the transform will be processed again at `now + frequency` unless the API
is called again in the meantime.
## Required authorization
* Cluster privileges: `manage_transform`
'
operationId: transform-schedule-now-transform
parameters:
- in: path
name: transform_id
description: Identifier for the transform.
required: true
deprecated: false
schema:
$ref: '#/components/schemas/_types.Id'
style: simple
- in: query
name: timeout
description: Controls the time to wait for the scheduling to take place
deprecated: false
schema:
default: 30s
allOf:
- $ref: '#/components/schemas/_types.Duration'
style: form
- in: query
name: defer
description: 'When true, defers the scheduling by the transform''s configured sync delay
instead of triggering immediately. The transform will process new data after
the delay elapses rather than right away.'
deprecated: false
schema:
default: false
type: boolean
x-state: Generally available; Added in 9.4.0
style: form
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/_types.AcknowledgedResponseBase'
examples:
ScheduleNowTransformResponseExample1:
description: A successful response when the transform is scheduled to run now.
value: "{\n \"acknowledged\": true\n}"
x-state: Generally available; Added in 8.7.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform/set_upgrade_mode:
post:
tags:
- transform
summary: Set upgrade_mode for transform indices
description: 'Sets a cluster wide upgrade_mode setting that prepares transform
indices for an upgrade.
When upgrading your cluster, in some circumstances you must restart your
nodes and reindex your transform indices. In those circumstances,
there must be no transforms running. You can close the transforms,
do the upgrade, then open all the transforms again. Alternatively,
you can use this API to temporarily halt tasks associated with the transforms
and prevent new transforms from opening. You can also use this API
during upgrades that do not require you to reindex your transform
indices, though stopping transforms is not a requirement in that case.
You can see the current value for the upgrade_mode setting by using the get
transform info API.
## Required authorization
* Cluster privileges: `manage_transform`
'
operationId: transform-set-upgrade-mode
parameters:
- in: query
name: enabled
description: 'When `true`, it enables `upgrade_mode` which temporarily halts all
transform tasks and prohibits new transform tasks from
starting.'
deprecated: false
schema:
default: false
type: boolean
style: form
- in: query
name: timeout
description: The time to wait for the request to be completed.
deprecated: false
schema:
default: 30s
allOf:
- $ref: '#/components/schemas/_types.Duration'
style: form
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/_types.AcknowledgedResponseBase'
x-state: Generally available; Added in 8.18.0
x-metaTags:
- content: Elasticsearch
name: product_name
/_transform/{transform_id}/_start:
post:
tags:
- transform
summary: Start a transform
description: 'When you start a transform, it creates the destination index if it does not already exist. The `number_of_shards` is
set to `1` and the `auto_expand_replicas` is set to `0-1`. If it is a pivot transform, it deduces the mapping
definitions for the destination index from the source indices and the transform aggregations. If fields in the
destination index are derived from scripts (as in the case of `scripted_metric` or `bucket_script` aggregations),
the transform uses dynamic mappings unless an index template exists. If it is a latest transform, it does not deduce
mapping definitions; it uses dynamic mappings. To use explicit mappings, create the destination index before you
start the transform. Alternatively, you can create an index template, though it does not affect the deduced mappings
in a pivot transform.
When the transform starts, a series of validations occur to ensure its success. If you deferred validation when you
created the transform, they occur when you start the transform—with the exception of privilege checks. When
Elasticsearch security features are enabled, the transform remembers which roles the user that created it had at the
time of creation and uses those same roles. If those roles do not have the required privileges on the source and
destination indices, the transform fails when it attempts unauthorized operations.
## Required authorization
* Index privileges: `read`,`view_index_metadata`
* Cluster privileges: `manage_transform`
'
operationId: transform-start-transform
parameters:
- in: path
name: transform_id
description: Identifier for the transform.
required: true
deprecated: false
schema:
$ref: '#/components/schemas/_types.Id'
style: s
# --- truncated at 32 KB (615 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/elk-stack/refs/heads/main/openapi/elk-stack-transform-api-openapi.yml