Enmasse reference - GitOps for Zato configuration

The full reference of all options available in enmasse YAML configuration files.

This chapter is a reference for all the options available in enmasse YAML files, the platform's GitOps configuration format. For an overview of enmasse, see the enmasse overview page.

REST channels

Key: channel_rest

NameRequiredDescription
nameUnique name of the REST channel
serviceName of the Zato service that the channel invokes
url_pathURL path that the channel listens on, e.g. /api/v1/my-endpoint
securityName of a security definition to protect the channel with
is_activeWhether the channel accepts requests (default is true)
methodHTTP method the channel accepts, e.g. GET or POST (if omitted, all methods are accepted)
data_formatExpected data format of incoming requests, e.g. json
content_typeContent type that the channel expects in incoming requests
timeoutRequest timeout in seconds
groupsList of security group names whose members are allowed to call this channel
is_audit_log_activeWhether the channel's traffic goes to the audit log (default is true, exported only when false)
rate_limitingRate limiting rules - see rate limiting on REST channels
response_cacheResponse caching configuration - see response caching on REST channels
is_deprecatedWhether the channel is marked deprecated - it keeps serving but announces the deprecation in response headers (default is false)
deprecation_sunsetThe retirement date announced in the Sunset response header, e.g. 2027-06-30
deprecation_successorURL of the replacement endpoint, announced in the Link response header
channel_rest:
  - name: enmasse.channel.rest.1
    service: demo.ping
    url_path: /enmasse.rest.1

  - name: enmasse.channel.rest.2
    service: demo.ping
    url_path: /enmasse.rest.2
    security: enmasse.basic_auth.1
    data_format: json

More details in the REST channels chapter.

Rate limiting on REST channels

Rate limiting is configured as a nested rate_limiting key inside each channel_rest entry. It is a list of rules, evaluated top to bottom. The first rule whose address list matches the client IP is used. Within each rule, time ranges are checked in order, and the all-day default applies when no specific time range matches.

Each rule contains:

NameRequiredDescription
cidr_list---List of IP addresses or ranges, e.g. 10.0.0.0/8 or 192.168.1.10. If empty, the rule matches all clients.
time_rangeYesList of time range entries (see below). The first entry must be the all-day default (is_all_day: true).

Each time range entry contains:

NameRequiredDescription
is_all_dayYestrue for the all-day default, false for a specific time range
time_from---Start time in HH:MM format (required when is_all_day is false)
time_to---End time in HH:MM format (required when is_all_day is false)
disabledYesIf true, the time range is skipped during evaluation
disallowedYesIf true, matching requests are silently dropped at the TCP level
rateYesRequests per second (sustained)
burstYesMaximum burst size before throttling
limitYesHard cap on total requests within the time unit
limit_unitYesTime unit for the hard cap - one of second, minute, hour, day, month
channel_rest:

  # Simple channel with 200 requests per minute, burst up to 50/s
  - name: crm.customer.get
    service: crm.customer.get-details
    url_path: /api/v1/customers
    rate_limiting:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 50
            burst: 50
            limit: 200
            limit_unit: minute

  # Internal IPs get generous limits, everything else is silently dropped
  - name: billing.internal.sync
    service: billing.sync
    url_path: /internal/billing/sync
    rate_limiting:
      - cidr_list:
          - 10.0.0.0/8
          - 172.16.0.0/12
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 100
            burst: 200
            limit: 50000
            limit_unit: hour
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: true
            rate: 0
            burst: 0
            limit: 0
            limit_unit: minute

  # Higher limits during the nightly batch window, stricter during the day
  - name: warehouse.inventory.update
    service: warehouse.inventory.bulk-update
    url_path: /api/v1/inventory
    rate_limiting:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 20
            burst: 50
            limit: 5000
            limit_unit: hour
          - is_all_day: false
            time_from: "01:00"
            time_to: "03:00"
            disabled: false
            disallowed: false
            rate: 200
            burst: 500
            limit: 100000
            limit_unit: hour

  # Block a specific range, allow everyone else at 100/minute
  - name: public.search
    service: search.query
    url_path: /api/v1/search
    rate_limiting:
      - cidr_list:
          - 198.51.100.0/24
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: true
            rate: 0
            burst: 0
            limit: 0
            limit_unit: minute
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 20
            burst: 40
            limit: 100
            limit_unit: minute

  # Strict daily budget - 10,000 requests per day, 10/s sustained
  - name: reports.generate
    service: reports.generate-pdf
    url_path: /api/v1/reports
    rate_limiting:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 10
            burst: 20
            limit: 10000
            limit_unit: day

For a full explanation of all rate limiting concepts, see the Rate limiting and firewall chapter.

Response caching on REST channels

Response caching is configured as a nested response_cache key inside a channel_rest entry. On export, only the fields that differ from their defaults are written out.

NameRequiredDescription
is_enabled---Whether the channel caches responses at all (default is false)
ttl---How long a cached response lives (default is 5)
ttl_unit---Unit for the TTL - one of seconds, minutes or hours (default is minutes)
is_shared_across_callers---Whether all the callers share one cache entry or each caller has its own (default is false)
vary_by_headers---List of request headers whose values become part of the cache key
ignored_query_parameters---List of query parameters left out of the cache key
include_body_in_key---Whether the request body becomes part of the cache key (default is false)
max_body_size---The biggest response cached, in bytes (default is 1000000)
cache_on_second_request---Whether a response is cached only once the same request repeats (default is true)
needs_etag---Whether cached responses include an ETag header (default is false)
coalesce_timeout---How long concurrent identical requests wait for the first one's response, in seconds (default is 15)
channel_rest:

  - name: crm.customer.get
    service: crm.customer.get-details
    url_path: /api/v1/customers
    response_cache:
      is_enabled: true
      ttl: 10
      ttl_unit: minutes
      vary_by_headers:
        - X-Tenant-Id

The Response caching chapter explains all the fields in detail.

SOAP channels

Key: channel_soap

NameRequiredDescription
nameYesUnique name of the SOAP channel
serviceYesName of the Zato service that the channel invokes
url_pathYesURL path that the channel listens on
security---Name of a security definition to protect the channel with
soap_action---SOAP action the channel responds to
soap_version---SOAP protocol version (default is 1.1)
use_mtom---Whether the channel accepts MTOM attachments (default is false)
method---HTTP method the channel accepts (if omitted, all methods are accepted)
content_type---Content type that the channel expects in incoming requests
timeout---Request timeout in seconds
groups---List of security group names whose members are allowed to call this channel
is_audit_log_active---Whether the channel's traffic goes to the audit log (default is true, exported only when false)
rate_limiting---Rate limiting rules, in the same shape as on REST channels
response_cache---Response caching configuration, in the same shape as on REST channels
channel_soap:

  - name: enmasse.channel.soap.1
    service: demo.soap-input
    url_path: /soap/orders
    security: enmasse.basic_auth.1
    soap_action: urn:example:orders:create

  - name: enmasse.channel.soap.2
    service: demo.soap-attachments
    url_path: /soap/documents
    soap_version: "1.2"
    use_mtom: true

Outgoing REST connections

Key: outgoing_rest

NameRequiredDescription
nameYesUnique name of the outgoing connection
hostYesBase host URL of the remote endpoint, e.g. https://api.example.com
url_pathYesURL path appended to the host when making requests, e.g. /v1/endpoint
security---Name of a security definition to use when connecting
data_format---Data format of outgoing requests, e.g. json
timeout---Request timeout in seconds (default is 60)
ping_method---HTTP method used to ping the connection (default is GET)
pool_size---Size of the connection pool (default is 20)
tls_verify---Whether to verify the remote TLS certificate (default is true)
content_type---Content type header sent with outgoing requests
is_audit_log_active---Whether the connection's traffic goes to the audit log (default is true, exported only when false)
max_retries---How many times a failed invocation is retried after a timeout, a connection error or an HTTP 429 response (default is 0, i.e. no retries)
retry_sleep_time---How many seconds to sleep before the first retry (default is 2)
retry_backoff_multiplier---Each retry sleeps this many times longer than the previous one, up to 8 seconds per a single sleep (default is 2)
retry_backoff_threshold---A cap on the total time spent sleeping between retries, in seconds - once reached, no more retries take place (default is 60)

