Skip to content
Art2link ESB HomeDocumentationBlogContact
Updated August 1, 2026
Core concepts/Schemas

Schemas

An optional structural contract for messages, used at runtime to validate that a payload matches its declared message type.

Art2link ESB supports XSD for XML payloads and JSON Schema for JSON payloads. A schema does one job and only one job: when a message arrives carrying a message type that has an associated schema, the runtime validates the payload against that schema.

DOES Validate Compare payload to a structural contract at runtime DOES NOT Route Subscriptions match on the message type, not on the schema DOES NOT Map Maps are authored by hand; the schema is not a source DOES NOT Discover fields No auto inference, no auto-promotion, no implicit binding

Schemas are mandatory in BizTalk, every message type is, in effect, a schema. In Art2link ESB they are deliberately optional: message types stand on their own, and schemas are an additive validation layer you opt into where you need it.

If a message type has no schema associated with it, no validation runs and the payload flows through unchanged. There is no implicit fallback, no auto-detection, no warning, the absence of a schema simply means the runtime is not asked to check anything structurally.

Routing a message to its subscribers does not depend on a schema. Type assignment, promotion evaluation, and routing fire on every message; the schema, if attached, just adds a structural check between the two. Without one, the runtime simply does not invoke that check, nothing else about the flow changes.

STAGE 1 Type assigned ALWAYS STAGE 2 Promotion eval ALWAYS STAGE 3 Validate IF SCHEMA ROUTING To subscribers ALWAYS Type assignment, promotion evaluation, and routing fire on every message. Validation is the only stage that depends on whether a schema is attached. A message with no schema reaches its subscribers exactly like one with a passing schema.
i
Promotions still fire without a schema. Every promotion defined on the message type is evaluated against the payload at each instantiation moment, regardless of whether a schema is attached. If a promotion’s XPath does not resolve, the path is wrong, the node is missing, the message just doesn’t carry that field, the promoted value is empty. No error, no warning; downstream expressions that read {{Promoted.MessageType.Name}} simply get nothing. See Promotions in the message-types article for the full shape rules.
When to add one. A schema is worth defining when an upstream system can drift, when you want a hard contract with a partner, or when you want a fast structural rejection before the message is mapped or routed. For internal, fully-controlled flows, doing without is perfectly reasonable.

Schemas are scoped to an Application. From the application menu, the Schemas list shows every schema you have defined. Each entry has just three fields:

FieldPurpose
NameHow the schema is referenced when associating it with a message type.
TypeXSD or JSON, must match the format of the message type the schema will be associated with.
CodeThe schema document itself, XSD or JSON Schema source, pasted in.

The list view follows the platform's Selected Application behavior, with an Application selected, the list filters to it and the Application column is hidden; with no selection, the list spans every Application you have access to and the column is shown. Creating a new schema uses the same flow: with an Application selected, the form opens with that Application preemptively chosen; without one, the form exposes an Application picker.


Two schema languages are supported, each paired one-for-one with a message format. A message type's Format splits the whole list into two camps: XML and JSON, which carry a schema directly, and every other Format, which has to be disassembled to XML or JSON first. Formats get added to the list over time, and a new one lands in the second camp unless it is XML or JSON.

MESSAGE TYPE PAIRING SCHEMA LANGUAGE XML direct pair XSD JSON direct pair JSON Schema EVERY OTHER disassemble first via XML or JSON CSV TXT TAB POS EDI HL7 SWIFT NCPDP BIN + any Format added later One camp, one rule: no direct schema, disassemble to XML or JSON and validate the result.

The two solid pairings are exclusive: an XSD schema can only be associated with an XML message type, and a JSON Schema can only be associated with a JSON message type. The UI prevents mismatched bindings. Every other Format sits in the second camp and cannot carry a schema directly, whether it is delimited (CSV, TAB), positional (POS), an interchange standard (EDI, HL7, SWIFT, NCPDP), plain text (TXT), or binary (BIN). See Validating other formats below for the disassembly pattern.

i
Format gates the pairing, not the schema name. The schema's Type field (XSD or JSON) is what the runtime checks against the message type's Format. The same XSD source could be named anything, what matters at runtime is that Type=XSD pairs with Format=XML and Type=JSON pairs with Format=JSON. Outside those two, a Format is a label: it tells whoever reads the configuration what the payload actually is, and it neither enables a schema nor changes anything the runtime does.

