The format catalog
The catalog gives a read-only inventory of the formats the ingestion engine can parse. It is global-first and static: built-in parsers carry no tenant, so every authenticated caller sees the same response. The catalog uses a
region → family → variant tree that matches the canonical format descriptor axes.
XX for region-neutral formats. Even a single-canonical-layout family (for example camt) names its layout as the variant (camt053 above).
The catalog takes no path, query, or body parameters. The tenant has no effect on the built-in catalog.
Layout templates
When a file uses an operator- or brand-specific fixed-width layout that no built-in parser covers, register a layout template. A template namespaces a positional layout under the
{region, family, variant} axes. The parse path resolves it as an additive layout source for your tenant.
Every submission and edit runs through a well-formedness gate before storage. Overrun, overlap, missing-required fields, a zero-field record, or a mis-marked money column all reject with 422, and Matcher never stores that template.
Money third rail: a money column must declare
kind: "decimal". The submission gate rejects a money field that omits or mis-marks its kind. That field never reaches the parse path.Create a template
region: ISO alpha-2 region (uppercased) orXX.family: closed-enum format family the template namespaces under.variant: open operator/brand axis (must be non-blank).discriminatorStart/discriminatorLength: the byte range the parser reads to select a record type.records[]: each record type with its fixedwidth(bytes) and ordered positionalfields.fields[].kind:string,decimal(money/numeric verbatim token, parsed downstream), ordate.requiredFields: field names the variant must declare across its record types.
201 with the stored template, including its formatKey (for example br/cnab400/acme-cobranca), the discriminator, the full positional layout, and recordWidths.
List and get templates
Update and delete a template
PUT is a full replace, not a sparse patch. The byte-range invariants are whole-layout properties. The replacement runs through the same well-formedness gate the create path enforces. A failing layout rejects with 422, and the stored template stays unchanged.
204. A missing template returns 404. A format-key collision with another active template returns 409.