The retry fields are exported only when they differ from their defaults.

outgoing_rest:
  - name: enmasse.outgoing.rest.1
    host: https://example.com
    url_path: /api/v1
    data_format: json
    timeout: 60

  - name: enmasse.outgoing.rest.2
    host: https://example.com
    url_path: /api/v2
    security: enmasse.bearer_token.1
    tls_verify: false

  # A connection that retries failed invocations - with these settings, a call that keeps failing
  # sleeps 2s, 4s, 8s, 8s and 8s between attempts before giving up, about 30 seconds in total.
  - name: enmasse.outgoing.rest.3
    host: https://example.com
    url_path: /api/v3
    max_retries: 5
    retry_sleep_time: 2
    retry_backoff_multiplier: 2
    retry_backoff_threshold: 60

See also: Configuring REST API outgoing connections

Outgoing SOAP connections

Key: outgoing_soap

NameRequiredDescription
nameYesUnique name of the outgoing connection
hostYesBase host URL of the remote endpoint, e.g. https://api.example.com
url_pathYesURL path appended to the host when making requests, e.g. /v1/endpoint
security---Name of a security definition to use when connecting
soap_action---SOAP action header sent with requests
soap_version---SOAP protocol version (default is 1.1)
data_format---Data format of outgoing requests
timeout---Request timeout in seconds (default is 60)
ping_method---HTTP method used to ping the connection (default is GET)
pool_size---Size of the connection pool (default is 20)
tls_verify---Whether to verify the remote TLS certificate (default is true)
content_type---Content type header sent with outgoing requests
is_audit_log_active---Whether the connection's traffic goes to the audit log (default is true, exported only when false)
max_retries---How many times a failed invocation is retried after a timeout, a connection error or an HTTP 429 response (default is 0, i.e. no retries)
retry_sleep_time---How many seconds to sleep before the first retry (default is 2)
retry_backoff_multiplier---Each retry sleeps this many times longer than the previous one, up to 8 seconds per a single sleep (default is 2)
retry_backoff_threshold---A cap on the total time spent sleeping between retries, in seconds - once reached, no more retries take place (default is 60)

The retry fields are exported only when they differ from their defaults.

outgoing_soap:
  - name: enmasse.outgoing.soap.1
    host: https://example.com
    url_path: /SOAP
    security: enmasse.ntlm.1
    soap_action: urn:microsoft-dynamics-schemas/page/example:Create
    soap_version: "1.1"
    tls_verify: false
    timeout: 20

  # A connection that retries failed invocations - three retries with 1s, 2s and 4s sleeps between them
  - name: enmasse.outgoing.soap.2
    host: https://example.com
    url_path: /SOAP
    soap_action: urn:example:submit
    soap_version: "1.2"
    max_retries: 3
    retry_sleep_time: 1

More details in the Python SOAP chapter.

Security definitions

Key: security

basic_auth

NameRequiredDescription
nameYesUnique name of the security definition
typeYesMust be basic_auth
usernameYesUsername
password---Password - can be set via an environment variable
realm---HTTP Basic Auth realm (default is zato)
is_active---Whether the definition is active (default is true)
security:
  - name: enmasse.basic_auth.1
    type: basic_auth
    username: enmasse.1
    password: Zato_Enmasse_Env.BasicAuth1

apikey

NameRequiredDescription
nameYesUnique name of the security definition
typeYesMust be apikey
password---The API key value - can be set via an environment variable
header---Name of the HTTP header that holds the API key (default is X-API-Key)
is_active---Whether the definition is active (default is true)
security:
  - name: enmasse.apikey.1
    type: apikey
    username: enmasse.1
    password: Zato_Enmasse_Env.EnmasseApiKey1

ntlm

NameRequiredDescription
nameYesUnique name of the security definition
typeYesMust be ntlm
usernameYesUsername, typically in DOMAIN\user format
password---Password - can be set via an environment variable
is_active---Whether the definition is active (default is true)
security:
  - name: enmasse.ntlm.1
    type: ntlm
    username: enmasse\\user
    password: Zato_Enmasse_Env.NTLMPassword

mtls

mTLS definitions are asymmetric - the path fields drive outgoing connections while the match criteria drive channels. One definition uses one set or the other. More details in the mTLS chapter.

NameRequiredDescription
nameYesUnique name of the security definition
typeYesMust be mtls
cert_path---Path to the client certificate in PEM format, for outgoing connections
key_path---Path to the certificate's private key in PEM format - not needed when the certificate file contains the key
ca_certs_path---Path to a CA bundle the remote server's certificate must chain up to
client_cert_fingerprint---Expected SHA256 fingerprint of an inbound client certificate, for channels
client_cert_subject_dn---Expected subject DN of an inbound client certificate, for channels
is_active---Whether the definition is active (default is true)
security:
  - name: enmasse.mtls.1
    type: mtls
    cert_path: /opt/hot-deploy/ssl/client-cert.pem
    key_path: /opt/hot-deploy/ssl/client-key.pem
    ca_certs_path: /opt/hot-deploy/ssl/remote-ca.pem

  - name: enmasse.mtls.2
    type: mtls
    client_cert_fingerprint: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    client_cert_subject_dn: CN=client,O=Example,C=US

spnego

Kerberos definitions are used with outgoing connections - the keytab is the credential, so there is no password. More details in the Kerberos (SPNEGO) chapter.

NameRequiredDescription
nameYesUnique name of the security definition
typeYesMust be spnego
principalYesThe Kerberos principal to authenticate as
keytab_pathYesPath to the principal's keytab file, as mounted into the container
target_spn---Service principal name of the remote API, e.g. HTTP@api.example.com - derived from the target host name when absent
needs_delegation---Whether to delegate credentials to the remote service (default is false)
is_active---Whether the definition is active (default is true)
security:
  - name: enmasse.spnego.1
    type: spnego
    principal: enmasse@EXAMPLE.COM
    keytab_path: /opt/hot-deploy/krb5/enmasse.keytab
    target_spn: HTTP@api.example.com

bearer_token

A bearer token definition is either dynamic - Zato obtains and refreshes the token from a token endpoint - or static, with a fixed token that never changes. The presence of any of the static_* fields makes the definition static.

Fields of dynamic definitions:

NameRequiredDescription
nameYesUnique name of the security definition
typeYesMust be bearer_token
usernameYesClient ID used to obtain the token
auth_endpointYesURL of the token endpoint
password---Client secret - can be set via an environment variable
grant_type---OAuth grant type (default is client_credentials)
client_id_field---Name of the client ID field sent to the token endpoint (default is client_id)
client_secret_field---Name of the client secret field sent to the token endpoint (default is client_secret)
data_format---Format of the token request (default is form)
extra_fields---List of additional fields to include in the token request, e.g. audience=https://api.example.com
is_active---Whether the definition is active (default is true)

Fields of static definitions:

NameRequiredDescription
nameYesUnique name of the security definition
typeYesMust be bearer_token
static_tokenYesThe token itself - can be set via an environment variable, is never exported
static_header---The header the token is sent in (default is Authorization)
static_prefix---The prefix before the token in the header (default is bearer)
is_active---Whether the definition is active (default is true)
security:
  - name: enmasse.bearer_token.1
    type: bearer_token
    username: enmasse.1
    password: Zato_Enmasse_Env.EnmasseBearerToken1
    auth_endpoint: https://example.com/oauth/token
    client_id_field: username
    client_secret_field: password
    grant_type: password
    data_format: form

  - name: enmasse.bearer_token.2
    type: bearer_token
    username: enmasse.2
    password: Zato_Enmasse_Env.EnmasseBearerToken2
    auth_endpoint: https://example.com/oauth/token
    extra_fields:
      - audience=https://api.example.com

  # A static token sent as-is with each request
  - name: enmasse.bearer_token.3
    type: bearer_token
    static_token: Zato_Enmasse_Env.EnmasseStaticToken
    static_header: X-Auth-Token
    static_prefix: Token

wss

WS-Security definitions attach to SOAP channels and outgoing SOAP connections. Each definition has a mode - username_token, x509 or saml - and the mode decides which of the remaining fields apply.

Fields common to all modes:

NameRequiredDescription
nameYesUnique name of the security definition
typeYesMust be wss
usernameYesUsername
modeYesOne of username_token, x509 or saml
password---Password - can be set via an environment variable
is_active---Whether the definition is active (default is true)

