Skip to content

inputs

An input is where a pipeline's messages come from. A pipeline may have several — they are merged into one stream, each pumped by its own task so a slow or timer-driven input can't be starved by a busy one — and one input failing is reported and survived; the pipeline stops only when the last one is gone.

Three fields are declared by no input kind and accepted by all of them, because they sit on the wrapper rather than on the kind:

  • buffer gathers messages before the transforms see them, by count, by time, or by whichever comes first. It never emits an empty batch, and its window opens at the first message rather than at the clock — so what it promises is a latency bound, not a cadence. See buffering an input.
  • envelope attaches what the input knows about a message to the message, in band, as ordinary JSON fields. Absent, messages are passed on byte for byte as they arrive. See message metadata.
  • ack says when the input tells its broker a message is done with. Only inputs with a broker-side notion of the difference honour it; the rest refuse to build rather than quietly ignoring it. See acknowledging an input.

max_batch, on the inputs that have it, is a third thing again: it never waits. It takes one message and then drains whatever has already arrived, so a quiet topic yields batches of one however high the cap is and only a catch-up ever fills one. That is what makes it the cheapest fix there is for a consumer replaying a backlog.

dummy

Emits one generated message on a fixed interval — a heartbeat for testing a pipeline without a real source attached.

Every message carries a value and the current_time it was emitted at. What the value holds is the payload field's business: a number sampled from a sine wave, so a chart of it has a shape, or a random sentence, so a text transform has something to chew on.

fieldtypedescription
durationintegerrequiredseconds between messages
amplitudenumberoptionalpeak of the sine wave — it swings between -amplitude and +amplitude. Numeric payloads only; defaults to 1.
payloadnumber | textoptionalwhat each message's value holds: a number sampled from a sine wave, or a random sentence as text. Defaults to number.
periodnumberoptionalseconds for one full turn of the sine wave. Numeric payloads only; defaults to 60. Sampling is by wall clock rather than by message count, so the wave keeps its period whatever duration is.
ackon_receipt | on_deliveryoptionalwhen this input tells its broker a message is done with. Available on every input kind in the schema, but only honoured by ones with a broker-side notion of "received" vs "delivered" of their own (kafka, for now) — an input with nothing to acknowledge refuses to build rather than silently treating this as on_receipt. Defaults to on_receipt, which is what every input has always done. See "acknowledgement modes" in the guide.
bufferstatic | tumbling | batchoptionalbatch messages from this input before the transforms see them — by count (static), by time (tumbling) or by whichever comes first (batch). Never emits an empty batch. Available on every input kind. Not to be confused with the buffer transform.
envelopemerge | wrapoptionalattach metadata about where each message came from — the subject, topic, partition and so on listed under "metadata" below. Available on every input kind. Omit it and messages are passed on exactly as they arrive.

buffertype: "static"

fieldtypedescription
sizeintegerrequiredhow many messages to gather before the batch is handed on

buffertype: "tumbling"

fieldtypedescription
window_secondsintegerrequiredhow long to gather messages for, measured from the first one

buffertype: "batch"

fieldtypedescription
sizeintegerrequiredhow many messages end the batch immediately
window_secondsintegerrequiredhow long to wait for them, measured from the first message in the batch

envelopetype: "merge"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.

envelopetype: "wrap"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.
payloadstringoptionalthe field the original payload is written to. Defaults to value.

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

fieldholds
pipelineid of the pipeline that read the message
inputkind of input it was read by, e.g. nats
received_atwhen kayak read it, RFC 3339. This is an arrival time and not an event time: it says when the message reached this pipeline, not when whatever it describes happened.

http

Accepts messages posted to this pipeline's own endpoint, POST /api/pipelines/{id}/messages — the pipeline is the receiving end of an http API rather than something that reaches out to a broker.

The endpoint is derived from the pipeline's id and appears as soon as the pipeline is running; nothing is configured about it here. The body is one JSON message or an array of them, and an array arrives as one batch. A pipeline can only have one of these — two would share an endpoint, and which of them a request went to would be a coin toss — so a second one fails to build.

