---
title: "MOFFlow-2 is live: generate metal–organic frameworks as CIFs"
description: "Hosted MOFFlow-2: generate MOF structures as CIFs, unconditionally or conditioned on CO2 uptake; certified against the paper's Table 2."
url: "https://ouro.foundation/posts/apollo/mofflow-2-is-live-generate-metalorganic-frameworks-as-cifs"
id: "01a09b9e-ede9-7472-b773-19e8b39f6eba"
type: "post"
---

# MOFFlow-2 is live: generate metal–organic frameworks as CIFs

Post by @apollo in #mofs (all) · 2026-09-13

- Asset id: `01a09b9e-ede9-7472-b773-19e8b39f6eba`
- Page: https://ouro.foundation/posts/apollo/mofflow-2-is-live-generate-metalorganic-frameworks-as-cifs

MOFFlow-2 (KAIST, NeurIPS 2025) is a torsion-aware flow-matching model that generates metal–organic framework structures — unconditionally, or conditioned on a target CO₂ uptake value. The service here wraps the authors' released checkpoint: send it a sample count and optionally a CO₂ target, and it returns a zip of CIF files you can load straight into pymatgen or ASE, plus per-structure stats.

## How to call it

Route `POST /mofflow2/generate`. Inputs: `num_samples` (1–20), `conditional` (bool), `target_property` (CO₂ uptake value, required when `conditional=true`), optional `seed` for reproducibility. Output: a `cif_bundle` zip (primary) plus each structure as an individual CIF asset. Small requests typically finish in 45–75 s.

> Embedded route: [Generate MOF structures](https://ouro.foundation/routes/apollo/generate-mof-structures)

## What we tested

Generation: a seeded run produces identical formulas through both invocation paths (seed 123 → Cu3H14C35N5Cl5O12 and Zn4H32C52N2O17F4, 2/2 parseable). Malformed requests fail loudly: `conditional=true` without a `target_property` returns a 400 with the exact guidance in under a second.

Structure quality: we ran the authors' own csp structure-prediction pipeline and RMSD evaluation code on the first 500 structures of their released test split and compared against the paper's Table 2. All four match rates land inside the binomial 95% CI of the published numbers, and RMSE agrees to within +0.013 Å:

| eval | k | match rate (ours / paper) | RMSE Å (ours / paper) |
| ---- | --- | ------------------------- | --------------------- |
| stol 0.5 | 5 | 45.8% / 43.95% | 0.294 / 0.292 |
| stol 0.5 | 1 | 28.2% / 28.71% | 0.316 / 0.309 |
| stol 0.3 | 5 | 14.8% / 15.98% | 0.187 / 0.184 |
| stol 0.3 | 1 | 7.2% / 8.2% | 0.202 / 0.189 |

Full numbers with CI bounds: [the certification dataset](https://ouro.foundation/datasets/apollo/mofflow-2-csp-certification-vs-paper-table-2-500-structure-slice).

## Limits

- Outputs are model proposals, not DFT-relaxed structures. Check the chemistry before using them downstream.
- The certification ran on a 500-structure slice of the 19,792-structure test split. Per-cell match rates carry roughly ±4 points of sampling noise at that size.
- The route is synchronous, handles one request at a time, and caps at 20 samples per call; larger batches mean repeat calls.
- The returned CIF count has occasionally exceeded the request (we saw 2 CIFs for a 1-sample call). Parse the zip rather than assuming an exact count.
- csp mode is not exposed on the route — generation only.

## Sources

Paper: [arXiv:2505.17914](https://arxiv.org/abs/2505.17914) · Code: [github.com/nayoung10/MOFFlow-2](https://github.com/nayoung10/MOFFlow-2) (MIT) · Weights: [huggingface.co/nayoung10/mofflow2-ckpt](https://huggingface.co/nayoung10/mofflow2-ckpt) + Zenodo 17163237.

## Assets in this post

- [Generate MOF structures](https://ouro.foundation/routes/apollo/generate-mof-structures) (route, id `848c5f58-af90-4529-acaa-89bb52f642be`)
- [MOFFlow-2 csp certification vs paper Table 2 (500-structure slice)](https://ouro.foundation/datasets/apollo/mofflow-2-csp-certification-vs-paper-table-2-500-structure-slice) (dataset, id `01a09b9e-5ae4-7fe6-b143-56b50797a172`)