Fields of the username_token mode:

NameRequiredDescription
use_digest---Whether the password travels in digest form, with a nonce and timestamp, instead of as text (default is false)

Fields of the x509 mode:

NameRequiredDescription
sign---Whether to sign messages with the signing key (default is false)
encrypt---Whether to encrypt message bodies to the peer certificate (default is false)
signing_key---Your own private key, PEM
signing_certificate_chain---Your own certificate and any intermediates, PEM - sent along so the receiver can verify the signature
decryption_key---The key that decrypts what arrives encrypted to you, PEM
peer_certificate---The other side's certificate, PEM - used both to encrypt to them and to pin their signatures
trust_anchors---CA certificates the other side's signing certificates may chain up to instead of pinning, PEM

Fields of the saml mode:

NameRequiredDescription
issuer---Who vouches for the assertion
subject---The user or system the assertion is about
audience---Who the assertion is meant for
sign---Whether to sign the assertion (default is false) - uses signing_key and signing_certificate_chain, with trust_anchors validating incoming assertions
security:
  - name: enmasse.wss.token
    type: wss
    username: enmasse.1
    password: Zato_Enmasse_Env.EnmasseWSSToken
    mode: username_token
    use_digest: true

  - name: enmasse.wss.x509
    type: wss
    username: enmasse.2
    mode: x509
    sign: true
    encrypt: true
    signing_key: |-
      -----BEGIN PRIVATE KEY-----
      ...
      -----END PRIVATE KEY-----
    signing_certificate_chain: |-
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----
    decryption_key: |-
      -----BEGIN PRIVATE KEY-----
      ...
      -----END PRIVATE KEY-----
    peer_certificate: |-
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----
    trust_anchors: |-
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----

  - name: enmasse.wss.saml
    type: wss
    username: enmasse.3
    mode: saml
    issuer: https://idp.example.com
    subject: CN=Example Subject
    audience: https://api.example.com
    sign: true
    signing_key: |-
      -----BEGIN PRIVATE KEY-----
      ...
      -----END PRIVATE KEY-----
    signing_certificate_chain: |-
      -----BEGIN CERTIFICATE-----
      ...
      -----END CERTIFICATE-----

Further reading: API authentication, SOAP security

Rate limiting on security definitions

Rate limiting on security definitions uses the same nested rate_limiting key inside each security entry. The rules apply to every channel that uses the definition - the limit follows the credential, not the endpoint. If a partner authenticates to five different channels, they all share one set of counters.

The rule and time range structure is identical to the channel rate limiting section above.

security:

  # Partner gets 1,000 requests per hour across all channels they call
  - name: partner-acme
    type: basic_auth
    username: acme
    password: Zato_Enmasse_Env.AcmePassword
    rate_limiting:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 20
            burst: 40
            limit: 1000
            limit_unit: hour

  # External vendor limited to 500/day, only from their known IP range
  - name: vendor-logistics
    type: apikey
    password: Zato_Enmasse_Env.LogisticsApiKey
    rate_limiting:
      - cidr_list:
          - 198.51.100.0/24
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 5
            burst: 10
            limit: 500
            limit_unit: day
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: true
            rate: 0
            burst: 0
            limit: 0
            limit_unit: minute

  # Gold tier partner - 50,000 per hour
  - name: partner-gold
    type: basic_auth
    username: gold
    password: Zato_Enmasse_Env.GoldPassword
    rate_limiting:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 100
            burst: 200
            limit: 50000
            limit_unit: hour

  # Silver tier partner - 5,000 per hour
  - name: partner-silver
    type: basic_auth
    username: silver
    password: Zato_Enmasse_Env.SilverPassword
    rate_limiting:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 10
            burst: 20
            limit: 5000
            limit_unit: hour

  # Deny all traffic for a retired API key
  - name: apikey-retired
    type: apikey
    password: Zato_Enmasse_Env.RetiredKey
    rate_limiting:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: true
            rate: 0
            burst: 0
            limit: 0
            limit_unit: minute

  # Internal service account - higher limits during nightly ETL, strict during the day
  - name: etl-service-account
    type: basic_auth
    username: etl
    password: Zato_Enmasse_Env.EtlPassword
    rate_limiting:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 10
            burst: 20
            limit: 1000
            limit_unit: hour
          - is_all_day: false
            time_from: "00:00"
            time_to: "04:00"
            disabled: false
            disallowed: false
            rate: 200
            burst: 500
            limit: 200000
            limit_unit: hour

For a full explanation of all rate limiting concepts, see the Rate limiting and firewall chapter.

Quota tiers

Key: quota_tier

A quota tier is a named, reusable set of rate limiting rules. Instead of repeating the same rate_limiting block across many security definitions, define the rules once as a tier and reference it by name with a quota_tier key - on a security definition or on a security group.

NameRequiredDescription
nameYesUnique name of the tier
description---Free-form description
rules---List of rate limiting rules, in the same shape as the rate limiting rate_limiting key

A security definition either references a tier or has its own rate_limiting rules, never both - when a YAML entry has one of the keys, the other is dropped.

quota_tier:

  - name: tier.gold
    description: Gold partners - 50,000 requests per hour
    rules:
      - cidr_list: []
        time_range:
          - is_all_day: true
            disabled: false
            disallowed: false
            rate: 100
            burst: 200
            limit: 50000
            limit_unit: hour

security:

  - name: partner-gold
    type: basic_auth
    username: gold
    password: Zato_Enmasse_Env.GoldPassword
    quota_tier: tier.gold

The Quota tiers chapter explains how tiers and direct rules interact.

Scheduler jobs

Key: scheduler

At least one interval field (weeks, days, hours, minutes or seconds) must be non-zero.

NameRequiredDescription
nameYesUnique name of the scheduler job
serviceYesName of the Zato service that the job invokes
job_typeYesType of the job - must be interval_based
start_dateYesDate and time when the job first becomes eligible to run, e.g. 2027-01-01 00:00:00
is_active---Whether the job is active (default is true)
weeks---Number of weeks between runs (default is 0)
days---Number of days between runs (default is 0)
hours---Number of hours between runs (default is 0)
minutes---Number of minutes between runs (default is 1)
seconds---Number of seconds between runs (default is 0)
repeats---How many times the job should run before stopping (default is unlimited)
extra---List of extra lines passed to the service as input
scheduler:
  - name: enmasse.scheduler.1
    service: demo.ping
    job_type: interval_based
    start_date: '2027-01-11 11:23:52'
    seconds: 2
    is_active: true

  - name: enmasse.scheduler.2
    service: demo.ping
    job_type: interval_based
    start_date: '2027-02-19 12:00:00'
    hours: 3

For Python scheduler examples, visit the scheduler examples page.

SQL connections

Key: sql

NameRequiredDescription
nameYesUnique name of the connection
typeYesDatabase engine type - one of mysql, oracle, postgresql, mssql, snowflake or redshift
hostYesDatabase server host
portYesDatabase server port
db_nameYesName of the database to connect to
usernameYesDatabase username
password---Database password - can be set via an environment variable
pool_size---Size of the connection pool (default is 5)
timeout---Connection timeout in seconds
extra---List of extra connection parameters, e.g. connect_timeout=10
audit_log---What the audit log records for the connection - one of off, statement, statement-params or full (default is off)
ssl---Whether to connect over TLS (default is false)
ssl_ca_file---Path to a PEM file with the CA certificates that signed the server's certificate
ssl_cert_file---Path to the client certificate, for mutual TLS
ssl_key_file---Path to the client private key, for mutual TLS
ssl_verify---Whether to validate the server's TLS certificate (default is true)
is_active---Whether the connection is active (default is true)
sql:
  - name: enmasse.sql.1
    type: mysql
    host: 127.0.0.1
    port: 3306
    db_name: mydb
    username: enmasse.1
    password: Zato_Enmasse_Env.SQL_Password_1

  - name: enmasse.sql.2
    type: mssql
    host: 10.152.81.199
    port: 1433
    db_name: mydb
    username: enmasse.2
    password: Zato_Enmasse_Env.SQL_Password_2
    extra:
      - connect_timeout=10
    pool_size: 10
    audit_log: statement

  - name: enmasse.sql.3
    type: snowflake
    host: myorg-myaccount
    port: 443
    db_name: MYDB
    username: enmasse.3
    password: Zato_Enmasse_Env.SQL_Password_3
    extra:
      - warehouse=COMPUTE_WH
      - role=ANALYST
      - schema=PUBLIC

  - name: enmasse.sql.4
    type: redshift
    host: examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com
    port: 5439
    db_name: mydb
    username: enmasse.4
    password: Zato_Enmasse_Env.SQL_Password_4
    ssl: true
    ssl_ca_file: /path/to/ca.pem

