Skip to content

inputs ​

An input is where the messages of a pipeline come from. A pipeline can have several inputs. kayak merges them into one stream. Each input has its own task, so a busy input cannot starve a slow input or an input on a timer. When one input fails, kayak reports the failure and the other inputs continue. The pipeline stops only when its last input stops.

Every input kind accepts three more fields. They are on the wrapper of the input, so the tables below do not show them:

  • buffer collects messages before the transforms see them: by count, by time, or by the first of the two. It never sends an empty batch. Its window opens at the first message, not at a clock boundary. Thus it limits the latency, and it does not give a fixed cadence. See buffering an input.
  • envelope adds what the input knows about a message to the message, as ordinary JSON fields. Without it, kayak passes messages on as they arrive. See message metadata.
  • ack sets when the input acknowledges a message to its broker. Only inputs with a broker that can tell the difference accept it. The other inputs refuse to build with it. See acknowledging an input.

max_batch, on the inputs that have it, is different from buffer. It never waits. It takes one message and then adds the messages that already arrived. Thus a quiet topic gives batches of one, whatever the limit is. Only a backlog fills a batch. Increase max_batch to let a consumer catch up on a backlog.

dummy ​

Sends one generated message at a fixed interval. Use it to test a pipeline without a real source.

Each message contains a value and the current_time at which the input sent it. The payload field sets the type of value. It can be a number from a sine wave or a random sentence.

fieldtypedescription
durationintegerrequiredThe time between two messages, in s.
amplitudenumberoptionalThe peak of the sine wave. The value goes from -amplitude to +amplitude. Applies only to the number payload. The default is 1.
payloadnumber | textoptionalThe type of value in each message. number is a number from a sine wave. text is a random sentence. The default is number.
periodnumberoptionalThe time for one full cycle of the sine wave, in s. Applies only to the number payload. The default is 60. The input samples the wave by the clock, so the period does not change with duration.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.

http ​

Accepts messages that are posted to the endpoint of the pipeline, POST /api/pipelines/{id}/messages.

kayak makes the endpoint from the pipeline id. The endpoint is available when the pipeline runs. The body is one JSON message or an array of messages. An array becomes one batch. A pipeline can have only one http input. A second http input fails to build.

fieldtypedescription
authbearer | headeroptionalThe credential that a post must have. If you do not set it, the endpoint accepts all posts. A post without the correct credential gets 401.
capacityintegeroptionalThe maximum number of posted batches in the queue before the pipeline. The default is 1024. When the queue is full, the endpoint refuses a post with 503.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

auth — type: "bearer"

fieldtypedescription
tokenstringrequiredThe token. Use a ${NAME} reference, so that the config file keeps only the name and the secret store keeps the value.

auth — type: "header"

fieldtypedescription
namestringrequiredThe name of the header. The http input compares the name without case. On an http input, the name must not be a header that an envelope copies into the messages.
valuestringrequiredThe exact value of the header. Use a ${NAME} reference.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
methodThe HTTP method of the request.
remote_addrThe address that sent the request, when the server knows it.
headersThe request headers from a fixed list: content-type, user-agent, x-request-id, x-correlation-id and traceparent. The input drops all other headers. Thus, a credential header such as authorization or x-api-key never goes into the message.

kafka ​

Consumes JSON messages from a kafka topic.

The input skips a payload that is not JSON and writes a warning to the log. The consumer connects on the first read and joins a consumer group. Kafka keeps the read position of the group between restarts.

fieldtypedescription
connectionkafka connectionrequiredThe name of the kafka connection to consume from. Declare the connection in the connections file.
topicstringrequiredThe topic to consume from.
groupstringrequiredThe consumer group id. Kafka keeps one read position for each group. Two pipelines in the same group divide the topic between them. Two pipelines in different groups each get all messages.
max_batchintegeroptionalThe maximum number of messages in one batch. The default is 1. The input puts only records that are already received into a batch. It does not wait for more records, so a high value does not add latency on a quiet topic. Increase it when the consumer reads a backlog. Each batch has a fixed cost in the pipeline and in each downstream pipeline.
start_atearliest | latestoptionalThe start position when the group has no committed position. earliest reads the topic from the start. latest reads only new messages. The default is latest.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
connectionThe name of the connection that the input consumed from.
topicThe topic of the record.
partitionThe partition of the record in the topic.
offsetThe offset of the record in the partition. With topic and partition, it identifies the record.
keyThe key of the record as a string, or null when the record has no key.
timestampThe timestamp of the record, as RFC 3339, when kafka gives one.