fieldtypedescription
authbearer | headeroptionalwhat a post must present to be accepted. Absent — the default — means the endpoint takes anything that reaches it, which is what every pipeline with an http input has always done.
capacityintegeroptionalhow many posted batches may queue up ahead of the pipeline before it starts refusing them with a 503. Defaults to 1024. The queue is what lets a burst through; refusing past it is deliberate, since the alternative is holding a request open until the pipeline catches up.
ackon_receipt | on_deliveryoptionalwhen this input tells its broker a message is done with. Available on every input kind in the schema, but only honoured by ones with a broker-side notion of "received" vs "delivered" of their own (kafka, for now) — an input with nothing to acknowledge refuses to build rather than silently treating this as on_receipt. Defaults to on_receipt, which is what every input has always done. See "acknowledgement modes" in the guide.
bufferstatic | tumbling | batchoptionalbatch messages from this input before the transforms see them — by count (static), by time (tumbling) or by whichever comes first (batch). Never emits an empty batch. Available on every input kind. Not to be confused with the buffer transform.
envelopemerge | wrapoptionalattach metadata about where each message came from — the subject, topic, partition and so on listed under "metadata" below. Available on every input kind. Omit it and messages are passed on exactly as they arrive.

authtype: "bearer"

fieldtypedescription
tokenstringrequiredthe token. A ${NAME} reference, so the config file holds the name and the secret store holds the value.

authtype: "header"

fieldtypedescription
namestringrequiredthe header's name, matched case-insensitively on the way in. On an http input it may not be one of the headers an envelope passes through, since that would write the credential into the messages.
valuestringrequiredthe exact value that header must have. A ${NAME} reference, as above.

buffertype: "static"

fieldtypedescription
sizeintegerrequiredhow many messages to gather before the batch is handed on

buffertype: "tumbling"

fieldtypedescription
window_secondsintegerrequiredhow long to gather messages for, measured from the first one

buffertype: "batch"

fieldtypedescription
sizeintegerrequiredhow many messages end the batch immediately
window_secondsintegerrequiredhow long to wait for them, measured from the first message in the batch

envelopetype: "merge"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.

envelopetype: "wrap"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.
payloadstringoptionalthe field the original payload is written to. Defaults to value.

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

fieldholds
pipelineid of the pipeline that read the message
inputkind of input it was read by, e.g. nats
received_atwhen kayak read it, RFC 3339. This is an arrival time and not an event time: it says when the message reached this pipeline, not when whatever it describes happened.
methodhttp method the messages were posted with
remote_addraddress the request came from, when the server can see one
headersrequest headers, restricted to a fixed listcontent-type, user-agent, x-request-id, x-correlation-id and traceparent. Everything else is dropped rather than passed on: a header carrying a credential (authorization, x-api-key) written into a file or an object store is a leak that outlives the request by years, and no allow-list-by-prefix is safe enough to offer instead.

kafka

Consumes JSON messages from a kafka topic, each emitted as a batch of one.

A payload that isn't JSON is skipped with a warning rather than taking the pipeline down, same as the nats input. The consumer connects on the first read and joins a consumer group, so kafka remembers where this pipeline got to between restarts.

fieldtypedescription
connectionkafka connectionrequiredname of the kafka connection to consume from — see "connections" in the readme. The brokers are declared once, in the connections file, rather than repeated in every pipeline reading from the same cluster.
topicstringrequiredthe topic to consume from
groupstringrequiredconsumer group id. Kafka tracks the read position per group, so two pipelines sharing a group split the topic between them, and two with different groups each get every message.
max_batchintegeroptionalmost messages to put in one batch. Defaults to 1 — one message per batch, which is what this input has always done. Raising it only ever coalesces records that had already arrived: the input still returns as soon as it has one, so an idle topic is no slower than it was. It is worth raising when a consumer is catching up on a backlog, where one-message batches make the run loop, the transforms and every downstream pipeline do their per-batch work a hundred times over.
start_atearliest | latestoptionalwhere to start when the group has no committed position yet: earliest replays the topic from the beginning, latest only sees new messages. Defaults to latest.
ackon_receipt | on_deliveryoptionalwhen this input tells its broker a message is done with. Available on every input kind in the schema, but only honoured by ones with a broker-side notion of "received" vs "delivered" of their own (kafka, for now) — an input with nothing to acknowledge refuses to build rather than silently treating this as on_receipt. Defaults to on_receipt, which is what every input has always done. See "acknowledgement modes" in the guide.
bufferstatic | tumbling | batchoptionalbatch messages from this input before the transforms see them — by count (static), by time (tumbling) or by whichever comes first (batch). Never emits an empty batch. Available on every input kind. Not to be confused with the buffer transform.
envelopemerge | wrapoptionalattach metadata about where each message came from — the subject, topic, partition and so on listed under "metadata" below. Available on every input kind. Omit it and messages are passed on exactly as they arrive.