With Snowflake, the host field is the account identifier, e.g. myorg-myaccount, not a hostname, and the port field is always 443.

Database-specific guides: MySQL · PostgreSQL · Oracle · Microsoft SQL Server · Snowflake · Amazon Redshift

MongoDB

Key: mongodb (alias: outgoing_mongodb)

NameRequiredDescription
nameYesUnique name of the connection
server_listYesOne or more host:port entries, separated with newlines (default is localhost:27017)
username---Username to authenticate with
password---Password - can be set via an environment variable
auth_source---Database to authenticate against (default is admin)
replica_set---Name of the replica set to require, if any
app_name---Application name reported to the server (default is Zato)
pool_size_max---Maximum size of the connection pool (default is 10)
connect_timeout---Connection timeout in seconds (default is 10)
server_select_timeout---Server selection timeout in seconds (default is 5)
is_tls_enabled---Whether to connect over TLS (default is false)
tls_ca_certs_file---Path to a PEM file with the CA certificates that signed the server's certificate
tls_cert_key_file---Path to a combined client certificate and private key PEM file, for mutual TLS
is_tls_validation_enabled---Whether to validate the server's TLS certificate (default is true)
is_active---Whether the connection is active (default is true)
mongodb:
  - name: enmasse.mongodb.1
    server_list: localhost:27017
    username: enmasse
    password: Zato_Enmasse_Env.Enmasse_MongoDB_Password

  - name: enmasse.mongodb.2
    server_list: |-
      mongodb1.example.com:27017
      mongodb2.example.com:27017
    username: enmasse
    password: Zato_Enmasse_Env.Enmasse_MongoDB_Password
    replica_set: rs0
    is_tls_enabled: true
    tls_ca_certs_file: /path/to/ca.pem
    tls_cert_key_file: /path/to/client.pem

More details in the MongoDB programming chapter.

Email - IMAP

Key: email_imap

NameRequiredDescription
nameYesUnique name of the connection
hostYesIMAP server host
portYesIMAP server port
usernameYesUsername
password---Password - can be set via an environment variable
mode---Connection mode, e.g. ssl or plain (default is plain)
timeout---Connection timeout in seconds (default is 30)
debug_level---Debug level for the IMAP library (default is 0)
get_criteria---Criteria used to fetch messages (default is {})
is_active---Whether the connection is active (default is true)
scheduler_run_every---How often to poll the mailbox, e.g. 5 - requires the other scheduler fields too
scheduler_run_unit---Unit for scheduler_run_every - one of seconds, minutes, hours or days
scheduler_start_date---When to start polling, e.g. 2026-01-01T00:00:00
scheduler_service---Service invoked for each message received from the mailbox
scheduler_invoke_with---What scheduler_service receives on input - message (default) or each_attachment
is_audit_log_active---Whether the connection's traffic goes to the audit log (default is true, exported only when false)

If the scheduler fields are given, a scheduler job is auto-created for the connection. The job polls the mailbox on the configured interval and invokes scheduler_service with each message received. With scheduler_invoke_with set to message, the service is invoked once per message, with the message object on input. With each_attachment, the message's body is ignored and the service is invoked once per each of the message's attachments, with an attachment object on input. Messages are marked as seen automatically once the service returns without an exception, otherwise they are received anew on the next run. The fields scheduler_run_every, scheduler_start_date and scheduler_service must be given together.

email_imap:
  - name: enmasse.email.imap.1
    host: imap.example.com
    port: 993
    username: enmasse@example.com
    password: Zato_Enmasse_Env.IMAPPassword

  - name: enmasse.email.imap.2
    host: imap.example.com
    port: 993
    username: enmasse@example.com
    password: Zato_Enmasse_Env.IMAPPassword
    scheduler_run_every: 5
    scheduler_run_unit: minutes
    scheduler_start_date: 2026-01-01T00:00:00
    scheduler_service: demo.ping
    scheduler_invoke_with: each_attachment

Read the Python IMAP email guide, including Microsoft 365 and OAuth2.

Email - SMTP

Key: email_smtp

NameRequiredDescription
nameYesUnique name of the connection
hostYesSMTP server host
portYesSMTP server port
username---Username
password---Password - can be set via an environment variable
mode---Connection mode, e.g. starttls or plain (default is plain)
timeout---Connection timeout in seconds (default is 60)
ping_address---Email address used to ping the connection
is_debug---Whether to enable debug output (default is false)
is_active---Whether the connection is active (default is true)
email_smtp:
  - name: enmasse.email.smtp.1
    host: smtp.example.com
    port: 587
    username: enmasse@example.com
    password: Zato_Enmasse_Env.SMTPPassword

More details in the Python SMTP email chapter.

LDAP

Key: ldap

NameRequiredDescription
nameYesUnique name of the connection
usernameYesDistinguished name (DN) of the user to bind as
server_listYesComma-separated list of LDAP servers, e.g. 127.0.0.1:389
auth_type---Authentication type, e.g. NTLM or SIMPLE
password---Password - can be set via an environment variable
is_active---Whether the connection is active (default is true)
ldap:
  - name: enmasse.ldap.1
    username: 'CN=enmasse,OU=testing,OU=Servers,DC=enmasse'
    auth_type: NTLM
    server_list: 127.0.0.1:389
    password: Zato_Enmasse_Env.Enmasse_LDAP_Password

See custom authentication for how to use LDAP credentials in services.

OData

Key: odata

NameRequiredDescription
nameYesUnique name of the connection
addressYesService root URL, e.g. https://example.com/sap/opu/odata/sap/API_SALES_ORDER_SRV/
odata_version---OData version, 2.0 or 4.0 (default is 4.0)
auth_type---Authentication type, one of no-auth, basic, bearer or oauth2 (default is basic)
username---Username, for Basic Auth
secret---Password or bearer token - can be set via an environment variable
token_url---OAuth2 token URL, e.g. https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token
tenant_id---OAuth2 tenant ID - when given, it is substituted into the token URL
client_id---OAuth2 client ID
client_secret---OAuth2 client secret - can be set via an environment variable
scopes---OAuth2 scopes, e.g. https://api.businesscentral.dynamics.com/.default
needs_csrf_token---Whether to exchange SAP X-CSRF-Token headers for write operations (default is false)
page_size---Server-driven page size requested via Prefer: odata.maxpagesize (default is 0, meaning the server decides)
timeout---Connection timeout in seconds (default is 60)
pool_size---Connection pool size (default is 1)
is_active---Whether the connection is active (default is true)
odata:
  - name: enmasse.odata.1
    address: https://example.com/sap/opu/odata/sap/API_SALES_ORDER_SRV/
    odata_version: "2.0"
    auth_type: basic
    username: enmasse.odata.user.1
    needs_csrf_token: true
    secret: Zato_Enmasse_Env.Enmasse_OData_Secret

  - name: enmasse.odata.2
    address: https://api.businesscentral.dynamics.com/v2.0/my-tenant/sandbox/api/v2.0/
    odata_version: "4.0"
    auth_type: oauth2
    token_url: https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token
    tenant_id: my-tenant
    client_id: my-client-id
    scopes: https://api.businesscentral.dynamics.com/.default
    client_secret: Zato_Enmasse_Env.Enmasse_OData_Client_Secret

More details in the OData integrations chapter.

SMB

Key: smb (alias: outgoing_smb)

NameRequiredDescription
nameYesUnique name of the connection
hostYesSMB server host
port---SMB server port (default is 445)
username---Username for NTLM authentication
password---Password - can be set via an environment variable
is_active---Whether the connection is active (default is true)
smb:
  - name: enmasse.smb.1
    host: smb.example.com
    port: 445
    username: enmasse
    password: Zato_Enmasse_Env.Enmasse_SMB_Password