nats ​

Subscribes to a nats subject and parses each message as JSON.

The input skips a payload that is not JSON and writes a warning to the log. The input opens the connection on the first read.

fieldtypedescription
connectionnats connectionrequiredThe name of the nats connection to subscribe on. Declare the connection in the connections file.
subjectstringrequiredThe subject to subscribe to.
max_batchintegeroptionalThe maximum number of messages in one batch. The default is 1. The input puts only messages that are already received into a batch. It does not wait for more messages, so a high value does not add latency on a quiet subject.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
connectionThe name of the connection that received the message.
subjectThe subject that the message was published to. This is the full subject, not the subscription pattern. For example, when you subscribe to *.temperature, this field holds the name of the machine.
replyThe reply subject, when the publisher set one. Otherwise null.
headersThe nats headers, as an object of arrays.

pipeline ​

Reads the output of another pipeline. Use it to connect pipelines into a graph.

Many pipelines can read from the same upstream. Each of them gets all batches. The upstream must exist when kayak creates this pipeline, so declare the upstream first in the config file.

fieldtypedescription
upstreampipeline idrequiredThe id of the pipeline to read from.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
upstreamThe id of the pipeline that sent the batch. Metadata from an upstream input stays in the message. This input does not replace it.

mqtt ​

Subscribes to an mqtt topic and parses each message as JSON.

The topic can be a filter with the mqtt wildcards + and #. The input skips a payload that is not JSON and writes a warning to the log.

The input opens the connection on the first read. kayak makes the client id from the pipeline id and the topic. You cannot set the client id.

fieldtypedescription
connectionmqtt connectionrequiredThe name of the mqtt connection to subscribe on. Declare the connection in the connections file.
topicstringrequiredThe topic or topic filter to subscribe to.
max_batchintegeroptionalThe maximum number of messages in one batch. The default is 1. The input puts only messages that are already received into a batch. It does not wait for more messages, so a high value does not add latency on a quiet topic.
qosat_most_once | at_least_once | exactly_onceoptionalThe quality of service for the subscription. The default is at_most_once. ack: on_delivery requires at_least_once or exactly_once.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
connectionThe name of the connection that received the message.
topicThe full topic of the message. Use it when the input subscribes to a filter with + or # wildcards.
qosThe quality of service of the delivery.
retainTrue when the broker sent the retained message of the topic. False for a live publish.

redis ​

Subscribes to a redis channel and parses each message as JSON.

The input skips a payload that is not JSON and writes a warning to the log. The input opens the connection on the first read.

The input uses SUBSCRIBE, so the channel name must be exact. Patterns are not supported. Redis pub/sub does not send a message again. When the input is not connected, it does not receive the messages that are published.

fieldtypedescription
connectionredis connectionrequiredThe name of the redis connection to subscribe on. Declare the connection in the connections file.
channelstringrequiredThe channel to subscribe to.
max_batchintegeroptionalThe maximum number of messages in one batch. The default is 1. The input puts only messages that are already received into a batch. It does not wait for more messages, so a high value does not add latency on a quiet channel.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
connectionThe name of the connection that received the message.
channelThe channel that the message was published to.

opcua ​

Subscribes to variables on an OPC UA server and sends one message for each change of a value.

The input makes a subscription with one monitored item for each node. The server sends a value when it changes. The input does not poll. A tag that does not change sends no messages. publish_interval_ms sets how frequently the server can send. It does not set how frequently the server samples.

Each message is one reading. It contains the tag and the value:

json { "node": "ns=2;s=Machine1.Temperature", "name": "temperature", "value": 21.5, "status": "Good", "source_timestamp": "2026-01-01T12:00:00.123Z", "server_timestamp": "2026-01-01T12:00:00.130Z" }

status is the quality of the reading and is always present. A failed sensor sends a Bad... status with a null value. Use a filter to remove these readings. source_timestamp is the time at which the device produced the value. Use it to reduce or partition. The received_at field of the envelope is the time at which kayak read the value.