buffertype: "static"

fieldtypedescription
sizeintegerrequiredhow many messages to gather before the batch is handed on

buffertype: "tumbling"

fieldtypedescription
window_secondsintegerrequiredhow long to gather messages for, measured from the first one

buffertype: "batch"

fieldtypedescription
sizeintegerrequiredhow many messages end the batch immediately
window_secondsintegerrequiredhow long to wait for them, measured from the first message in the batch

envelopetype: "merge"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.

envelopetype: "wrap"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.
payloadstringoptionalthe field the original payload is written to. Defaults to value.

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

fieldholds
pipelineid of the pipeline that read the message
inputkind of input it was read by, e.g. nats
received_atwhen kayak read it, RFC 3339. This is an arrival time and not an event time: it says when the message reached this pipeline, not when whatever it describes happened.
connectionname of the connection it was consumed through
topictopic the record came from
partitionpartition within that topic
offsetthe record's offset in the partition. Together with topic and partition this identifies the record exactly.
keythe record's key as a string, or null when it was sent without one
timestampthe record's own timestamp, RFC 3339, when kafka reports one

nats

Subscribes to a nats subject. Each message is parsed as JSON and emitted as a batch of one; a payload that isn't JSON is skipped with a warning rather than taking the pipeline down. The connection is opened on the first read.

fieldtypedescription
connectionnats connectionrequiredname of the nats connection to subscribe on — see "connections" in the readme. The server it points at is declared once, in the connections file, rather than repeated in every pipeline that uses it.
subjectstringrequiredthe subject to subscribe to
max_batchintegeroptionalmost messages to put in one batch. Defaults to 1 — one message per batch, which is what this input has always done. Raising it only ever coalesces messages that had already arrived: the input still returns as soon as it has one, so a quiet subject is no slower than it was.
ackon_receipt | on_deliveryoptionalwhen this input tells its broker a message is done with. Available on every input kind in the schema, but only honoured by ones with a broker-side notion of "received" vs "delivered" of their own (kafka, for now) — an input with nothing to acknowledge refuses to build rather than silently treating this as on_receipt. Defaults to on_receipt, which is what every input has always done. See "acknowledgement modes" in the guide.
bufferstatic | tumbling | batchoptionalbatch messages from this input before the transforms see them — by count (static), by time (tumbling) or by whichever comes first (batch). Never emits an empty batch. Available on every input kind. Not to be confused with the buffer transform.
envelopemerge | wrapoptionalattach metadata about where each message came from — the subject, topic, partition and so on listed under "metadata" below. Available on every input kind. Omit it and messages are passed on exactly as they arrive.

buffertype: "static"

fieldtypedescription
sizeintegerrequiredhow many messages to gather before the batch is handed on

buffertype: "tumbling"

fieldtypedescription
window_secondsintegerrequiredhow long to gather messages for, measured from the first one

buffertype: "batch"

fieldtypedescription
sizeintegerrequiredhow many messages end the batch immediately
window_secondsintegerrequiredhow long to wait for them, measured from the first message in the batch

envelopetype: "merge"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.

envelopetype: "wrap"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.
payloadstringoptionalthe field the original payload is written to. Defaults to value.

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

fieldholds
pipelineid of the pipeline that read the message
inputkind of input it was read by, e.g. nats
received_atwhen kayak read it, RFC 3339. This is an arrival time and not an event time: it says when the message reached this pipeline, not when whatever it describes happened.
connectionname of the connection it was received on
subjectthe subject this message was published to. This is the concrete subject rather than the pattern subscribed to, which is what makes a wildcard subscription usable: subscribe to *.temperature and the machine's name is here.
replythe reply subject, when the publisher set one, else null
headersnats headers, as an object of arrays

pipeline

Takes another pipeline's output as its input. This is what makes the pipelines a graph: several pipelines can read from the same upstream, and it fans out to all of them. The upstream must already exist when this pipeline is created, so declare it earlier in the config file.