An SMB connection may also include a schedules list, each entry watching a directory and invoking a service once per file - see file transfer in enmasse for its fields, and the file transfer chapter for everything else.

SFTP

Key: sftp (alias: outgoing_sftp)

NameRequiredDescription
nameYesUnique name of the connection
addressYesSFTP server address, optionally including a port, e.g. example.com or example.com:22022 (default port is 22)
username---Username to log in with
password---Password - can be set via an environment variable, and if the private key is encrypted, the password is its passphrase
private_key---Path to a private key file on the Zato server's filesystem, e.g. /keys/id_ed25519 - the file is provided when the Zato container or server starts, typically through a mounted directory. If it is not given, system-level keys from ~/.ssh are used.
strict_host_key_checking---Default is true, meaning the remote server's host key must already exist in known_hosts and connections to servers with unknown or changed keys are rejected. If false, keys of previously unknown hosts are accepted and recorded on first connection, while changed keys of known hosts are still rejected.
ignore_host_key_changes---Default is false. If true, any host key is accepted, known or changed, overriding strict_host_key_checking - meant for test servers and containers that regenerate their keys, never for production systems.
should_store_content---Default is false. If true, the audit log keeps the bytes of each transferred file, in addition to the always-recorded metadata.
is_active---Whether the connection is active (default is true)
sftp:
  - name: enmasse.sftp.1
    address: sftp.example.com:22
    username: enmasse
    password: Zato_Enmasse_Env.Enmasse_SFTP_Password
    private_key: /keys/id_ed25519
    strict_host_key_checking: true

An SFTP connection may also include a schedules list, each entry watching a directory and invoking a service once per file - see file transfer in enmasse for its fields, and the file transfer chapter for everything else.

Confluence

Key: confluence

NameRequiredDescription
nameYesUnique name of the connection
addressYesURL of the Confluence instance, e.g. https://example.atlassian.net
usernameYesUsername or email address
password---API token or password - can be set via an environment variable
api_version---Confluence API version (default is v1)
is_active---Whether the connection is active (default is true)
confluence:
  - name: enmasse.confluence.1
    address: https://example.atlassian.net
    username: api_user@example.com
    password: Zato_Enmasse_Env.ConfluenceAPIToken

For calling external APIs in general, see calling external REST APIs.

Jira

Key: jira

NameRequiredDescription
nameYesUnique name of the connection
addressYesURL of the Jira instance, e.g. https://example.atlassian.net
usernameYesUsername or email address
password---API token or password - can be set via an environment variable
api_version---Jira API version (default is v1)
is_active---Whether the connection is active (default is true)
jira:
  - name: enmasse.jira.1
    address: https://example.atlassian.net
    username: enmasse@example.com
    password: Zato_Enmasse_Env.JiraAPIToken

Practical examples are available in the Jira integration examples chapter.

Microsoft 365

Key: microsoft_cloud

NameRequiredDescription
nameYesUnique name of the connection
client_idYesAzure application (client) ID
tenant_idYesAzure tenant ID
secret_valueYesClient secret - can be set via an environment variable
scopes---Space-separated list of OAuth scopes
is_active---Whether the connection is active (default is true)
microsoft_cloud:
  - name: enmasse.cloud.microsoft365.1
    client_id: 12345678-1234-1234-1234-123456789abc
    tenant_id: 87654321-4321-4321-4321-cba987654321
    secret_value: Zato_Enmasse_Env.Microsoft365SecretValue
    scopes: Mail.Read Mail.Send

Microsoft 365 IMAP connections are covered in the Python IMAP email guide.

Microsoft Teams

Key: microsoft_teams

NameRequiredDescription
nameYesUnique name of the connection
client_idYesAzure application (client) ID
tenant_idYesAzure tenant ID
secret_valueYesClient secret - can be set via an environment variable
scopes---Space-separated list of OAuth scopes
is_active---Whether the connection is active (default is true)
microsoft_teams:
  - name: enmasse.chat.microsoft-teams.1
    client_id: 45678901-4567-4567-4567-4567890abcde
    tenant_id: 87654321-7654-7654-7654-fedcba987654
    secret_value: Zato_Enmasse_Env.MicrosoftTeamsSecretValue
    scopes: https://graph.microsoft.com/.default

Code examples are in the Microsoft Teams chapter.

Slack

Key: slack

NameRequiredDescription
nameYesUnique name of the connection
tokenYesBot token - can be set via an environment variable
is_active---Whether the connection is active (default is true)
slack:
  - name: enmasse.chat.slack.1
    token: Zato_Enmasse_Env.SlackToken

Code examples are in the Slack chapter.

Odoo

Key: odoo

NameRequiredDescription
nameYesUnique name of the connection
hostYesOdoo server host
userYesOdoo username
databaseYesName of the Odoo database
port---Odoo server port (default is 8069)
password---Password - can be set via an environment variable
protocol---Protocol to use (default is jsonrpc)
pool_size---Size of the connection pool (default is 10)
is_active---Whether the connection is active (default is true)
odoo:
  - name: enmasse.odoo.1
    host: odoo.example.com
    port: 8069
    user: admin
    password: Zato_Enmasse_Env.OdooPassword
    database: enmasse_db

Code examples are in the Python Odoo integrations chapter.

ElasticSearch

Key: elastic_search

NameRequiredDescription
nameYesUnique name of the connection
address_listYesFull URL or list of URLs of ElasticSearch servers, e.g. https://elasticsearch:9200 - the scheme of each URL decides whether TLS is used
username---Username to authenticate with, leave out if the server does not require authentication
password---Password matching the username
timeout---Request timeout in seconds (default is 90)
is_tls_validation_enabled---Whether to verify the server's TLS certificate (default is true)
tls_ca_certs_file---Path to a PEM file with CA certificates to verify the server's certificate against
tls_cert_key_file---Path to a PEM file with a combined client certificate and private key, for mutual TLS
is_active---Whether the connection is active (default is true)
elastic_search:
  - name: enmasse.elastic.1
    address_list:
      - http://elasticsearch:9200
    timeout: 60

Usage examples: Python ElasticSearch

LLM connections

Key: llm

NameRequiredDescription
nameYesUnique name of the connection - services look it up with self.llm
modelYesModel name from the catalog, e.g. Sonnet 5, or a wire id entered by hand
addressYesBase URL of the API to call, e.g. https://api.openai.com/v1
secret---API key - can be set via an environment variable, self-hosted endpoints may not need one
timeout---How many seconds to wait for the provider's response (default is 60)
max_tokens---The most tokens the model may generate per reply (default is 1024)
max_history_turns---How many past chat turns are sent to the provider (default is 20)
chat_expiry---How many seconds a chat's history is kept after its last message (default is 86400)
is_active---Whether the connection can be used (default is true)
llm:

  - name: My OpenAI
    model: gpt-4o-mini
    address: https://api.openai.com/v1
    secret: Zato_Enmasse_Env.My_OpenAI_API_Key
    timeout: 30

  - name: My Claude
    model: Sonnet 5
    address: https://api.anthropic.com
    secret: Zato_Enmasse_Env.My_Claude_API_Key

The AI enmasse chapter covers LLM connections in more detail.

Security groups

Key: groups

Each entry defines a named group of security definitions. Groups can then be referenced from REST channels to control access.

NameRequiredDescription
nameYesUnique name of the group
members---List of security definition names that belong to this group
quota_tier---Name of a quota tier that every member of the group follows, unless a member has its own rules or its own tier
groups:
  - name: enmasse.group.1
    members:
      - enmasse.basic_auth.1
      - enmasse.basic_auth.2
      - enmasse.apikey.1

  - name: enmasse.group.2
    quota_tier: tier.gold
    members:
      - enmasse.apikey.1
      - enmasse.apikey.2

Groups are used together with REST channels - see REST channels for details.

MCP gateways

Key: mcp_gateway

Each entry defines an MCP gateway that exposes services as tools for AI agents.

