Skip to content

Config schema

Full dotted-path keys, flattened from the per-struct FieldDoc tables.

Field Type Required Default Description
maps object no Named, reusable key→value tables. Each entry: map_name -> { key: value }. Referenced by REMAP (whole-value lookup) / REPLACE (substring) via their 'name' argument. A template may also define a same-named maps block that overrides a global entry.
maps.* object no One named map. Keys and values are arbitrary strings; key order is preserved (REPLACE applies pairs in declaration order).
conversion_templates object yes Map of template_id -> broker config. Each key is a unique template identifier used with --template flag. When bxp-cli runs without --template, all templates execute in declaration order.
conversion_templates.* object no One conversion template — see conversion_templates.*.* fields for contents.
conversion_templates..input_schema. expression yes Expression evaluated per input row. Result stored in the $variable. Use [ColumnName] to reference input CSV columns.
conversion_templates..output_schema. string yes $variable whose evaluated value fills this output column. Must start with $.
conversion_templates..row_rules. object no One row rule. Schema-ordered children: when (condition), rows (output rows produced when matched).
conversion_templates..row_rules..rows.* object no One output row. Map of $variable -> expression overriding the value from input_schema. Empty object {} = take all values verbatim from input_schema.
conversion_templates.*.pre_pass.when expression yes Legacy single-block form. Filter — only rows matching this condition are added to the lookup table.
conversion_templates.*.pre_pass.key expression yes Legacy single-block form. Expression evaluated per row to produce the lookup key string.
conversion_templates.*.pre_pass.values object yes Legacy single-block form. Map of field_name -> expression. Each value is evaluated per pre-pass row and stored for retrieval via LOOKUP(key, 'field_name'). Field names have no $ prefix.
conversion_templates..pre_pass.values. expression yes Expression evaluated per pre-pass row. Result stored under the field name for LOOKUP retrieval.
conversion_templates..pre_pass. object no Named pre_pass block. The map key is the block name (typed by the user in the GUI's Add-Child dialog or written directly in JSON5) and becomes part of the LOOKUP namespace; different names cannot collide. The insert_template below is the inner { when, key, values } body — the outer name1: { ... } wrapper is supplied by whatever creates the entry (free-form key input in the GUI; verbatim JSON5 syntax for hand-edited configs).
conversion_templates..pre_pass..values.* expression yes Expression evaluated per pre-pass row. Result stored under the field name for LOOKUP retrieval.
conversion_templates.*.description string no Optional one-line summary of what this template converts, e.g. "Trading 212 -> Wealthfolio". Never read by the engine; returned by template listings so a person or an agent can pick between templates.
conversion_templates.*.data_dir string yes Path to input files, relative to this config file. e.g. "my_source", "../data/exports", or an absolute path.
conversion_templates.*.file_type_in string no csv Input file format. "json" reads an array-of-objects. One of: csv, json.
conversion_templates.*.file_type_out string no csv Output file format. "json" writes an array-of-objects. One of: csv, json.
conversion_templates.*.file_pattern_in string yes Literal suffix filter for input files in data_dir — NOT a glob. e.g. ".csv" (all), "_cash.csv" (specific suffix). A file matches when its name ends with this exact text; "*" has no special meaning. The matched suffix is also stripped to form the output filename (with file_pattern_out).
conversion_templates.*.file_pattern_out string yes Output filename suffix. Replaces file_pattern_in in the output filename.
conversion_templates.*.csv_header_line number no 1 1-based line number of the CSV header row (default 1). 0 = headerless input: no line is treated as headers, the first line is data, and columns are reachable only by position via FIELDS(n). N>1 skips N-1 preamble lines. CSV input only.
conversion_templates.*.csv_delimiter_in string no , Input CSV field separator (single character). One of: ,, ;, , |.
conversion_templates.*.csv_delimiter_out string no , Output CSV field separator (single character). One of: ,, ;, , |.
conversion_templates.*.csv_decimal_separator_in string no . Decimal separator in input numeric fields. Set to "," for European-style CSV. Must differ from csv_delimiter_in. One of: ., ,.
conversion_templates.*.csv_decimal_separator_out string no . Decimal separator written in numeric output fields. One of: ., ,.
conversion_templates.*.csv_text_quote_in string no double Input CSV text quoting style. Use ''' in expressions for a literal single-quote. One of: none, single, double.
conversion_templates.*.csv_text_quote_out string no none Output CSV text quoting style. One of: none, single, double.
conversion_templates.*.csv_input_encoding string no utf-8 Character encoding of the input CSV file. Transcoded to UTF-8 on read. Use for legacy non-UTF-8 exports (e.g. "windows-1250" for Czech Excel). CSV only — JSON/xlsx are always UTF-8. One of: utf-8, windows-1250, windows-1252, iso-8859-1, iso-8859-2, iso-8859-15.
conversion_templates.*.csv_output_encoding string no utf-8 Character encoding of the output CSV file. UTF-8 is transcoded to this code page on write; characters with no equivalent become '?'. CSV only. One of: utf-8, windows-1250, windows-1252, iso-8859-1, iso-8859-2, iso-8859-15.
conversion_templates.*.maps object no Template-local named key→value maps: { map_name: { key: value } }. Merged over the top-level maps registry (this template's entry wins on a name collision). Referenced by REMAP / REPLACE via their 'name' argument.
conversion_templates.*.date_filter_from_filename boolean no false When true, rows whose $date falls outside the date range encoded in the filename (YYYY-MM-DD_YYYY-MM-DD) are silently skipped. Requires $date in input_schema. A row whose $date is too short to compare (an empty one, typically a [Column] the file does not have) is a fatal error rather than a pass-through: the filter was asked for and cannot be applied to that row. Filenames carrying no range are unfiltered as before.
conversion_templates.*.combined_output boolean no false When true, all input files in data_dir additionally write their rows to one merged output file '1-<template_id>-combined.csvx', alongside the normal per-input outputs (it is an extra file, not a replacement). Files are processed in alphabetical order so combined row order is deterministic.
conversion_templates.*.row_rules_debug_missing boolean no false When true, rows that match no row_rules entry are printed in --debug output.
conversion_templates.*.xlsx_sheet object no When set, the xlsx file in data_dir is converted to an intermediate CSV before the normal CSV processing loop.
conversion_templates.*.zip_input object no When set, every member of each *.zip in data_dir whose name ends with entry_pattern is streamed out to a flat intermediate CSV (N per zip) before the normal CSV loop. For zipped CSV exports (e.g. RÚIAN address registry).
conversion_templates.*.pre_pass object no First-pass lookup table(s) built before the main loop. Two accepted shapes: legacy single block { when, key, values } (detected by the presence of when) — accessed via 2-arg LOOKUP(key, 'field'); or named blocks { name1: { when, key, values }, ... } — each block is its own namespace, accessed via 3-arg LOOKUP('name', key, 'field').
conversion_templates.*.input_schema object yes Map of $variable -> expression. Each expression is evaluated per input row. Variables are referenced in output_schema and row_rules. Iteration order does not affect results.
conversion_templates.*.output_schema object yes Output CSV column headers mapped to $variable values. Insertion order determines column order in the output file.
conversion_templates.*.row_rules array no Ordered list of conditional routing rules. The first rule whose when matches produces the output rows; later rules are not evaluated. Rows matching no rule are silently skipped (or shown via row_rules_debug_missing). Omitting the key entirely is accepted by the loader, but then nothing matches and the template produces no output at all.
conversion_templates.*.xlsx_sheet.name string yes Sheet name as it appears in the xlsx workbook (e.g. "CASH OPERATION").
conversion_templates.*.xlsx_sheet.header_row number yes 1-based row number that contains the column headers within this sheet.
conversion_templates.*.xlsx_sheet.output_suffix string yes Appended before ".csv" in the intermediate filename (e.g. "_3"). Use "" for no suffix.
conversion_templates.*.zip_input.entry_pattern string no .csv Literal suffix filter for zip members to extract — NOT a glob. A member matches when its in-zip name ends with this exact text. Default ".csv".
conversion_templates.*.zip_input.dir_mode string no basename How a member's in-zip path becomes a flat output filename in data_dir (the CSV loop reads data_dir non-recursively). "basename" keeps the last path segment; "keep_path" replaces every '/' with path_separator (collision-safe). One of: basename, keep_path.
conversion_templates.*.zip_input.path_separator string no _ Replacement for '/' when dir_mode is "keep_path" (e.g. "CSV/x.csv" -> "CSV_x.csv"). Ignored for "basename".
conversion_templates..row_rules..when expression yes Condition expression. Rule applies when this evaluates to truthy (non-empty, non-zero, non-"false").
conversion_templates..row_rules..rows array yes Output rows produced when when matches. Each entry is an object overriding $variables; rows: [] silently skips the row, rows: [{}] emits one row using input_schema variables verbatim.
conversion_templates..pre_pass..when expression yes Filter — only rows matching this condition are added to the named lookup table.
conversion_templates..pre_pass..key expression yes Expression evaluated per row to produce the lookup key string for this named block.
conversion_templates..pre_pass..values object yes Map of field_name -> expression evaluated per pre-pass row, retrieved via 3-arg LOOKUP('name', key, 'field_name').