A schema is touched at one design-time moment and however many runtime moments the message type happens to be instantiated:

MomentWhat happens
Design timeWhen you define a message type, you may optionally associate a schema with it. The schema's Type must match the message type's Format. If you skip this step, the message type has no schema attached and nothing changes downstream.
RuntimeEvery time the message type is instantiated, see When a message type is instantiated, the runtime validates the current payload against the associated schema. If no schema is associated, validation is skipped and the message flows through unchanged.

The association is made on the message type, not on the schema and not on a port. Once associated, every message of that type, regardless of which port it arrived on, is subject to the same validation.


Schema validation fires only after a message type gets assigned to a payload, and only if the resulting type carries a schema. Type assignment happens at a small, well-defined set of events inside receive and send ports; outside those events, schemas never run.

TYPE-ASSIGNMENT EVENTS: WHERE SCHEMA VALIDATION CAN FIRE RECEIVE PORT · inbound (from external) one-way and two-way request side Adapter MT Pipeline Map Three events, starting at the adapter handoff. The type is set before the first pipeline stage runs. SEND PORT · inbound (from external) two-way response side only Adapter MT Pipeline Map Three events. The response is typed at the adapter handoff before it correlates back to the bus. RECEIVE PORT · outbound (to external) two-way response side only Pipeline Map Two events. No Adapter Message Type, the message came off the bus already typed. SEND PORT · outbound (to external) one-way and two-way request side Pipeline Map Two events. No Adapter Message Type, the message came off the bus already typed before going out the wire.

The flow that connects these events, adapters, pipeline stages, subscriptions, bus topology, is documented in Ports. The matrix above is the index of where in any port type assignment can occur, and therefore where schema validation has a chance to run.

At each moment, schema validation is the third of three runtime stages, type assignment, promotion evaluation, and (if a schema is associated) schema validation. See When the runtime touches a message type for the full sequence.

Source-side and destination-side schemas are independent. If a message moves through several maps in the same flow, each map's destination type can carry its own schema and each will validate in turn. The pre-map type's schema is not re-checked after the map runs, it had its turn at instantiation moment 1.

Validation has two outcomes, conforms or doesn't, and the failure path is terminal, not transient.

MESSAGE payload + type Validate against schema Conforms Promotions are live; message continues to its subscribers. Errored, terminal Not suspended. Retry would fail the same way. Recover by fixing upstream, not by resuming.

The message is marked errored, not suspended. Suspension implies a transient failure that retry can resolve; schema validation is deterministic, so resuming the same payload against the same schema would just fail the same way.

⚠️
Recovering from a validation failure means fixing upstream, not retrying. Either correct the payload at the source, relax the schema, or remove the schema association if the structural check is no longer wanted. There is no in-place retry that will rescue a structurally invalid message.

Schemas only validate XML or JSON. A payload in every other Format, an EDI or HL7 interchange, a positional record set, a CSV or tab-delimited extract, a binary blob, has to be brought into one of those two shapes before a schema can apply. The pattern is a four-link chain:

OFF THE WIRE Any other Format EDI, HL7, POS, CSV, TAB, SWIFT, NCPDP, BIN, TXT DISASSEMBLE Pipeline component parses to XML or JSON TYPE TAG XML Message type Format = XML or JSON VALIDATE Schema (optional) XSD or JSON Schema

The disassembler is a normal pipeline component, the same C# class you write to handle any other inbound transformation. EDI is the canonical example: the EDI Format covers X12 and EDIFACT, and those interchanges plus most organization-specific variants are well documented, so a parser can be written from the spec without any special tooling. Whatever the component emits is a regular XML or JSON message from that point on; from the schema's point of view, the original payload never existed.

Validation can also happen inside the disassembler. If your pipeline component already enforces the format's rules during parsing, required fields, value ranges, segment counts, that is a valid validation point too. A formal schema downstream is one option, not the only one.

That is the whole job

A schema is one form, three fields, and a deterministic runtime check that fires wherever its message type is instantiated. Optional, format-matched, and out of the way until something does not conform.