# iSynth reaction data specification: complete field reference

Specification 1.9.0. All authoring types, field descriptions, allowed values and examples appear on this page. No sign-in or JavaScript is required; this URL can be given directly to an AI reader.

[HTML reference](https://isynth.ichemdata.com/schemas/reaction-reference.en.html) · [JSON Schema](https://isynth.ichemdata.com/schemas/reaction-object.schema.json)

## How to use

Human contributors use the simple table. AI, lab software and integrations use Reaction JSON. JSON Schema defines exchange and validation; users need not fill every field, and it is not a database table layout.

Generate one Reaction per experiment → validate and check against the source → upload to a private draft → inspect the reaction preview → submit for review. Each record is serialized as a JSON string in the reaction_record column; authors, provenance and license are separate dataset metadata.

The website provides structures, stage conditions and measurements alongside original files and full JSONL downloads. Once published and prepared for search, records can be queried and retrieved through MCP.

[Complete submission workflow and example](https://isynth.ichemdata.com/en/guides/reaction-data) · [upload_records request](https://isynth.ichemdata.com/examples/structured-upload.json)

## Paper extraction

JSON Schema (Draft 2020-12) defines fields, types and nesting. The model outputs reaction JSON data conforming to it, not the schema itself. Examples follow reference field order; object key order does not affect validation, while segments array order represents the experimental sequence.

Provide the paper, supporting information and this reference. Output one Reaction per experiment; use JSONL with one object per line for multiple experiments. Omit unreported optional fields and preserve unresolved descriptions as text.

Check structure, material references, quantities and measurement ownership, then review against the source. With MCP, call get_reaction_contract(view="extraction"), followed by validate_reaction_records; validation does not save data. If a model cannot open links, supply the files in the downloaded specification bundle.

[Extraction instructions and prompts](https://isynth.ichemdata.com/schemas/extraction-instructions.md) · [Ordinary reaction example](https://isynth.ichemdata.com/schemas/reaction-literature.example.json)

## Conventions

- Use lower, upper and unit for ordinary ranges, e.g. {"lower":20,"upper":25,"unit":"°C"}. One-sided limits use value and qualifier, e.g. <0 °C. Retain exceptional boundary wording in raw.

- Custom parameters remain in JSONB. Registered names, types, units and paths enable API/MCP parameter_filters; discover support with get_parameter_catalog. Clauses in the same group match one stage; missing or unknown-unit values do not satisfy numeric filters. Registry: /schemas/reaction-parameter-registry.json.

- Examined centres identify the sites under study; the comparison defines the value. ee/er concern a complete enantiomer pair, while de/dr concern the stated diastereomers. Multi-centre molecules can still have ee/er; varying one centre with the others fixed generally concerns de/dr.

- stereocentres uses source locants, not SMILES atom indices. Preserve explicit comparison species or groups for multi-centre molecules, natural products and pooled ratios; a site list does not establish those groups.

- One JSON object represents one experiment, using materials, initial_state, segments, products and measurements.

- materials defines inputs and products defines products. Starting and subsequent inputs use Charge, with amount and concentration together.

- An ordinary reaction usually has one segment; a multi-stage reaction has ordered segments. Use an empty segments array when no stage information is reported.

- Put segment settings in conditions; omitted settings carry forward. duration is local. Procedures and qualitative observations go in text. Use segment products and measurements only for explicitly reported stage results. Overall results belong at the root, without copying them into the final segment.

- Charge.material references an input material ID. Measurement.subject references the measured Material.id or Product.id. All metrics use measurements.

- Keep source units. value and unit represent a quantity; raw alone can retain unresolved wording.

- Use parameters for additional structured attributes and text for supplementary wording. Later segments inherit omitted settings; null explicitly stops inheritance and does not mean zero.

- Existing 1.8.0, 1.7.0, 1.6.0, 1.5.0, 1.4.0, 1.3.0, 1.2.0, 1.1.0 and 1.0.0 records retain their original readers without rewriting source data.

## Reaction

Every experiment records material definitions, starting charges, reaction segments and outcomes. Use one segment for an ordinary reaction and ordered segments for a multi-stage reaction.

### Object example

```json
{
  "schema_version": "1.9.0",
  "reaction_identifier": "EXP-0001",
  "materials": [
    {
      "id": "alcohol",
      "identifiers": [
        {
          "type": "SMILES",
          "value": "CCO"
        }
      ],
      "role": "reactant"
    },
    {
      "id": "reagent",
      "identifiers": [
        {
          "type": "NAME",
          "value": "acetic anhydride"
        }
      ],
      "role": "reagent"
    }
  ],
  "initial_state": {
    "inputs": [
      {
        "material": "alcohol",
        "amount": {
          "value": 0.25,
          "unit": "mmol",
          "raw": "0.25 mmol"
        }
      },
      {
        "material": "reagent"
      }
    ]
  },
  "segments": [
    {
      "conditions": {
        "temperature": {
          "value": 25,
          "unit": "°C",
          "raw": "25 °C"
        }
      }
    }
  ],
  "products": [
    {
      "id": "product",
      "identifiers": [
        {
          "type": "SMILES",
          "value": "CCOC(C)=O"
        }
      ]
    }
  ],
  "measurements": [
    {
      "subject": "product",
      "type": "yield",
      "value": {
        "value": 80,
        "scale": "percent",
        "raw": "80%"
      }
    }
  ],
  "provenance": {
    "reference": "Fictional teaching record; Example A"
  },
  "text": "Fictional format illustration, not a measured result. Unreported amounts, method and calculation bases are omitted."
}
```

### Reaction.schema_version

**Type:** `"1.9.0"` · Required

Data format version; keep 1.9.0 as provided in the example.

Example:

```json
"1.9.0"
```

### Reaction.reaction_identifier

**Type:** `string` · Required

The source experiment number, e.g. EXP-0001 or Table 2, entry 5, distinguishing experiments within one source.

Example:

```json
"EXP-0001"
```

### Reaction.materials

**Type:** `Material[]` · Required

Input material definitions; put products in products.

Example:

```json
[{"id":"alcohol","identifiers":[{"type":"SMILES","value":"CCO"}],"role":"reactant"},{"id":"reagent","identifiers":[{"type":"NAME","value":"acetic anhydride"}],"role":"reagent"}]
```

### Reaction.initial_state

**Type:** `InitialState` · Required

Starting inputs and conditions, including for ordinary reactions.

Example:

```json
{"inputs":[{"material":"alcohol","amount":{"value":0.25,"unit":"mmol","raw":"0.25 mmol"}},{"material":"reagent"}]}
```

### Reaction.segments

**Type:** `Segment[]` · Required

Reaction segments in order. An ordinary reaction usually has one segment; use an empty array when no stage conditions or procedure are reported.

Example:

```json
[{"conditions":{"temperature":{"value":25,"unit":"°C","raw":"25 °C"}}}]
```

### Reaction.products

**Type:** `Product[]` · Optional

Overall reported product identities.

Example:

```json
[{"id":"product_1","identifiers":[{"type":"SMILES","value":"C[C@H](O)c1ccccc1"}],"role":"desired_product","text":"Isolated target product","parameters":{"reported_stereochemistry":"(S)"}}]
```

### Reaction.measurements

**Type:** `Measurement[]` · Optional

Overall measurements. Each item specifies subject, type and value; conversion, yield and stereoselectivity share this array.

Example:

```json
[{"subject":"reactant_1","type":"conversion","value":{"value":90,"scale":"percent"},"text":"Determined by GC."}]
```

### Reaction.workup

**Type:** `string` · Optional

Workup and purification wording.

### Reaction.provenance

**Type:** `Provenance` · Optional

Source article DOI and citation.

Example:

```json
{"reference":"Fictional teaching record; Example A"}
```

### Reaction.text

**Type:** `string` · Optional

Other experiment-wide wording.

Example:

```json
"Fictional format illustration, not a measured result. Unreported amounts, method and calculation bases are omitted."
```

### Reaction.parameters

**Type:** `object` · Optional

Additional experiment attributes, e.g. run_id. Put conditions in Conditions.parameters.

Example:

```json
{"run_id":"RUN-0001"}
```

## Identifier

Use SMILES / INCHI for structures, INCHIKEY for a structure key, NAME for a name or abbreviation (DCM), and CUSTOM for source-local labels (1a, with a source locator). A material may have multiple evidenced identifiers; never infer a structure from a name or label.

### Object example

```json
{
  "type": "SMILES",
  "value": "CCO"
}
```

### Identifier.type

**Type:** `string` · Required

Specifies the format of value, e.g. SMILES, INCHI or NAME. Together, type and value form one identifier object.

Allowed values: `SMILES`, `NAME`, `INCHI`, `INCHIKEY`, `CUSTOM`, `UNRESOLVED`

Example:

```json
"SMILES"
```

### Identifier.value

**Type:** `string` · Required

The identifier text matching type, e.g. CCO for SMILES or ethanol for NAME.

Example:

```json
"CCO"
```

## Quantity

A quantity, such as {"value":1,"unit":"mmol"}, used for amounts, temperature, time or measurements. raw can retain the source wording.

### Object example

```json
[
  {
    "value": 25,
    "unit": "°C"
  },
  {
    "unit": "°C",
    "raw": "20–25 °C",
    "lower": 20,
    "upper": 25
  },
  {
    "value": 25,
    "unit": "°C",
    "raw": "25 ± 2 °C",
    "uncertainty": 2
  },
  {
    "value": 5,
    "scale": "percent",
    "raw": "<5%",
    "qualifier": "<"
  }
]
```

### Quantity.value

**Type:** `number` · Optional

The number. Use unit for physical quantities; use scale: percent for percentages, e.g. value 80 for 80%.

Example:

```json
25
```

### Quantity.scale

**Type:** `string` · Optional

Dimensionless proportion notation: percent uses parts per hundred (80 means 80%); fraction uses parts per one (0.8 means 80%). Use instead of unit.

Allowed values: `percent`, `fraction`

Example:

```json
"percent"
```

### Quantity.unit

**Type:** `string` · Optional

Unit for physical quantities, e.g. mmol, °C, h; relative doses may use equiv or mol%. Use scale for percentages.

Example:

```json
"°C"
```

### Quantity.raw

**Type:** `string` · Optional

Original wording, consistent with structured values.

Example:

```json
"20–25 °C"
```

### Quantity.qualifier

**Type:** `string` · Optional

A single-value qualifier, e.g. <5% or approximately 25 °C. Use lower and upper for a two-sided range.

Allowed values: `=`, `<`, `<=`, `>`, `>=`, `~`

Example:

```json
"<"
```

### Quantity.lower

**Type:** `number` · Optional

Lower endpoint, e.g. 20 in 20–25 °C.

Example:

```json
20
```

### Quantity.upper

**Type:** `number` · Optional

Upper endpoint, e.g. 25 in 20–25 °C.

Example:

```json
25
```

### Quantity.uncertainty

**Type:** `number` · Optional

Reported ± uncertainty: enter 2 for 25 ± 2 °C, in the same unit as value.

Example:

```json
2
```

## Material

Input material identity and role. Record the amount and concentration on its Charge.

### Object example

```json
{
  "id": "reactant_1",
  "identifiers": [
    {
      "type": "SMILES",
      "value": "CCO"
    }
  ],
  "role": "reactant",
  "is_limiting": true,
  "text": "Ethanol used as the limiting reactant",
  "parameters": {
    "purity": "99.5%"
  }
}
```

### Material.id

**Type:** `string` · Required

Material ID within this reaction, e.g. reactant_1 or product_1, linking charges and measurements.

Example:

```json
"reactant_1"
```

### Material.identifiers

**Type:** `Identifier[]` · Optional

Chemical identifiers, each with type and value. One reported identifier is usually sufficient; multiple entries must identify the same material.

Example:

```json
[{"type":"SMILES","value":"CCO"}]
```

### Material.role

**Type:** `string` · Required

Material or outcome role in the experiment.

Allowed values: `reactant`, `reagent`, `catalyst`, `solvent`, `intermediate`, `mixture`, `unknown`

Example:

```json
"reactant"
```

### Material.is_limiting

**Type:** `boolean` · Optional

Use true for the reported overall limiting reactant or reagent, false for explicitly non-limiting, and omit if unknown. It is the usual reference for equiv, mol% and overall yield.

Example:

```json
true
```

### Material.text

**Type:** `string` · Optional

Additional input material wording, e.g. “Crude intermediate used without purification”.

Example:

```json
"Ethanol used as the limiting reactant"
```

### Material.parameters

**Type:** `object` · Optional

Additional material attributes, e.g. purity: "99.5%".

Example:

```json
{"purity":"99.5%"}
```

## Charge

One addition: material identifies the input, amount records the dose, and concentration records the concentration or formulation used in this addition.

### Object example

```json
{
  "material": "reagent_1",
  "amount": {
    "value": 2,
    "unit": "mL"
  },
  "concentration": {
    "raw": "2.5 M solution in hexanes"
  }
}
```

### Charge.material

**Type:** `string` → Material.id · Required

ID of the added material, e.g. reagent_1; reuse it for repeated additions.

Example:

```json
"reagent_1"
```

### Charge.amount

**Type:** `Quantity` · Optional

Amount added in this charge, e.g. 1 mmol. Use this same field for starting inputs and later additions.

Example:

```json
{"value":2,"unit":"mL"}
```

### Charge.concentration

**Type:** `Quantity` · Optional

Concentration or formulation of the reagent used in this charge, e.g. “2.5 M solution in hexanes” or “60% dispersion in mineral oil”. Fill alongside amount.

Example:

```json
{"raw":"2.5 M solution in hexanes"}
```

## Conditions

Reaction conditions. Later segments inherit omitted settings; JSON null stops inheriting a setting and does not mean zero. Put elapsed time in Segment.duration.

### Object example

```json
{
  "temperature": {
    "value": 25,
    "unit": "°C"
  },
  "pressure": {
    "value": 1,
    "unit": "atm"
  },
  "atmosphere": "nitrogen",
  "parameters": {
    "humidity": {
      "raw": "40% RH"
    },
    "light_source_type": "blue LED",
    "wavelength": "450 nm"
  }
}
```

### Conditions.temperature

**Type:** `Quantity | null` · Optional

Temperature Quantity.

Example:

```json
{"value":25,"unit":"°C"}
```

### Conditions.pressure

**Type:** `Quantity | null` · Optional

Pressure Quantity.

Example:

```json
{"value":1,"unit":"atm"}
```

### Conditions.atmosphere

**Type:** `string | null` · Optional

Reported atmosphere.

Example:

```json
"nitrogen"
```

### Conditions.parameters

**Type:** `object | null` · Optional

A few extra conditions as name/value pairs, e.g. milling_frequency: {value:30,unit:"Hz"}. Later segments inherit omitted keys; null stops inheriting that key; parameters:null clears all extra conditions.

Example:

```json
{"milling_frequency":{"value":30,"unit":"Hz"}}
```

## InitialState

Materials and settings present at the start. inputs refers to materials; solvents are materials too.

### Object example

```json
{
  "inputs": [
    {
      "material": "reactant_1",
      "amount": {
        "value": 1,
        "unit": "mmol",
        "raw": "1 mmol"
      }
    },
    {
      "material": "solvent_1",
      "amount": {
        "value": 2,
        "unit": "mL",
        "raw": "2 mL"
      }
    }
  ],
  "conditions": {
    "temperature": {
      "value": 0,
      "unit": "°C"
    }
  },
  "text": "The starting materials were charged at 0 °C."
}
```

### InitialState.inputs

**Type:** `Charge[]` · Required

Starting charges; each gives a material ID and, when reported, the amount charged.

Example:

```json
[{"material":"reactant_1","amount":{"value":1,"unit":"mmol","raw":"1 mmol"}},{"material":"solvent_1","amount":{"value":2,"unit":"mL","raw":"2 mL"}}]
```

### InitialState.conditions

**Type:** `Conditions` · Optional

Starting settings; put elapsed time on the corresponding segment.duration.

Example:

```json
{"temperature":{"value":0,"unit":"°C"}}
```

### InitialState.text

**Type:** `string` · Optional

Additional wording about this object: procedure and observations on a segment, method and sample on a measurement, and material context on a material.

Example:

```json
"The starting materials were charged at 0 °C."
```

## Segment

Ordered additions, settings, duration, procedure and observations. These usually suffice; add products or measurements only for explicitly reported stage results.

### Object example

```json
{
  "added_materials": [
    {
      "material": "reagent_1",
      "amount": {
        "value": 1,
        "unit": "mmol"
      }
    }
  ],
  "conditions": {
    "temperature": {
      "value": 0,
      "unit": "°C"
    }
  },
  "duration": {
    "value": 1,
    "unit": "h"
  },
  "text": "The reagent was added dropwise. The solution turned yellow."
}
```

### Segment.added_materials

**Type:** `Charge[]` · Optional

Material added in this segment; reuse the ID for repeated additions.

Example:

```json
[{"material":"reagent_1","amount":{"value":1,"unit":"mmol"}}]
```

### Segment.conditions

**Type:** `Conditions` · Optional

Conditions for this segment: supplied values replace previous settings, omitted settings carry forward, and null clears a setting.

Example:

```json
{"temperature":{"value":0,"unit":"°C"}}
```

### Segment.duration

**Type:** `Quantity` · Optional

Elapsed time for this segment only, e.g. 1 h.

Example:

```json
{"value":1,"unit":"h"}
```

### Segment.text

**Type:** `string` · Optional

Procedure and qualitative observations at this stage, such as dropwise addition, colour changes, precipitation or TLC observations.

Example:

```json
"The reagent was added dropwise. The solution turned yellow and a precipitate formed."
```

### Segment.products

**Type:** `Product[]` · Optional

Explicitly identified stage products or intermediates; define final products in Reaction.products.

Example:

```json
[{"id":"intermediate_1","identifiers":[{"type":"NAME","value":"Intermediate A (source label)"}],"role":"intermediate"}]
```

### Segment.measurements

**Type:** `Measurement[]` · Optional

Quantitative measurements at this stage; subject identifies the measured material or product. Put qualitative observations in text.

Example:

```json
[{"subject":"reactant_1","type":"conversion","value":{"value":90,"scale":"percent"},"text":"Determined by GC."}]
```

## Product

Product identity, role and attributes. Put measured results in the reaction or segment measurements, referencing this product ID through subject.

### Object example

```json
{
  "id": "product_1",
  "identifiers": [
    {
      "type": "SMILES",
      "value": "C[C@H](O)c1ccccc1"
    }
  ],
  "role": "desired_product",
  "text": "Isolated target product",
  "parameters": {
    "reported_stereochemistry": "(S)"
  }
}
```

### Product.id

**Type:** `string` · Required

Product ID unique across this reaction, e.g. product_1.

Example:

```json
"product_1"
```

### Product.identifiers

**Type:** `Identifier[]` · Optional

Chemical identifiers, each with type and value. One reported identifier is usually sufficient; multiple entries must identify the same material.

Example:

```json
[{"type":"SMILES","value":"C[C@H](O)c1ccccc1"}]
```

### Product.role

**Type:** `string` · Optional

Product role, e.g. desired_product, byproduct or intermediate.

Allowed values: `desired_product`, `byproduct`, `intermediate`, `unknown`

Example:

```json
"desired_product"
```

### Product.text

**Type:** `string` · Optional

Additional product wording, e.g. isolated target product.

Example:

```json
"Isolated target product"
```

### Product.parameters

**Type:** `object` · Optional

Additional product attributes. A source configuration label may use reported_stereochemistry: "(2R,3S)".

Example:

```json
{"reported_stereochemistry":"(S)"}
```

## Measurement

One measurement: subject, metric type, value and context. Use separate items for different metrics or repeated measurements of one object.

### Object example

```json
{
  "subject": "product_1",
  "type": "ee",
  "value": {
    "value": 96,
    "scale": "percent",
    "raw": "96%"
  },
  "stereocentres": "(2R,5S)",
  "basis": "(2R,5S):(2S,5R)",
  "text": "Isolated target diastereomer fraction analysed by chiral HPLC."
}
```

### Measurement.subject

**Type:** `string` → Material.id / Product.id · Required

ID of the measured object: a reactant such as reactant_1 for conversion, or a product such as product_1 for yield or product selectivity.

Example:

```json
"reactant_1"
```

### Measurement.type

**Type:** `string` · Required

Measured property, such as yield, conversion, ee, de, er or dr. Use amount for a measured absolute product quantity.

Allowed values: `yield`, `conversion`, `ee`, `de`, `er`, `dr`, `ez`, `rr`, `selectivity`, `purity`, `amount`, `observation`, `custom`

Example:

```json
"ee"
```

### Measurement.value

**Type:** `Quantity` · Required

Explicitly reported numerical or identifier value.

Example:

```json
{"value":96,"scale":"percent","raw":"96%"}
```

### Measurement.stereocentres

**Type:** `string` · Optional

Examined sites and target configurations. One: 5S. Several: (2R,5S), in ascending source-locant order, using ASCII parentheses/commas, no spaces or repeated locants. List only examined sites, not fixed centres. Use R/S; preserve reported pseudoasymmetry as r/s. Locants such as 3aR are supported. Source numbering is not SMILES atom indexing.

Example:

```json
"5S"
```

### Measurement.basis

**Type:** `string` · Optional

Known comparison terms in ratio order, separated by ASCII colons, e.g. (2R,5S):(2R,5R). Group sums use brackets and +, e.g. [(2R,5S)+(2S,5R)]:[(2R,5R)+(2S,5S)]. Source labels such as syn:anti may be retained; omit unknown comparisons.

Example:

```json
"(2R,5S):(2S,5R)"
```

### Measurement.text

**Type:** `string` · Optional

Describe the method, sample and other context in one sentence, e.g. “Isolated product analysed by chiral HPLC.” For a custom metric, include its name.

Example:

```json
"Isolated product analysed by chiral HPLC."
```

## Provenance

Article source: DOI and citation. The platform preserves the original experimental files separately.

### Object example

```json
{
  "doi": "10.1234/isynth.example",
  "reference": "Fictional article for documentation examples"
}
```

### Provenance.doi

**Type:** `string` · Optional

Source article DOI or DOI link, e.g. 10.1234/isynth.example (fictional example).

Example:

```json
"10.1234/isynth.example"
```

### Provenance.reference

**Type:** `string` · Optional

Source title or citation, including sources without a DOI.

Example:

```json
"Fictional article for documentation examples"
```

## Complete one-pot example

```json
{
  "schema_version": "1.9.0",
  "reaction_identifier": "EXP-0002",
  "materials": [
    {
      "id": "reactant_1",
      "identifiers": [
        {
          "type": "SMILES",
          "value": "C[C@H](O)c1ccccc1"
        }
      ],
      "role": "reactant"
    },
    {
      "id": "reagent_1",
      "identifiers": [
        {
          "type": "SMILES",
          "value": "CC(=O)OC(C)=O"
        }
      ],
      "role": "reagent"
    },
    {
      "id": "solvent_1",
      "identifiers": [
        {
          "type": "SMILES",
          "value": "CC#N"
        }
      ],
      "role": "solvent"
    }
  ],
  "initial_state": {
    "inputs": [
      {
        "material": "reactant_1",
        "amount": {
          "value": 1,
          "unit": "mmol",
          "raw": "1 mmol"
        }
      },
      {
        "material": "solvent_1",
        "amount": {
          "value": 2,
          "unit": "mL",
          "raw": "2 mL"
        }
      }
    ],
    "conditions": {
      "temperature": {
        "value": 0,
        "unit": "°C"
      }
    }
  },
  "segments": [
    {
      "added_materials": [
        {
          "material": "reagent_1",
          "amount": {
            "value": 1,
            "unit": "mmol"
          }
        }
      ],
      "duration": {
        "value": 1,
        "unit": "h"
      },
      "text": "The reagent was added dropwise at 0 °C, and the solution turned yellow. After 1 h, an aliquot was taken for HPLC.",
      "measurements": [
        {
          "subject": "reactant_1",
          "type": "conversion",
          "value": {
            "value": 95,
            "scale": "percent",
            "raw": "95 %"
          },
          "text": "Method: HPLC."
        }
      ]
    },
    {
      "added_materials": [
        {
          "material": "reagent_1",
          "amount": {
            "value": 1,
            "unit": "mmol"
          }
        }
      ],
      "conditions": {
        "temperature": {
          "value": 80,
          "unit": "°C"
        }
      },
      "duration": {
        "value": 3,
        "unit": "h"
      },
      "text": "The same mixture was heated to 80 °C for 3 h."
    }
  ],
  "products": [
    {
      "id": "product_1",
      "identifiers": [
        {
          "type": "SMILES",
          "value": "CC(=O)O[C@H](C)c1ccccc1"
        }
      ]
    }
  ],
  "measurements": [
    {
      "subject": "product_1",
      "type": "yield",
      "value": {
        "value": 80,
        "scale": "percent",
        "raw": "80 %"
      },
      "text": "Method: isolated."
    },
    {
      "subject": "product_1",
      "type": "ee",
      "value": {
        "value": 94,
        "scale": "percent",
        "raw": "94 %"
      },
      "text": "Method: chiral HPLC."
    }
  ],
  "workup": "The reaction mixture was worked up and purified as reported.",
  "provenance": {
    "reference": "Fictional documentation fixture. All quantities and observations illustrate format only; no experiment or source paper is claimed."
  },
  "text": "FORMAT EXAMPLE ONLY. Not a laboratory instruction or a reported experimental result."
}
```

## Validation and programmatic access

Validate against both the JSON Schema and semantic rules. MCP clients can call get_reaction_contract(view="object") for the current contract.

[JSON Schema](https://isynth.ichemdata.com/schemas/reaction-object.schema.json) · [Semantic rules](https://isynth.ichemdata.com/schemas/reaction-semantic-rules.md) · [Public contract API](https://isynth.ichemdata.com/api/reaction-contract?view=object)