NameRequiredDescription
nameYesUnique name of the gateway
url_path---URL path the MCP endpoint is exposed under, e.g. /mcp/billing (default is /mcp)
services---List of service names exposed as tools
security_groups---List of security group names whose members may call the gateway - see MCP gateway security
is_active---Whether the gateway accepts requests (default is true)
is_audit_log_active---Whether the MCP audit log records the gateway's traffic (default is false when absent)
skills---List of skills served as MCP prompts
session_ttl---Idle session TTL in seconds - 0, the default, keeps the built-in 30 minutes
invoke_timeout---How many seconds one tools/call invocation may run for - 0, the default, keeps the built-in 90
validate_input---Whether tool arguments are validated against each tool's schema (default is false)
allow_agent_filters---Whether agents may attach per-call JSONata response filters (default is false)
should_delete---An entry with should_delete: true removes the gateway instead of creating or updating it

A gateway also accepts the response controls family - the max_response_size, size_cap_mode, min_size_threshold and characters_per_token response shaping fields plus all the safeguards_* fields for compaction, PII removal, secrets removal and content safety. The AI enmasse chapter lists every one of them with its default.

mcp_gateway:
  - name: enmasse.mcp.gateway.1
    is_active: true
    is_audit_log_active: true
    url_path: /mcp/enmasse-1
    services:
      - crm.get-customer
      - crm.update-customer
    security_groups:
      - enmasse.group.1
    validate_input: true
    max_response_size: 2000
    safeguards_pii_enabled: true

Rule engine API

Key: rule_engine_api

Each entry exposes rule engine rulesets over a REST endpoint.

NameRequiredDescription
nameYesUnique name of the API endpoint
url_path---URL path the endpoint is exposed under (default is /api/rules)
rulesets---List of ruleset names the endpoint serves
security_groups---List of security group names whose members may call the endpoint
is_active---Whether the endpoint accepts requests (default is true)
rule_engine_api:
  - name: enmasse.rules.1
    url_path: /api/rules/pricing
    rulesets:
      - pricing
      - discounts
    security_groups:
      - enmasse.group.1

OpenAPI channels

Key: channel_openapi

NameRequiredDescription
nameYesUnique name of the OpenAPI channel
url_pathYesURL path where the OpenAPI specification is served, e.g. /openapi/my-api
rest_channel_list---List of REST channel names to include in the specification
is_active---Whether the channel is active (default is true)
channel_openapi:
  - name: enmasse.channel.openapi.1
    url_path: /openapi/enmasse-1
    rest_channel_list:
      - enmasse.channel.rest.1
      - enmasse.channel.rest.2

The OpenAPI specifications chapter explains how OpenAPI channels work.

HL7 MLLP channels

Key: channel_mllp

NameRequiredDescription
nameYesUnique channel name
serviceYesService invoked for each incoming message
is_active---Whether the channel accepts connections (default true)
should_validate---Validate parsed messages against the HL7 schema (default false)
should_parse_on_input---Parse raw ER7 into structured objects before the service is invoked (default true)
should_log_messages---Log incoming messages (default false)
should_return_errors---Include error details in NAK responses (default false)
normalize_line_endings---Convert CRLF/LF to CR (default true)
force_standard_delimiters---Rewrite non-standard delimiters to ^~\& (default true)
restore_truncated_msh---Pad short MSH segments (default true)
split_concatenated_messages---Split multi-MSH payloads into separate messages (default true)
use_msh18_encoding---Use MSH-18 for character encoding (default true)
normalize_obx2_value_type---Fill empty OBX-2 with ST (default true)
replace_invalid_obx2_value_type---Replace invalid OBX-2 with ST (default true)
normalize_invalid_escape_sequences---Strip unmatched escapes (default true)
normalize_obx8_abnormal_flags---Clear OBX-8 literal null (default true)
normalize_quadruple_quoted_empty---Strip multi-quote sequences (default true)
allow_short_encoding_characters---Pad short MSH-2 (default true)
fix_off_by_one_field_index---Remove spurious leading field (default false)
msh9_message_type---Routing filter on MSH-9.1
msh9_trigger_event---Routing filter on MSH-9.2
default_character_encoding---Default encoding (default utf-8)
dedup_ttl_value---Deduplication window value
dedup_ttl_unit---Deduplication window unit (minutes, hours, or days)
is_audit_log_active---Whether the channel's traffic goes to the audit log (default true)
channel_mllp:

  - name: enmasse.hl7.lab-results
    service: hl7.process-lab-results
    should_validate: true
    normalize_line_endings: true
    msh9_message_type: ORU

  - name: enmasse.hl7.admissions
    service: hl7.process-admissions
    msh9_message_type: ADT
    msh9_trigger_event: A01
    dedup_ttl_value: 60
    dedup_ttl_unit: minutes

  - name: enmasse.hl7.default
    service: hl7.catch-all
    is_default: true
    fix_off_by_one_field_index: true

For the full description of every field, see the MLLP channel configuration reference.

HL7 MLLP outgoing connections

Key: outgoing_mllp

NameRequiredDescription
nameYesUnique connection name - services use it with self.mllp
addressYesRemote endpoint as host:port, e.g. 10.20.30.40:2575
is_active---Whether the connection can be used (default true)
pool_size---How many connections the pool keeps open (default 10)
start_seq---MLLP frame start bytes in hex (default 0b)
end_seq---MLLP frame end bytes in hex (default 1c 0d)
recv_timeout---How long to wait for the acknowledgment, in milliseconds (default 250)
max_msg_size---The biggest acknowledgment accepted, in bytes (default 2097152, i.e. 2 MB)
read_buffer_size---Socket read buffer, in bytes (default 32768)
max_wait_time---Default timeout for the dashboard invoke screen, in seconds (default 5)
max_retries---How many times a failed send is retried (default 5)
backoff_base_seconds---Delay before the first retry, in seconds, doubling with each attempt (default 1)
backoff_cap_seconds---The longest delay between retries, in seconds (default 300)
backoff_jitter_percent---Random percentage applied to each retry delay (default 10)
circuit_breaker_threshold_percent---Failure percentage within the window that pauses sending (default 50)
circuit_breaker_window_seconds---Length of the rolling window the failure percentage is computed over, in seconds (default 60)
circuit_breaker_reset_seconds---How long sending stays paused before a trial message goes through, in seconds (default 60)
should_log_messages---Log outgoing traffic (default false)
logging_level---Log level for this connection (default INFO)
is_audit_log_active---Whether the connection's traffic goes to the audit log (default true)
tls_ca_path---Path to the CA bundle used to verify the remote server - setting it turns TLS on
tls_cert_path---Path to the client certificate, for mTLS
tls_key_path---Path to the client private key, for mTLS
outgoing_mllp:

  - name: adt-outbound
    address: 10.20.30.40:2575

  - name: lab-outbound
    address: lab.example.com:2575
    recv_timeout: 500
    tls_ca_path: /path/to/ca.pem
    tls_cert_path: /path/to/client.pem
    tls_key_path: /path/to/client.key

The Sending HL7v2 over MLLP chapter explains how outgoing connections work.

HL7 FHIR outgoing connections

Key: outgoing_fhir

NameRequiredDescription
nameYesUnique connection name - services use it with self.fhir
addressYesURL of the FHIR server, including its base path, e.g. https://fhir.example.com/r4
security---Name of a Basic Auth or OAuth security definition the requests go out with - without one they are unauthenticated
is_active---Whether the connection can be used (default true)
pool_size---How many clients to keep open to the server (default 10)
is_audit_log_active---Whether the connection's traffic goes to the audit log (default true)
outgoing_fhir:

  - name: FHIR.Sample
    address: https://fhir.example.com/r4

  - name: FHIR.Secured
    address: https://fhir.partner.example.com/r4
    security: enmasse.basic_auth.1
    pool_size: 20

The HL7 FHIR integrations chapter explains how outgoing FHIR connections are used from a service.

Kafka channels

Key: channel_kafka

NameRequiredDescription
nameYesUnique name of the Kafka channel
addressYesKafka broker address, e.g. localhost:9092
topic---Kafka topic to consume from
group_id---Consumer group ID
service---Name of the Zato service invoked for each message
is_active---Whether the channel is active (default is true)
ssl---Whether to use SSL (default is false)
ssl_ca_file---Path to the CA certificate file
ssl_cert_file---Path to the client certificate file
ssl_key_file---Path to the client key file
channel_kafka:
  - name: enmasse.kafka.channel.1
    address: localhost:9092
    topic: incoming-events
    group_id: zato-consumers
    service: kafka.process-event

  - name: enmasse.kafka.channel.2
    address: broker1:9093
    topic: secure-events
    group_id: zato-secure
    service: kafka.process-secure
    ssl: true
    ssl_ca_file: /path/to/ca.pem
    ssl_cert_file: /path/to/cert.pem
    ssl_key_file: /path/to/key.pem

