Found here https://www.toolbox.com/tech/data-management/blogs/finding-useless-indexes-121408/ but it didn’t work for me as-is. Updated a few things and posted here so I can remember it next time.

SELECT
	idstat.relname AS table_name,
	indexrelname AS index_name,
	idstat.idx_scan AS times_used,
	pg_size_pretty(pg_relation_size(quote_ident(idstat.relname))) AS table_size,
	pg_size_pretty(pg_relation_size(quote_ident(indexrelname))) AS index_size,
	n_tup_upd + n_tup_ins + n_tup_del AS num_writes,
	indexdef AS definition
FROM
	pg_stat_user_indexes AS idstat
	JOIN pg_indexes ON indexrelname = indexname
	JOIN pg_stat_user_tables AS tabstat ON idstat.relname = tabstat.relname
WHERE
	idstat.idx_scan < 200
	AND indexdef !~* 'unique'
ORDER BY
	idstat.relname,
	indexrelname;