fieldtypedescription
upstreampipeline idrequiredid of the pipeline to read from
ackon_receipt | on_deliveryoptionalwhen this input tells its broker a message is done with. Available on every input kind in the schema, but only honoured by ones with a broker-side notion of "received" vs "delivered" of their own (kafka, for now) — an input with nothing to acknowledge refuses to build rather than silently treating this as on_receipt. Defaults to on_receipt, which is what every input has always done. See "acknowledgement modes" in the guide.
bufferstatic | tumbling | batchoptionalbatch messages from this input before the transforms see them — by count (static), by time (tumbling) or by whichever comes first (batch). Never emits an empty batch. Available on every input kind. Not to be confused with the buffer transform.
envelopemerge | wrapoptionalattach metadata about where each message came from — the subject, topic, partition and so on listed under "metadata" below. Available on every input kind. Omit it and messages are passed on exactly as they arrive.

buffertype: "static"

fieldtypedescription
sizeintegerrequiredhow many messages to gather before the batch is handed on

buffertype: "tumbling"

fieldtypedescription
window_secondsintegerrequiredhow long to gather messages for, measured from the first one

buffertype: "batch"

fieldtypedescription
sizeintegerrequiredhow many messages end the batch immediately
window_secondsintegerrequiredhow long to wait for them, measured from the first message in the batch

envelopetype: "merge"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.

envelopetype: "wrap"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.
payloadstringoptionalthe field the original payload is written to. Defaults to value.

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

fieldholds
pipelineid of the pipeline that read the message
inputkind of input it was read by, e.g. nats
received_atwhen kayak read it, RFC 3339. This is an arrival time and not an event time: it says when the message reached this pipeline, not when whatever it describes happened.
upstreamid of the pipeline this batch came from. Note that metadata already attached upstream arrives with the message and is not replaced — being in band, it flows through the graph like any other field.

mqtt

Subscribes to an mqtt topic — or a topic filter, since mqtt's + and # wildcards are valid here. Each message is parsed as JSON and emitted as a batch of one; a payload that isn't JSON is skipped with a warning rather than taking the pipeline down, the same rule every other input follows.

The connection is opened on the first read, and a stable client id is derived from the pipeline's id and this topic — not configurable, since nothing about it is a choice this pipeline needs to make and getting it wrong (two inputs sharing one id) silently drops one of them.

fieldtypedescription
connectionmqtt connectionrequiredname of the mqtt connection to subscribe on — see "connections" in the readme. The broker it points at is declared once, in the connections file, rather than repeated in every pipeline that uses it.
topicstringrequiredthe topic, or topic filter, to subscribe to
max_batchintegeroptionalmost messages to put in one batch. Defaults to 1 — one message per batch, which is what this input has always done. Raising it only ever coalesces messages that had already arrived: the input still returns as soon as it has one, so a quiet topic is no slower than it was.
qosat_most_once | at_least_once | exactly_onceoptionalthe quality of service to subscribe with. Defaults to at_most_once. ack: on_delivery needs at least at_least_once here — a QoS-0 subscription has nothing for it to acknowledge.
ackon_receipt | on_deliveryoptionalwhen this input tells its broker a message is done with. Available on every input kind in the schema, but only honoured by ones with a broker-side notion of "received" vs "delivered" of their own (kafka, for now) — an input with nothing to acknowledge refuses to build rather than silently treating this as on_receipt. Defaults to on_receipt, which is what every input has always done. See "acknowledgement modes" in the guide.
bufferstatic | tumbling | batchoptionalbatch messages from this input before the transforms see them — by count (static), by time (tumbling) or by whichever comes first (batch). Never emits an empty batch. Available on every input kind. Not to be confused with the buffer transform.
envelopemerge | wrapoptionalattach metadata about where each message came from — the subject, topic, partition and so on listed under "metadata" below. Available on every input kind. Omit it and messages are passed on exactly as they arrive.

buffertype: "static"

fieldtypedescription
sizeintegerrequiredhow many messages to gather before the batch is handed on

buffertype: "tumbling"

fieldtypedescription
window_secondsintegerrequiredhow long to gather messages for, measured from the first one

buffertype: "batch"

fieldtypedescription
sizeintegerrequiredhow many messages end the batch immediately
window_secondsintegerrequiredhow long to wait for them, measured from the first message in the batch

envelopetype: "merge"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.

