ftmq queries and filters Follow The Money entities from json files / streams or from a statement-based nomenklatura store.
Its ftmq.Query is the backend-agnostic query object of the OpenAleph ecosystem: it filters FtM streams and stores, compiles to SQL, and converts to and from OpenAleph API params.
New to Follow The Money? See this introduction.
Minimum Python version: 3.11
pip install ftmq
cat entities.ftm.json | ftmq -q 'filter:schema=Company&filter:properties.country=de&filter:gte:properties.incorporationDate=2023' -o s3://data/entities-filtered.ftm.jsonfrom ftmq import Query, M, P, G, smart_read_proxies
# legal entities in `companies` based in Germany, or in Austria and incorporated
# since 2020, not dissolved: the 5 most recently incorporated
q = Query().where(
M(dataset="companies"),
M(schemata="LegalEntity"),
G(countries="de") | (G(countries="at") & P(incorporationDate__gte=2020)),
~P(status__ilike="%dissolved%"),
).order_by(P("incorporationDate"), ascending=False)[:5]
for proxy in smart_read_proxies("s3://data/entities.ftm.json", query=q):
print(proxy.caption)ftmq.search indexes entities into full-text search stores backed by SQLite FTS5 or Tantivy (pip install ftmq[search]):
cat entities.ftm.json | ftmq search transform | ftmq search --uri sqlite:///ftmqs.db index
ftmq search --uri sqlite:///ftmqs.db "jane doe"ftmq.api serves a store and its search index as a read-only FastAPI application speaking the Aleph filter grammar (pip install ftmq[api]):
granian --interface asgi ftmq.api.app:app
curl "localhost:8000/entities?filter:schema=Payment&filter:gte:properties.date=2023"https://docs.investigraph.dev/lib/ftmq
This project is part of investigraph
In 2023, development of ftmq was supported by Media Tech Lab Bayern batch #3
ftmq, (C) 2023 Simon Wörpel
ftmq, (C) 2024-2025 investigativedata.io
ftmq, (C) 2025 Data and Research Center – DARC
ftmq is licensed under the AGPLv3 or later license.
Prior to version 0.8.0, ftmq was released under the MIT license.