Set nodes, browse or both. One of them is required. The input subscribes to a node only one time, also when two settings name it.

fieldtypedescription
connectionopcua connectionrequiredThe name of the opcua connection to subscribe on. Declare the connection in the connections file.
browseobjectoptionalA node to browse. The input subscribes to each variable under it.
deadbandnumberoptionalThe smallest change of a value that the server reports, in the units of the value. If you do not set it, the server reports each change. The server applies the deadband, so it decreases network traffic. It applies only to numeric nodes. The server reports each change of a string or a boolean.
max_batchintegeroptionalThe maximum number of messages in one batch. The default is 1. One publish from the server contains each node that changed in the interval. With 200 tags at 1 Hz and the default, the pipeline handles 200 batches each second. A higher value decreases this cost. The input puts only changes that are already received into a batch.
nodeslist of opcua nodeoptionalThe nodes to subscribe to, one entry for each node.
publish_interval_msintegeroptionalThe interval at which the server can send a group of changes, in ms. The default is 1000. This value sets the longest time that a change waits.
queue_sizeintegeroptionalThe number of samples that the server keeps for one node between two publishes. The default is 1. With 1, the server sends only the latest value of a node that changes two times in one interval. Increase it, together with sampling_interval_ms, when you need each sample.
sampling_interval_msintegeroptionalThe interval at which the server samples each node, in ms. If you do not set it, the server samples at the publish interval. Set a smaller value to get more readings between two publishes.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

browse

fieldtypedescription
rootstringrequiredThe id of the node to browse under, in the same notation as node_id. This is usually a folder, for example ns=2;s=Machine1. The input subscribes to each variable under it. It follows folders and objects but does not subscribe to them.
depthintegeroptionalThe number of levels below the root to follow. The default is 3. The value 0 is not permitted. There is no value for "all levels", because the address space of a plant server can have thousands of nodes.

nodes — each entry

fieldtypedescription
node_idstringrequiredThe id of the node, in OPC UA notation. Use ns=2;s=Machine1.Temperature for a string identifier and ns=2;i=1042 for a numeric identifier. Use g= for a GUID and b= for an opaque identifier. A node id with no ns= is in namespace 0, the namespace of the server.
namestringoptionalThe name of the node in the messages. The default is the node id. Set a readable name to use in a group_by or a column mapping.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
connectionThe name of the connection of the session. The node of the reading is not metadata. It is always in the message, as node and name.

indu ​

Reads live sensors and streams from Indu Cloud through /api/v1/live/sse, with the API key of the connection.

Name sensors and streams with the ids that the platform uses. Do not use UUIDs. The input finds the names through /api/v1 on the first read. If the key cannot find or see a name, the input reports an error. It then tries again after a pause.

Each reading is one message, for example {"kind": "sensor", "name": "press-3/temperature", "value": 71.2, "at": …}. The message also contains the ids of the platform. When the connection drops, the input connects again with backoff. If the input cannot read all readings, it reports an error.

fieldtypedescription
connectionindu connectionrequiredThe name of the indu connection to read through. Declare the connection in the connections file.
backfillbooleanoptionalSend the latest value of each series before the live readings. The default is true. Thus a restarted pipeline has a value for each series immediately.
max_batchintegeroptionalThe maximum number of readings in one batch. The default is 1. The input puts only readings that are already received into a batch. It does not wait for more readings.
sensorslist of stringoptionalThe sensors to read, as <device>/<sensor>, for example press-3/temperature. Use the ids that the platform uses. kayak divides the name at the first /.
streamslist of stringoptionalThe streams to read, by the name they were written under, for example press-3/oee. For a stream that the platform calculates, use its display name.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
connectionThe name of the connection that the input read from.
eventThe platform event of the message: reading for a sensor, stream_reading for a stream.

postgres ​

Reads a postgres table, view or query at an interval and sends each row as a message.

The input runs a query each interval_secs. In snapshot mode, it reads the full relation. In incremental mode, it reads only the rows after the last read, by a column that increases. Each row becomes one JSON object with the column names as fields. Postgres makes the object with row_to_json. A timestamp is ISO 8601, a numeric keeps its digits, and a jsonb column is a nested value:

json {"id": 42, "sensor": "press-3", "value": 21.5, "recorded_at": "2026-01-01T12:00:00.123456+00:00"}

