Stable — in daily production use against live IPA
ipaapi is a command-line tool and Python package for getting data into IPA
without clicking through the web client. You point it at a file — or a folder of them — say
which column holds the gene identifiers and which holds the fold changes, and it uploads,
creates the analyses, and tells you where they went.
It is built for the case the web client handles badly: forty differential expression tables from one experiment, each needing the same treatment, none of them laid out the way IPA's importer expects.
pip install ipaapi
01 / Problem
Why it exists
Uploading one dataset to IPA by hand is fine. Uploading thirty is a lost afternoon, and a transcription error somewhere in the middle that you will not notice until the pathway results look strange.
The obvious alternative — writing a script against the API — turns out to be harder than it looks. The API is thinly documented, and several of its more important behaviors are not written down anywhere. It will accept a submission, report success, and produce an analysis built on a fraction of your data, because a value fell outside a range it never told you about.
ipaapi exists because working all of that out took weeks. It is packaged so
nobody else has to repeat it.
02 / Use
Check the mapping, then submit
Say your file has a comment line, then a header, then data:
# generated by pipeline v3
Gene,Common_name,Control_mean,Treatment_mean,Fold_change,P-value
ENSG00000229807,XIST,4.21,2.88,-1.33,0.001
validate contacts nothing and uploads nothing — it reads
the file, applies your column choices, and shows you what IPA would receive:
ipaapi validate results.csv --ID 1:hugo --FC 4:logratio --skip-rows 1
results: 2,338 rows
gene id: 'Common_name' (hugo)
observations: 1
results:
'Fold_change' -> Log Ratio
When it looks right, submit — and if it is a folder, submit all of it:
ipaapi submit ~/experiment --pattern _DEG --ID 1:hugo --FC 4:logratio \
--skip-rows 1 --reference-set ipkb --project MyStudy
Column positions are counted from the header row and are zero-based. Columns can be in any order, named anything, with anything you don't need in between.
03 / Behavior
What it handles so you don't have to
Most of what follows is undocumented. All of it was found by submitting real data and working backwards from the results.
- Values silently discarded. IPA expects each measurement type to fall in a
particular range — fold change never lies between −1 and 1, for instance. Values
outside the range are dropped without comment, so a log2 column declared as linear
fold change produces an analysis built on the handful of genes that happened to qualify. It
looks like it worked.
ipaapichecks every value against its declared type before uploading and tells you what is wrong, and usually what you meant instead. - Identifier types that aren't what you'd guess. Human gene symbols are
hugo. Notgenesymbol, nothgnc, notGene Symbol— all of which are rejected. There are 33 accepted values;ipaapi --list-id-typesprints them. Species is carried by the identifier type rather than set separately. - Errors that arrive as a web page. IPA answers a failed submission with HTTP 200
and an HTML page reading "The page you are looking for is currently unavailable." At
least three unrelated problems produce that exact page: a duplicate dataset name, an
observation name past about 65 characters, and an actual outage.
ipaapitells them apart, prevents the first two before you hit them, and says which one it thinks you have. - Analysis allowances that run out mid-batch. IPA licenses cap how many analyses you
may run. Hit the limit twenty files into a run of forty and
ipaapistops, files what succeeded intosubmitted/, and leaves the rest where they are. Re-run the same command tomorrow and it picks up exactly where it stopped. - No way to list your own analyses. The API offers no query for the analyses you
have submitted, so an ID you didn't write down is gone.
ipaapikeeps a timestamped log of every submission —ipaapi historygives them back, with current status. - Column layouts that don't match the demo. QIAGEN's example code assumes the
identifier sits in column 0 followed by value columns in a strict repeating order.
ipaapireplaces that with a declaration, so real pipeline output works unmodified. A second identifier column can fill rows where the first is blank.
04 / Install
Getting it running
pip install ipaapi
ipaapi --help
Python 3.9 or newer. Requires requests, requests-oauthlib and
pandas, which pip installs for you.
You will need your own IPA license and account — ipaapi authenticates as you,
via your browser, using OAuth. It stores a refresh token so you only sign in once. Headless
servers are supported: authenticate on a desktop and copy the token across, or forward a
browser over SSH.
ipaapi --version reports the version, where it is installed and which Python
is running it, which matters when several machines are involved.
05 / Status
What is settled and what is not
The command line and the Python API are settled; breaking changes mean a major version bump. Three things are genuinely unresolved, none of which affect getting data in:
- Interpret links (
ipaapi report) have returned HTTP 500 for analyses that completed successfully. Cause unconfirmed — possibly a commercial add-on license. - Programmatic result retrieval needs that same add-on and is largely untested.
- The documented rule for choosing a reference set does not match observed behavior. Set
--reference-setexplicitly rather than relying on the default.
Bug reports and pull requests are welcome on GitHub. If IPA rejects something and the message doesn't explain why, that is worth reporting — most of what this package knows was learned that way.
06 / Citation
License, citation and source
MIT. Free to use, modify and redistribute, commercially or otherwise.
If it contributed to published work, please cite the archived release:
Jones, K. (2026). ipaapi: a command-line client for QIAGEN Ingenuity Pathway Analysis (v1.0.0). Zenodo. https://doi.org/10.5281/zenodo.21940021
BioinformaticSolutions — the GitHub account — so
anyone who uses Zenodo’s own export button will cite that rather than
Jones, K. Zenodo metadata stays editable after publication; adding yourself as
creator there would make the exported citation match the one above.The README covers the command line in full, plus the IPA behavior documented nowhere else.
ipaapi is an independent project. It is not affiliated with,
endorsed by, or supported by QIAGEN. Ingenuity Pathway Analysis is QIAGEN's product and
requires a license from them. This package builds on their published
python-api-demo example code.
