Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Rowan is a cloud-native molecular modeling and medicinal-chemistry workflow platform with a Python API. Use for pKa and macropKa prediction, conformer and tautomer ensembles, docking and analogue docking, protein-ligand cofolding, MSA generation, molecular dynamics, permeability, descriptor workflows, and related small-molecule or protein modeling tasks. Ideal for programmatic batch screening, multi-step chemistry pipelines, and workflows that would otherwise require maintaining local HPC/GPU in
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 67% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 133% | 0% |
Rowan is a cloud-native workflow platform for molecular simulation, medicinal chemistry, and structure-based design. Its Python API exposes a unified interface for small-molecule modeling, property prediction, docking, molecular dynamics, and AI structure workflows.
Use Rowan when you want to run medicinal-chemistry or molecular-design workflows programmatically without maintaining local HPC infrastructure, GPU provisioning, or a collection of separate modeling tools. Rowan handles all infrastructure, result management, and computation scaling.
Rowan is a good fit for:
Rowan is not the right fit for:
bashuv pip install rowan-python
pythonimport rowan rowan.api_key = "your_api_key_here" # or set ROWAN_API_KEY env var # Submit a descriptors workflow — completes in under a minute wf = rowan.submit_descriptors_workflow("CC(=O)Oc1ccccc1C(=O)O", name="aspirin") result = wf.result() print(result.descriptors['MW']) # 180.16 print(result.descriptors['SLogP']) # 1.19 print(result.descriptors['TPSA']) # 59.44
If that prints without error, you're set up correctly.
bashuv pip install rowan-python # or: uv pip install rowan-python
Set an API key via environment variable (recommended):
bashexport ROWAN_API_KEY="your_api_key_here"
Or set directly in Python:
pythonimport rowan rowan.api_key = "your_api_key_here"
Verify authentication:
pythonimport rowan user = rowan.whoami() # Returns user info if authenticated print(f"User: {user.email}") print(f"Credits available: {user.credits_available_string}")
Rowan accepts molecules in the following formats:
"CCO", "c1ccccc1O""InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3"The API will validate input and raise a rowan.ValidationError if a molecule cannot be parsed. Always use canonicalized SMILES for reproducibility.
Tip: Use RDKit to validate SMILES before submission:
pythonfrom rdkit import Chem smiles = "CCO" mol = Chem.MolFromSmiles(smiles) if mol is None: raise ValueError(f"Invalid SMILES: {smiles}")
Most Rowan tasks follow the same three-step pattern:
pythonimport rowan # 1. Submit — use the specific workflow function (not the generic submit_workflow) workflow = rowan.submit_descriptors_workflow( "CC(=O)Oc1ccccc1C(=O)O", name="aspirin descriptors", ) # 2. & 3. Wait and retrieve result = workflow.result() # Blocks until done (default: wait=True, poll_interval=5) print(result.data) # Raw dict print(result.descriptors['MW']) # 180.16 — use result.descriptors dict, not result.molecular_weight
For long-running workflows, use streaming:
pythonfor partial in workflow.stream_result(poll_interval=5): print(f"Progress: {partial.complete}%") print(partial.data)
| Pattern | Use When | Duration | |---------|----------|----------| | result() | You can wait for the full result | <5 min typical | | stream_result() | You want progress feedback or need early partial results | >5 min, or interactive use |
Guideline: Use result() for descriptors, pKa. Use stream_result() for conformer search, docking, cofolding.
Rowan's API includes typed workflow result objects with convenience properties.
Results have two access patterns:
result.descriptors, result.best_pose, result.conformer_energiesresult.data — raw dictionary from the APIExample:
pythonresult = rowan.submit_descriptors_workflow( "CCO", name="ethanol", ).result() # Convenience property (returns dict of all descriptors): print(result.descriptors['MW']) # 46.042 print(result.descriptors['SLogP']) # -0.001 print(result.descriptors['TPSA']) # 57.96 # Raw data fallback (descriptors are nested under 'descriptors' key): print(result.data['descriptors']) # {'MW': 46.042, 'SLogP': -0.001, 'TPSA': 57.96, 'nHBDon': 1.0, 'nHBAcc': 1.0, ...}
Note: DescriptorsResult does not have a molecular_weight property. Descriptor keys use short names (MW, SLogP, nHBDon) not verbose names.
Some result properties are lazily loaded (e.g., conformer geometries, protein structures). To refresh:
pythonresult.clear_cache() new_structures = result.conformer_molecules # Refetched
For nontrivial campaigns, use projects and folders to keep work organized.
pythonimport rowan # Create a project project = rowan.create_project(name="CDK2 lead optimization") rowan.set_project("CDK2 lead optimization") # All subsequent workflows go into this project wf = rowan.submit_descriptors_workflow("CCO", name="test compound") # Retrieve later project = rowan.retrieve_project("CDK2 lead optimization") workflows = rowan.list_workflows(project=project, size=50)
python# Create a hierarchical folder structure folder = rowan.create_folder(name="docking/batch_1/screening") wf = rowan.submit_docking_workflow( # ... docking params ... folder=folder, name="compound_001", ) # List workflows in a folder results = rowan.list_workflows(folder=folder)
Use microscopic pKa when:
Use macropKa when:
Example decision:
textPhenol (pKa ~10): Use microscopic pKa Amine (pKa ~9–10): Use microscopic pKa Multi-ionizable drug (N, O, acidic group): Use macropKa ADME assessment across GI pH: Use macropKa
Use conformer search when:
Use tautomer search when:
Combined workflow:
python# Step 1: Find best tautomer taut_wf = rowan.submit_tautomer_search_workflow( initial_molecule="O=c1[nH]ccnc1", name="imidazole tautomers", ) best_taut = taut_wf.result().best_tautomer # Step 2: Generate conformers from best tautomer conf_wf = rowan.submit_conformer_search_workflow( initial_molecule=best_taut, name="imidazole conformers", )
| Workflow | Use When | Input | Output | |----------|----------|-------|--------| | Docking | Single ligand, known pocket | Protein + SMILES + pocket coords | Pose, score, dG | | Analogue docking | 5–100+ related compounds | Protein + SMILES list + reference ligand | All poses, reference-aligned | | Protein-ligand cofolding | Sequence + ligand, no crystal structure | Protein sequence + SMILES | ML-predicted bound complex |
python# From local PDB file protein = rowan.upload_protein( name="egfr_kinase_domain", file_path="egfr_kinase.pdb", ) # From PDB database protein_from_pdb = rowan.create_protein_from_pdb_id( name="CDK2 (1M17)", code="1M17", ) # Retrieve previously uploaded protein protein = rowan.retrieve_protein("protein-uuid") # List all proteins my_proteins = rowan.list_proteins()
Nine common workflow categories — descriptors, microscopic pKa, MacropKa, conformer search, tautomer search, docking, analogue docking, MSA generation, and protein-ligand cofolding — each with submission code and result shapes, plus the complete list of every supported workflow type (core modeling, structure-based design, advanced computational chemistry, reaction chemistry, advanced properties, binding free energy, and sequence and structural biology) are in references/workflow_catalog.md.
Batch submit/poll/retrieve, the non-blocking fire-and-check pattern, webhook setup, secret creation and rotation, payload and signature verification (with a FastAPI handler), and webhook best practices are in references/batch_and_webhooks.md.
Free-tier limits, credit consumption per workflow, and typical cost estimates are in references/access_and_pricing.md.
A full lead-optimization campaign — project setup, tautomers, pKa across an analogue series, result collection, and a docking follow-up — is in references/end_to_end_example.md.
Common errors with their fixes, and debugging tips, are in references/troubleshooting.md.
result() to block until complete (default: wait=True, poll_interval=5).data for unmapped fieldspKa → macropKa → permeability (ADME assessment)tautomer search → docking → pose-analysis MD (pose refinement)MSA generation → protein-ligand cofolding (AI structure prediction)Use Rowan when your workflow requires cloud execution for molecular-design tasks, especially when you want one unified API and consistent result handling across small-molecule modeling, proteins, docking, ADME prediction, and ML structure generation.
Rowan is a molecular-design workflow platform, not just a remote chemistry engine. It handles infrastructure scaling, result persistence, and multi-step pipeline orchestration so you can focus on science.
Other measured skills in the registry, with their headline benchmark lift.