envelopetype: "wrap"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.
payloadstringoptionalthe field the original payload is written to. Defaults to value.

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

fieldholds
pipelineid of the pipeline that read the message
inputkind of input it was read by, e.g. nats
received_atwhen kayak read it, RFC 3339. This is an arrival time and not an event time: it says when the message reached this pipeline, not when whatever it describes happened.
connectionname of the connection it was received on
topicthe concrete topic this message arrived on — useful when the input subscribes to a filter containing + or # wildcards
qosthe quality of service it was delivered at
retainwhether the broker sent this as a topic's retained message rather than a live publish

redis

Subscribes to a redis channel. Each message is parsed as JSON and emitted as a batch of one; a payload that isn't JSON is skipped with a warning rather than taking the pipeline down. The connection is opened on the first read.

Plain SUBSCRIBE, not PSUBSCRIBE — a channel name is exact, the same choice the nats input makes for a subject with no wildcard. Redis pub/sub has no broker-side redelivery of any kind: an unsubscribed client simply misses whatever was published while it was gone, and there is nothing an ack could hold open — the same limitation NatsConfig has, for the same reason.

fieldtypedescription
connectionredis connectionrequiredname of the redis connection to subscribe on — see "connections" in the readme. The server it points at is declared once, in the connections file, rather than repeated in every pipeline that uses it.
channelstringrequiredthe channel to subscribe to
max_batchintegeroptionalmost messages to put in one batch. Defaults to 1 — one message per batch, which is what this input has always done. Raising it only ever coalesces messages that had already arrived: the input still returns as soon as it has one, so a quiet channel is no slower than it was.
ackon_receipt | on_deliveryoptionalwhen this input tells its broker a message is done with. Available on every input kind in the schema, but only honoured by ones with a broker-side notion of "received" vs "delivered" of their own (kafka, for now) — an input with nothing to acknowledge refuses to build rather than silently treating this as on_receipt. Defaults to on_receipt, which is what every input has always done. See "acknowledgement modes" in the guide.
bufferstatic | tumbling | batchoptionalbatch messages from this input before the transforms see them — by count (static), by time (tumbling) or by whichever comes first (batch). Never emits an empty batch. Available on every input kind. Not to be confused with the buffer transform.
envelopemerge | wrapoptionalattach metadata about where each message came from — the subject, topic, partition and so on listed under "metadata" below. Available on every input kind. Omit it and messages are passed on exactly as they arrive.

buffertype: "static"

fieldtypedescription
sizeintegerrequiredhow many messages to gather before the batch is handed on

buffertype: "tumbling"

fieldtypedescription
window_secondsintegerrequiredhow long to gather messages for, measured from the first one

buffertype: "batch"

fieldtypedescription
sizeintegerrequiredhow many messages end the batch immediately
window_secondsintegerrequiredhow long to wait for them, measured from the first message in the batch

envelopetype: "merge"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.

envelopetype: "wrap"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.
payloadstringoptionalthe field the original payload is written to. Defaults to value.

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

fieldholds
pipelineid of the pipeline that read the message
inputkind of input it was read by, e.g. nats
received_atwhen kayak read it, RFC 3339. This is an arrival time and not an event time: it says when the message reached this pipeline, not when whatever it describes happened.
connectionname of the connection it was received on
channelthe channel this message was published to

opcua

Subscribes to variables on an OPC UA server, one message per value change.

The server pushes: this creates a subscription with a monitored item per node and is told when a value changes, rather than reading them round-robin on a timer. publish_interval_ms is how often the server may send, not how often it samples — a tag that doesn't move produces no messages at all.

Each message is one reading, and carries the tag as well as 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 reading's own quality and is always present — a sensor that has failed reports Bad... with a null value rather than going quiet, and a pipeline that acted on those as if they were readings would be acting on nothing. source_timestamp is when the device says the value was produced, which is the one to reduce or partition by; the envelope's received_at is when kayak read it, and on a slow link those are not the same instant.

The nodes are named by nodes, or found by browse, or both — one of them is required, since an input with nothing to monitor would sit silent forever. A node named twice is subscribed to once.