An incremental read is at-least-once across a restart. The input keeps the watermark in memory, and after a restart it starts again from start_from. An incremental read does not see a deleted row. Put an index on the column that it follows, or each read scans the full table.

fieldtypedescription
connectionpostgres connectionrequiredThe name of the postgres connection to read through. Declare the connection in the connections file.
interval_secsintegerrequiredThe time between two reads, in seconds. The time starts at the end of a read. Thus, two reads never overlap. The first read occurs when the pipeline starts.
modesnapshot | incrementalrequiredWhether each read returns all rows (snapshot) or only the rows after the last read (incremental).
columnslist of stringoptionalThe columns to read, in order. Leave it empty to read all columns. For an incremental input, the list must include field.
max_batchintegeroptionalThe maximum number of rows in one batch. The default is 1. The input puts rows that it already read into a batch. It does not wait for more rows to fill a batch.
page_sizeintegeroptionalThe maximum number of rows that one query returns. The default is 1000. When a page is full, the input reads the next page immediately. The interval starts after a page that is not full. A snapshot ignores this field and reads all rows in one query.
querystringoptionalA SELECT to read in place of a table. The input puts the query in a subquery. It adds the cursor condition, the ORDER BY and the page limit outside the subquery. Thus, the query needs no placeholder and no ORDER BY. Write one statement with no semicolon at the end. You can use all SQL that the server accepts in a subquery, for example WITH.
tablestringoptionalThe table or view to read, as name or schema.name. Give exactly one of table and query.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

mode — type: "snapshot"

This component takes no configuration.

mode — type: "incremental"

fieldtypedescription
fieldstringrequiredThe column that the input follows. The watermark is the highest value that the input sent. Each read asks for the rows above the watermark. The input does not read rows where the column is null.
lag_secsintegeroptionalFor a timestamp column: the time to stay behind the current time, in seconds. A later read gets the rows that are less than this time before now(). This gives late transactions time to commit. Do not use it with a numeric column. The server refuses the query.
start_fromoldest | newestoptionalWhere the first read starts. With newest, the input reads only the rows added after the pipeline started. With oldest, it reads all rows first and then follows the table. The default is newest.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
connectionThe name of the connection that the input read from.
polled_atThe start time of the read that returned the row, as RFC 3339. All rows of one read have the same value. Use it to tell one snapshot from the next. The time comes from the clock of kayak, not from the database server.

clickhouse ​

Reads a ClickHouse table, view or query at an interval and sends each row as a message. It uses the HTTP interface of ClickHouse.

ClickHouse sends the rows as JSONEachRow. A DateTime is ISO 8601, an Int64 is a number, and a Decimal keeps its digits. The modes, the watermark and the limits of an incremental read are the same as on the postgres input.

fieldtypedescription
connectionclickhouse connectionrequiredThe name of the clickhouse connection to read through. Declare the connection in the connections file.
interval_secsintegerrequiredThe time between two reads, in seconds. The time starts at the end of a read. Thus, two reads never overlap. The first read occurs when the pipeline starts.
modesnapshot | incrementalrequiredWhether each read returns all rows (snapshot) or only the rows after the last read (incremental).
columnslist of stringoptionalThe columns to read, in order. Leave it empty to read all columns. For an incremental input, the list must include field.
max_batchintegeroptionalThe maximum number of rows in one batch. The default is 1. The input puts rows that it already read into a batch. It does not wait for more rows to fill a batch.
page_sizeintegeroptionalThe maximum number of rows that one query returns. The default is 1000. When a page is full, the input reads the next page immediately. The interval starts after a page that is not full. A snapshot ignores this field and reads all rows in one query.
querystringoptionalA SELECT to read in place of a table. The input puts the query in a subquery. It adds the cursor condition, the ORDER BY and the page limit outside the subquery. Thus, the query needs no placeholder and no ORDER BY. Write one statement with no semicolon at the end. You can use all SQL that the server accepts in a subquery, for example WITH.
tablestringoptionalThe table or view to read, as name or schema.name. Give exactly one of table and query.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

mode — type: "snapshot"

This component takes no configuration.

mode — type: "incremental"

