There is no public HTTP API. There are two supported ways to get your data out programmatically, and this page is about those.
No REST or GraphQL endpoint exists — not undocumented, not private, not behind a key. The routes this app serves are its own pages and its own form submissions, and they are not a contract: they change shape whenever a screen does, and nothing warns you when they have.
The evidence table exports to CSV and Excel. What comes out is exactly what your filters and your column choice are showing — not the whole project — so a narrowed table is also a narrowed file.
Column headers are protocol question keys, not labels. A question labelled “Sample size (n)” exports as sample_size. That is deliberate and it is the reason a script reading these files keeps working: a key cannot be renamed once the question has answers, whereas the label is prose and gets reworded. Bind your R or pandas code to the key.
Cells that were quoted from a paper export as the answer text. The link back to the passage exists only in the app, since a spreadsheet has nowhere to put a text anchor.
If you run your own copy, the fully general answer is SQL: it is your PostgreSQL instance. The schema is in supabase/migrations and every table is documented in docs/01-data-model.md. On the hosted service this route is not available — you have an account there, not a database — so the exports above are the whole of it.
Two warnings that matter more than they sound:
UPDATE that dodges the application does not dodge those; it fails, or worse, it succeeds against a rule that was only ever enforced in a form.The encrypted columns are the exception to “the database is yours” in the way you would expect: message bodies and LaTeX sources are ciphertext there, and no SQL will open them. Security explains which columns those are.
Not effort — decisions. An endpoint needs tokens with their own lifecycle and revocation, a scope model that does not quietly widen the five project roles, rate limiting per token, and a versioning promise, because the first integration written against it is the moment the schema stops being free to change.
None of that is written yet, and until it is, the exports above are the supported route. If an API would change what you can do with your data — rather than merely being tidier than a CSV — that is worth saying in an issue, because the shape of the first real use case is the thing missing.
If an export is missing a field you need, that is the useful thing to report — it is usually a smaller change than it looks. The features page lists what is in the table today.