Crowdsourced forecasting questions and predictions from the RAND Forecasting Initiative (formerly INFER). Policy-relevant forecasting questions with crowd probabilities, individual forecaster predictions with rationales, and comments. Use for any question about geopolitics, national security, science and technology policy, or when you need calibrated crowd forecasts as base rates. All methods support cutoff_date for backtesting.
SDK that provides access to the RAND Forecasting Initiative crowdsourced forecasting platform (formerly INFER, powered by Cultivate Labs). It covers policy-relevant forecasting questions with aggregated crowd probabilities and individual forecaster predictions with rationales.
from sdk_rfi import Client
client = Client() # Uses RFI_EMAIL and RFI_PASSWORD env vars
| Method | What it does |
|---|---|
client.questions.list(...) | List forecasting questions with filtering by status, tags, challenges, date ranges |
client.questions.get(question_id) | Get a specific question with answers and crowd probabilities |
client.prediction_sets.list(question_id=...) | Get individual forecaster predictions with rationales for a question |
client.comments.list(commentable_id=..., commentable_type=...) | Get discussion comments on a question |
client.questions.list() to find questions matching your topic, then read the crowd probability from question.answers[i].probability as a calibrated starting point.client.prediction_sets.list(question_id=X) to see how individual forecasts changed over time. Plot created_at vs forecasted_probability to detect momentum.rationale text explaining the forecaster's reasoning. Use client.prediction_sets.list(question_id=X) and examine rationales for weak signals and arguments.client.questions.list(status="closed") to find resolved questions. Compare crowd probability at various cutoff dates against actual outcomes to measure calibration.client.comments.list(commentable_id=X, commentable_type="Forecast::Question") to find discussion threads that may contain links to evidence or emerging developments.# Get all active forecasting questions
questions = client.questions.list()
for q in questions.questions:
print(f"{q.id}: {q.name}")
for a in (q.answers or []):
print(f" {a.name}: {a.probability_formatted}")
# Get individual forecasts and rationales for a question
forecasts = client.prediction_sets.list(question_id=1234)
for ps in forecasts.prediction_sets:
print(f"{ps.membership_username}: {ps.rationale}")
for pred in (ps.predictions or []):
print(f" Answer {pred.answer_id}: {pred.forecasted_probability:.1%}")
# Backtest: get data as it was available on a past date
past_questions = client.questions.list(cutoff_date="2025-06-01")
past_forecasts = client.prediction_sets.list(question_id=1234, cutoff_date="2025-06-01")
See references/methods.md for all 4 methods with complete parameter details.