fieldtypedescription
fieldstringrequiredThe column that the input follows. The watermark is the highest value that the input sent. Each read asks for the rows above the watermark. The input does not read rows where the column is null.
lag_secsintegeroptionalFor a timestamp column: the time to stay behind the current time, in seconds. A later read gets the rows that are less than this time before now(). This gives late transactions time to commit. Do not use it with a numeric column. The server refuses the query.
start_fromoldest | newestoptionalWhere the first read starts. With newest, the input reads only the rows added after the pipeline started. With oldest, it reads all rows first and then follows the table. The default is newest.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
connectionThe name of the connection that the input read from.
polled_atThe start time of the read that returned the row, as RFC 3339. All rows of one read have the same value. Use it to tell one snapshot from the next. The time comes from the clock of kayak, not from the database server.

http_poll ​

Gets a url at an interval and sends the full reply each time.

Each read is a GET. A reply that is an array gives one message for each element. Any other reply gives one message. Use items for a reply that has the records inside it, for example {"data": {"machines": [...]}}.

Use this input for reference data, for example a list of machines or recipes that changes rarely. The input has no watermark and no pages. Each read sends all records again. Send them to an output that writes the latest value for each key.

A read fails when the url cannot be reached, when the status is not 2xx, when the body is not JSON, or when items finds nothing. The input reports the failure one time and tries again with backoff. The interval starts again after the next successful read.

fieldtypedescription
urlstringrequiredThe url to get, for example https://erp.example.com/api/machines.
interval_secsintegerrequiredThe time between two reads, in s. The time starts at the end of one read. The first read occurs when the pipeline starts.
authbearer | headeroptionalThe credential that the input sends. If you do not set it, the input sends no credential.
itemsstringoptionalThe position of the records in the reply, as a JSON pointer. For example, /data/machines reads the array at data.machines. If you do not set it, the input uses the full reply. An array gives one message for each element. Any other value gives one message.
max_batchintegeroptionalThe maximum number of messages in one batch. The default is 1. The input puts only messages that are already read into a batch. It does not wait for a batch to fill.
timeout_secondsintegeroptionalThe maximum time for one request, in s. The default is 30.
ackon_receipt | on_deliveryoptionalWhen the input acknowledges a message to its broker. The default is on_receipt. Only the kafka and mqtt inputs support on_delivery. The mqtt input requires a qos of at_least_once or higher for it. On all other inputs, on_delivery fails to build.
bufferstatic | tumbling | batchoptionalCollect messages from this input into batches before the transforms. Use a count (static), a time (tumbling) or the first of the two (batch). The buffer never sends an empty batch. Available on all input types. This is not the buffer transform.
envelopemerge | wrapoptionalAdd metadata about the source of each message, for example the subject, the topic or the partition. The "metadata" section lists the fields. Available on all input types. If you do not set it, the input sends each message without changes.

auth — type: "bearer"

fieldtypedescription
tokenstringrequiredThe token. Use a ${NAME} reference, so that the config file keeps only the name and the secret store keeps the value.

auth — type: "header"

fieldtypedescription
namestringrequiredThe name of the header. The http input compares the name without case. On an http input, the name must not be a header that an envelope copies into the messages.
valuestringrequiredThe exact value of the header. Use a ${NAME} reference.

buffer — type: "static"

fieldtypedescription
sizeintegerrequiredThe number of messages in a batch.

buffer — type: "tumbling"

fieldtypedescription
window_secondsintegerrequiredThe time to collect messages, in s, from the first message.

buffer — type: "batch"

fieldtypedescription
sizeintegerrequiredThe number of messages that closes the batch immediately.
window_secondsintegerrequiredThe maximum time to wait, in s, from the first message in the batch.

envelope — type: "merge"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.

envelope — type: "wrap"

fieldtypedescription
metastringoptionalThe field for the metadata object. The default is _meta.
payloadstringoptionalThe field for the original payload. The default is value.

metadata — what this input attaches to a message when its envelope is set.

fieldholds
pipelineThe id of the pipeline that read the message.
inputThe type of the input that read the message, for example nats.
received_atThe time when kayak read the message, as RFC 3339. This is the arrival time at this pipeline. It is not the time of the event in the message.
urlThe url that the input read the message from, with no username and no password.
polled_atThe start time of the read that returned the message, as RFC 3339. All messages of one read have the same value. Use it to tell one snapshot from the next.

reference tables generated from the config schemas — just docs