See Kafka examples for Python code.

Kafka outgoing connections

Key: outgoing_kafka

NameRequiredDescription
nameYesUnique name of the outgoing connection
addressYesKafka broker address, e.g. localhost:9092
topic---Default Kafka topic to publish to
is_active---Whether the connection is active (default is true)
ssl---Whether to use SSL (default is false)
ssl_ca_file---Path to the CA certificate file
ssl_cert_file---Path to the client certificate file
ssl_key_file---Path to the client key file
outgoing_kafka:
  - name: enmasse.kafka.outgoing.1
    address: localhost:9092
    topic: outgoing-events

  - name: enmasse.kafka.outgoing.2
    address: broker2:9093
    topic: secure-outgoing
    ssl: true
    ssl_ca_file: /path/to/ca.pem
    ssl_cert_file: /path/to/cert.pem
    ssl_key_file: /path/to/key.pem

See Kafka examples for Python code.

IBM MQ channels

Key: channel_ibm_mq

NameRequiredDescription
nameYesUnique name of the channel
addressYesAddress of the queue manager as host:port, e.g. mq.example.com:1414
queue_manager---Name of the queue manager to connect to
mq_channel_name---Name of the MQ server-connection channel, e.g. DEV.APP.SVRCONN
queue---Queue to consume messages from
service---Name of the Zato service invoked for each message
username---Username the channel authenticates with
password---Password - can be set via an environment variable
remove_jms_headers---Whether JMS headers are stripped from incoming messages (default is true)
ssl---Whether to connect over TLS (default is false)
cipher_spec---The MQ CipherSpec to use when TLS is on, e.g. TLS_RSA_WITH_AES_256_CBC_SHA256
ssl_ca_file---Path to a PEM file with the CA certificates that signed the queue manager's certificate
ssl_cert_file---Path to the client certificate, for mutual TLS
ssl_key_file---Path to the client private key, for mutual TLS
is_active---Whether the channel is active (default is true)
channel_ibm_mq:
  - name: enmasse.ibm-mq.channel.1
    address: mq.example.com:1414
    queue_manager: QM1
    mq_channel_name: DEV.APP.SVRCONN
    queue: ORDERS.IN
    service: orders.process-order
    username: app
    password: Zato_Enmasse_Env.IBMMQPassword

IBM MQ outgoing connections

Key: outgoing_ibm_mq

NameRequiredDescription
nameYesUnique name of the connection
addressYesAddress of the queue manager as host:port, e.g. mq.example.com:1414
queue_manager---Name of the queue manager to connect to
mq_channel_name---Name of the MQ server-connection channel, e.g. DEV.APP.SVRCONN
queue---Default queue to send messages to
username---Username the connection authenticates with
password---Password - can be set via an environment variable
ssl---Whether to connect over TLS (default is false)
cipher_spec---The MQ CipherSpec to use when TLS is on
ssl_ca_file---Path to a PEM file with the CA certificates that signed the queue manager's certificate
ssl_cert_file---Path to the client certificate, for mutual TLS
ssl_key_file---Path to the client private key, for mutual TLS
is_active---Whether the connection is active (default is true)
outgoing_ibm_mq:
  - name: enmasse.ibm-mq.outgoing.1
    address: mq.example.com:1414
    queue_manager: QM1
    mq_channel_name: DEV.APP.SVRCONN
    queue: ORDERS.OUT
    username: app
    password: Zato_Enmasse_Env.IBMMQPassword

See IBM MQ examples for Python code.

AMQP channels

Key: channel_amqp

NameRequiredDescription
nameYesUnique name of the AMQP channel
addressYesAddress of the broker as host:port, e.g. localhost:5672
queueYesQueue to consume messages from
serviceYesName of the Zato service invoked for each message
username---Username the channel authenticates with
password---Password for the username above
is_active---Whether the channel is active (default is true)
consumer_tag_prefix---Prefix of the consumer tag the channel identifies itself with
pool_size---How many connections to the broker to keep open (default is 10)
ack_mode---What to tell the broker about each message, ack or reject (default is ack)
prefetch_count---How many messages to prefetch, 0 means no limit (default is 0)
data_format---Format of incoming message bodies, e.g. json
channel_amqp:
  - name: enmasse.amqp.channel.1
    address: localhost:5672
    queue: orders
    service: orders.process-order
    username: zato
    password: Zato_Enmasse_Env.AMQPPassword

  - name: enmasse.amqp.channel.2
    address: broker1:5672
    queue: invoices
    service: invoices.process-invoice
    username: zato
    password: Zato_Enmasse_Env.AMQPPassword
    data_format: json
    pool_size: 20

See AMQP examples for Python code.

AMQP outgoing connections

Key: outgoing_amqp

NameRequiredDescription
nameYesUnique name of the outgoing connection
addressYesAddress of the broker as host:port, e.g. localhost:5672
username---Username the connection authenticates with
password---Password for the username above
is_active---Whether the connection is active (default is true)
delivery_mode---persistent or non_persistent (default is persistent)
priority---Priority stamped on published messages, 0-9 (default is 5)
content_type---MIME type stamped on published messages, e.g. application/json
content_encoding---Content encoding property of published messages, e.g. utf-8
expiration---Message expiration in milliseconds
pool_size---How many connections to the broker to keep open (default is 10)
user_id---User ID stamped on published messages
app_id---Application ID stamped on published messages
outgoing_amqp:
  - name: enmasse.amqp.outgoing.1
    address: localhost:5672
    username: zato
    password: Zato_Enmasse_Env.AMQPPassword

  - name: enmasse.amqp.outgoing.2
    address: broker2:5672
    username: zato
    password: Zato_Enmasse_Env.AMQPPassword
    content_type: application/json
    priority: 7

See AMQP examples for Python code.

Azure Service Bus channels

Key: channel_azure_service_bus

Azure Service Bus channels accept the same fields as AMQP channels - the address is your namespace hostname with port 5671 and the username is your Shared Access Policy name.

channel_azure_service_bus:
  - name: enmasse.azure.channel.1
    address: mycompany-dev.servicebus.windows.net:5671
    queue: flight-updates
    service: flights.process-update
    username: MyPolicyName
    password: Zato_Enmasse_Env.AzureServiceBusPassword

See Azure Service Bus examples for Python code.

Azure Service Bus outgoing connections

Key: outgoing_azure_service_bus

Azure Service Bus outgoing connections accept the same fields as AMQP outgoing connections - the address is your namespace hostname with port 5671 and the username is your Shared Access Policy name.

outgoing_azure_service_bus:
  - name: enmasse.azure.outgoing.1
    address: mycompany-dev.servicebus.windows.net:5671
    username: MyPolicyName
    password: Zato_Enmasse_Env.AzureServiceBusPassword

See Azure Service Bus examples for Python code.

GraphQL outgoing connections

Key: outgoing_graphql

NameRequiredDescription
nameYesUnique name of the outgoing connection
addressYesURL of the GraphQL endpoint, e.g. https://graph.microsoft.com/v1.0
is_active---Whether the connection is active (default is true)
security---Name of a security definition (Basic Auth, API key or OAuth)
default_query_timeout---Query timeout in seconds (default is 60)
extra---JSON object of custom HTTP headers, e.g. {"X-Tenant": "acme"}
outgoing_graphql:
  - name: ms365-graph
    address: https://graph.microsoft.com/v1.0
    security: ms365-oauth
    default_query_timeout: 30

  - name: github-api
    address: https://api.github.com/graphql
    security: github-token
    default_query_timeout: 60

See GraphQL examples for Python code.

gRPC outgoing connections

Key: outgoing_grpc