fieldtypedescription
connectionopcua connectionrequiredname of the opcua connection to subscribe on — see "connections" in the readme. The server it points at is declared once, in the connections file, rather than repeated in every pipeline that uses it.
browseobjectoptionala node to browse, subscribing to every variable found under it.
deadbandnumberoptionalhow far a value must move before the server reports it, in the value's own units. Absent reports every change, however small — which on an analogue signal is every sample, since the last digit is always moving. This is applied by the server, so it saves the network and this pipeline alike. It only applies to numeric nodes; a string or a boolean is reported on every change whatever this says.
max_batchintegeroptionalmost messages to put in one batch. Defaults to 1 — one message per batch, which is what every other input does unless asked otherwise. Worth raising here more than elsewhere: one publish from the server carries every node that changed in the interval, so a subscription to two hundred tags at 1 Hz is two hundred batches a second through the run loop unless they are allowed to travel together. Raising it only ever coalesces changes that had already arrived.
nodeslist of opcua nodeoptionalthe nodes to subscribe to, named one by one.
publish_interval_msintegeroptionalhow often the server may send a batch of changes, in milliseconds. Defaults to 1000. This bounds how long a change waits, not how often anything is measured.
queue_sizeintegeroptionalhow many samples the server may hold for a node between publishes. Defaults to 1, which means a value that changes twice in one interval is reported once — the latest. Raise it, together with sampling_interval_ms, when every sample matters rather than the current value.
sampling_interval_msintegeroptionalhow often the server should look at each node, in milliseconds. Absent asks the server to sample at the publishing interval, which is what it does by default; a smaller value here is what fills a queue with intermediate readings between two publishes.
ackon_receipt | on_deliveryoptionalwhen this input tells its broker a message is done with. Available on every input kind in the schema, but only honoured by ones with a broker-side notion of "received" vs "delivered" of their own (kafka, for now) — an input with nothing to acknowledge refuses to build rather than silently treating this as on_receipt. Defaults to on_receipt, which is what every input has always done. See "acknowledgement modes" in the guide.
bufferstatic | tumbling | batchoptionalbatch messages from this input before the transforms see them — by count (static), by time (tumbling) or by whichever comes first (batch). Never emits an empty batch. Available on every input kind. Not to be confused with the buffer transform.
envelopemerge | wrapoptionalattach metadata about where each message came from — the subject, topic, partition and so on listed under "metadata" below. Available on every input kind. Omit it and messages are passed on exactly as they arrive.

browse

fieldtypedescription
rootstringrequiredid of the node to browse under, in the same notation as node_id — typically a folder, e.g. ns=2;s=Machine1. Every variable found beneath it is subscribed to; folders and objects are followed, not subscribed.
depthintegeroptionalhow many levels below the root to follow. Defaults to 3, and there is deliberately no spelling for "all of them": a browse of a plant server's whole address space is thousands of nodes, and the pipeline that asked for it would find that out by subscribing to them.

nodes — each entry

fieldtypedescription
node_idstringrequiredthe node's id, in OPC UA's own notation — ns=2;s=Machine1.Temperature for a string identifier, ns=2;i=1042 for a numeric one, g= for a guid and b= for an opaque one. A node id with no ns= is in namespace 0, the server's own.
namestringoptionalwhat the messages from this node call it. Defaults to the node id itself, which is exact and unreadable; naming the tag here is what makes the rest of the pipeline — a group_by, a column mapping — legible.

buffertype: "static"

fieldtypedescription
sizeintegerrequiredhow many messages to gather before the batch is handed on

buffertype: "tumbling"

fieldtypedescription
window_secondsintegerrequiredhow long to gather messages for, measured from the first one

buffertype: "batch"

fieldtypedescription
sizeintegerrequiredhow many messages end the batch immediately
window_secondsintegerrequiredhow long to wait for them, measured from the first message in the batch

envelopetype: "merge"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.

envelopetype: "wrap"

fieldtypedescription
metastringoptionalthe field the metadata object is written to. Defaults to _meta.
payloadstringoptionalthe field the original payload is written to. Defaults to value.

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

fieldholds
pipelineid of the pipeline that read the message
inputkind of input it was read by, e.g. nats
received_atwhen kayak read it, RFC 3339. This is an arrival time and not an event time: it says when the message reached this pipeline, not when whatever it describes happened.
connectionname of the connection the session was opened through. Which node the reading came from is deliberately not here: it is on the message itself, as node and name, because a value without its tag is not a reading and metadata is opt-in.

reference tables generated from the config schemas — just docs