Skip to content

Configuration

Extras reads its settings from the host’s configuration file — slotd.conf on a hosted slot, stationd.conf on a station — when the extension is loaded at start-up. A key that is absent takes its default. A key whose value does not parse as its type also takes its default, and the host logs a warning naming it. A Boolean key is 1, true, yes or on, or 0, false, no or off, compared without regard to case — any other value, including a typo, is warned about and takes the default.

Every Extras key is extension-scoped: the egress budget is shared by REST API Call and Webhook together, so it belongs to the extension rather than to either operation. Both operation pages link here.


KeyTypeDefaultEffect
extras.egress.maxConcurrentInteger8How many egress requests may be in flight at once, across every REST API Call and Webhook node in the slot. 0 disables egress entirely — every request is refused before it is issued.
extras.egress.requestsPerMinuteInteger120How many egress requests may be issued per minute across the slot.
extras.egress.maxResponseBytesInteger1048576 (1 MiB)The largest response body accepted, in bytes. A response that exceeds it is refused.
extras.egress.maxRequestBytesInteger262144 (256 KiB)The largest request body or webhook payload accepted, in bytes. A larger body is refused before the request is issued.

The budget is checked in that order — rate limit first, then concurrency. A request that fails either check is never issued: the Node fails with an Egress: limit exceeded status and no follow-on Path fires that round.

maxConcurrent = 0 is how the Free tier withholds egress: it is not a throttle but an off switch, and it is the value that makes REST API Call and Webhook unavailable rather than merely slow.

A node’s own Max Response Bytes property sets a per-request cap. It can lower the slot-wide cap for one node; it cannot raise it above extras.egress.maxResponseBytes.


KeyTypeDefaultEffect
extras.sqlite.maxRowsInteger1000The most rows a SQLite Storage query reads in Table mode. When the query returns more, the output holds the first maxRows rows and the Node reports a Warning: the query returned more than N rows; the output holds the first of them. The Path carries on. 0 reads as the default.

The bound is the machine’s own: the owner of the slot’s host, or of the station, sets it. Rows a Node produces stay in the Task; a reply that carries them to a client is bounded separately, by the hosted platform.


The numbers a hosted slot actually runs with are set per plan:

LimitFreePlusPro
Max concurrent requestsdisabled48
Requests per minutedisabled60120
Max response bytesdisabled1 MiB1 MiB
Max request body bytesdisabled256 KiB256 KiB
SQLite Storage rows read (Table mode)100010001000

The values in force for your plan are listed in the Acceptable Use Policy.


KeyTypeDefaultEffect
extras.egress.allowCloudMetadataBooleanfalseWhen false, a request whose host is a cloud instance-metadata address is refused. Set true only where a workflow legitimately needs that endpoint.

An egress operation sends a request to a URL a Task author chose, so the destination is worth stating plainly. Two controls apply, and they work at different layers.

The deployment’s egress filter is the authoritative control. On a hosted slot the kernel refuses connections to loopback, link-local and private address ranges outright, so a destination in one of those ranges never reaches a socket. That control acts on the address actually connected to, which is what makes it proof against a hostname that resolves to a private address — including one that resolves differently on a second lookup.

The metadata block is an in-process floor. It matches the request’s host against the cloud instance-metadata literals — 169.254.169.254, fd00:ec2::254, and the v4-mapped ::ffff:169.254.169.254 — and refuses the request with blocked: cloud metadata endpoint. It is checked at the connect seam, so every redirect hop is checked too, not just the URL you typed. It matches the literal only: a hostname that resolves to the metadata address is not caught here and falls to the deployment’s egress filter.

A station is deliberately different. Reaching devices on the local network is the point of running one, so a station applies no private-address filter — the network it sits on is the network you meant.

  • A redirect is followed to a fresh destination, and re-checked. Redirects are followed up to the node’s limit, and each hop re-enters the same checks: the metadata block, and the URL parse.
  • Credentials do not follow a redirect off-origin. When a redirect crosses to a different origin, credential-bearing headers are dropped before the next request is issued, so an Authorization header cannot be replayed to a host you did not address.
  • A header cannot smuggle a second request. A CR, LF or NUL byte in the method or in any header name or value is rejected outright — the whole request fails rather than being silently stripped — so a header value taken from a Task input cannot split the request on the wire.
  • TLS verification is always on. HTTPS connections verify against the system CA bundle; no operation turns verification off or supplies another CA.