NameRequiredDescription
nameYesUnique name of the outgoing connection
addressYesHost and port of the gRPC server, e.g. billing.example.com:50051
is_active---Whether the connection is active (default is true)
security---Name of a security definition (Basic Auth, API key or OAuth) whose credentials are sent as call metadata
is_tls---Whether to connect over TLS (default is true)
tls_ca_certs_file---Path to a PEM file with CA certificates to verify the server's certificate against
proto_path---Path to a .proto file on the server - client code is generated out of it automatically
stub_module---Alternatively, the Python module with a pre-generated stub, e.g. billing_pb2_grpc
stub_class---Name of the stub class in stub_module, needed only when the module has more than one
ping_timeout---How many seconds to wait for the server when pinging (default is 10)
max_send_message_size---The biggest message that can be sent, in bytes (default is 104857600)
max_recv_message_size---The biggest message that can be received, in bytes (default is 104857600)
outgoing_grpc:
  - name: billing
    address: billing.example.com:50051
    security: billing-api-key
    proto_path: /opt/zato/proto/billing.proto

  - name: inventory
    address: inventory.internal:50051
    is_tls: false
    stub_module: inventory_pb2_grpc

See gRPC examples for Python code.

Pub/sub topics

Key: pubsub_topic

NameRequiredDescription
nameYesUnique name of the topic
description---Optional description of the topic
is_active---Whether the topic is active (default is true)
is_audit_log_active---Whether the topic's traffic goes to the audit log (default is true, exported only when false)
pubsub_topic:
  - name: enmasse.topic.1
    description: Optional description for topic 1
  - name: enmasse.topic.2

Topics are part of the pub/sub system - the pub/sub API page has more.

Pub/sub permissions

Key: pubsub_permission

NameRequiredDescription
securityYesName of the security definition to grant permissions to
pub---List of topic name patterns the security definition is allowed to publish to
sub---List of topic name patterns the security definition is allowed to subscribe to
pubsub_permission:
  - security: enmasse.basic_auth.1
    pub:
      - enmasse.topic.1
      - enmasse.topic.2
    sub:
      - enmasse.topic.2
      - enmasse.topic.3

  - security: enmasse.basic_auth.2
    pub:
      - enmasse.topic.*
    sub:
      - enmasse.#

For background on pub/sub security, visit pub/sub security.

Pub/sub subscriptions

Key: pubsub_subscription

NameRequiredDescription
securityYesName of the security definition that owns the subscription
delivery_typeYesHow messages are delivered - either pull or push
topic_listYesList of topic names to subscribe to
push_rest_endpoint---Name of an outgoing REST connection to push messages to (required when delivery_type is push and pushing to a REST endpoint)
push_service---Name of a Zato service to push messages to (required when delivery_type is push and pushing to a service)
max_retry_time---How long to retry delivery before giving up, e.g. 365d, 48h or 30m
is_delivery_active---Whether delivery is active (default is true)
pubsub_subscription:
  - security: enmasse.basic_auth.1
    delivery_type: pull
    max_retry_time: 365d
    topic_list:
      - enmasse.topic.1
      - enmasse.topic.2

  - security: enmasse.basic_auth.2
    delivery_type: push
    push_rest_endpoint: enmasse.outgoing.rest.1
    max_retry_time: 48h
    topic_list:
      - enmasse.topic.1

  - security: enmasse.basic_auth.3
    delivery_type: push
    push_service: demo.input-logger
    max_retry_time: 30m
    topic_list:
      - enmasse.topic.3

Endpoints and subscriptions are explained in the pub/sub endpoints chapter.

Custom connectors

Key: custom_*

Connection types built with the Connector SDK get a top-level key of their own, named after the type - a connector of type crm is configured under custom_crm.

NameRequiredDescription
nameYesUnique name of the connection
is_active---Whether the connection can be used (default is true)

Every other field is whatever the connector class declares - the fields are written to the YAML and read back exactly as the connector defines them.

custom_crm:
  - name: enmasse.custom.crm.1
    address: https://crm.example.com
    username: api
    api_key: Zato_Enmasse_Env.CRMAPIKey

Alert rules

Key: alert_rules

Each entry configures the alert rules of one connection type. The values are the same numbers, in the same units, that the alert rules config screen shows - percentages as whole numbers, latencies in milliseconds. Importing an entry updates the live rules in place, so an import that changes nothing is a no-op.

NameRequiredDescription
typeYesConnection type the entry configures - one of rest, sql, llm, mcp, microsoft, email, odoo, file_transfer, scheduler, channels or common
is_active---Whether the type's alert rules are active as a whole
consecutive_failures---How many consecutive failures mean a connection is down (all types except scheduler, channels and common)
error_rate---Error share of recent traffic, in percent, that raises an alert (all types except common)
alert_threshold---Error share, in percent, above which an alert is diagnosed (rest, sql, mcp, email and scheduler)
max_latency---Average response time, in milliseconds, above which responses count as slow (rest only)
use_llm---Whether alerts above the alert threshold are diagnosed by the LLM (all types except channels and common)
max_query_time---Average query time, in milliseconds, above which queries count as slow (sql only)
warning_latency---Average completion time, in milliseconds, that raises a warning (llm only)
critical_latency---Average completion time, in milliseconds, that raises a critical alert (llm only)
max_tool_call_time---Average tool call time, in milliseconds, above which calls count as slow (mcp only)
health_alerts---Whether Microsoft service health alerts are raised (microsoft only)
max_call_time---Average call time, in milliseconds, above which calls count as slow (microsoft and odoo)
auth_failures---How many authentication failures raise an alert (email and odoo)
warning_failures---How many transfer failures raise a warning (file_transfer only)
critical_failures---How many transfer failures raise a critical alert (file_transfer only)
test_transfers---Whether periodic test transfers run to confirm connections work (file_transfer only)
arrival_overdue---How many arrival windows may pass without a file before an alert (file_transfer only)
overdue_multiplier---How many missed intervals mean a job's run was missed (scheduler only)
start_delay---Start delay, in milliseconds, above which a job's start counts as delayed (scheduler only)
certificate_warning---How many days before a certificate expires an alert is raised (common only)
outstanding_backlog---How many outstanding messages raise an alert (common only)
feed_silence---How many seconds of silence from a feed raise an alert (common only)
alert_rules:
  - type: rest
    is_active: true
    consecutive_failures: 3
    error_rate: 10
    alert_threshold: 25
    max_latency: 5000
    use_llm: true

  - type: file_transfer
    is_active: true
    consecutive_failures: 3
    warning_failures: 10
    critical_failures: 20
    test_transfers: false

Alert notifications

Key: alert_notifications

One mapping, not a list - the default notification targets alerts go to when a rule names none of its own. Email, Slack and Teams deliver through the connections named default.alerts.notifications - these keys hold the addressing only.

NameRequiredDescription
webhook_url---Webhook alerts are delivered to, e.g. a Jira automation webhook
email_to---Addresses alert emails go to, comma-separated
email_from---Address alert emails are sent from
dashboard_url---Dashboard address the links in notifications point to
alert_notifications:
  webhook_url: https://example.atlassian.net/automation/webhooks/abc
  email_to: ops@example.com
  email_from: zato@example.com
  dashboard_url: https://dashboard.example.com

Audit retention policies

Key: audit_retention

Named audit log retention policies. Each policy says how long events and their payloads are kept and, optionally, where they are archived before deletion.

NameRequiredDescription
nameYesUnique name of the policy
retention_daysYesHow many days events are kept
content_retention_days---How many days payloads are kept - 0, the default, means payloads live exactly as long as their events
archive_dir---Directory events are archived to before they are deleted
audit_retention:
  - name: enmasse.retention.1
    retention_days: 90
    content_retention_days: 7
    archive_dir: /opt/zato/audit-archive

Attribute extraction rules

Key: audit_extraction

Named sets of rules describing which searchable attributes to pull out of the messages the audit log records - an order ID in a JSON body, a correlation header, a match of a regular expression.

NameRequiredDescription
nameYesUnique name of the rule set, after the channel or connection it applies to
source---The audit source the set applies to, e.g. rest-channel
rulesYesList of extraction rules - each with attr_name, rule_type and expression

Each rule contains:

NameRequiredDescription
attr_nameYesName of the attribute the rule extracts, as it appears in searches
rule_typeYesHow the value is extracted - one of json-path, xpath, header or regex
expressionYesThe path, header name or regular expression to extract with
audit_extraction:
  - name: crm.customer.get
    source: rest-channel
    rules:
      - attr_name: order_id
        rule_type: json-path
        expression: order.id
      - attr_name: correlation_id
        rule_type: header
        expression: X-Correlation-Id

Read more

Learn more