Technical reference. Written for analysts and AI agents and kept in sync with the repository, so it uses internal terms. Raw Markdown: /pages/how-to-query.md.
How to query Better World (agents)
Product version: 0.2.15 (VERSION). Cite provenance.product_version / GET /v1/meta/snapshot (incl. claims_index_fingerprint) when quoting rankings. CI 46/46 at freeze (live 47/47 with outcomes_adversarial); tarball sha256 6deb191390f8c359dc611b4ab3fc8e6f0c527f89739725817603063f1a2a725d; 90 research QA passes at freeze / live disk 92 (Wave GS + post-cut GW/GY; Wave ES markers match disk); ADR 0007 remains Proposed; mixes_units_in_ranking: false.
Quick path
# List / get
curl -s http://127.0.0.1:8787/v1/orgs | head
curl -s http://127.0.0.1:8787/v1/orgs/org_against_malaria_foundation
# Meta / audit snapshot (Wave CE/DD — cite product_version + data_snapshot_id + claims_index_fingerprint)
curl -s http://127.0.0.1:8787/v1/meta
curl -s http://127.0.0.1:8787/v1/meta/snapshot
# Phase 2 — recommend (preferred for "best charity for X")
# Prefer values_profile_id; response includes values_filtering + exclusions[]; RFMF may appear on orgs
curl -s 'http://127.0.0.1:8787/v1/recommend?values_profile_id=vp_lives_no_deworm&limit=8'
curl -s 'http://127.0.0.1:8787/v1/recommend?outcome=lives_saved'
curl -s 'http://127.0.0.1:8787/v1/recommend?outcome=wellbeing_wellbys&risk=low'
curl -s 'http://127.0.0.1:8787/v1/recommend?outcome=income&budget_usd=500'
curl -s 'http://127.0.0.1:8787/v1/recommend?outcome=lives_saved&tax=us_501c3_preferred&risk=low&budget_usd=25000'
# Compare / outcomes catalog
curl -s 'http://127.0.0.1:8787/v1/compare?ids=org_against_malaria_foundation,org_malaria_consortium'
curl -s http://127.0.0.1:8787/v1/outcomes
# Phase 1 search (heuristic; prefer /v1/recommend for ranking)
curl -s 'http://127.0.0.1:8787/v1/search?intent=best+charity+to+save+lives'
curl -s 'http://127.0.0.1:8787/v1/search?outcome=wellbeing_wellbys'
# Trust
curl -s http://127.0.0.1:8787/v1/trust/org_strongminds
# Modeled impact (NOT guaranteed)
curl -s 'http://127.0.0.1:8787/v1/impact-estimate?org_id=org_against_malaria_foundation&gift_usd=1000'
# Leaderboards (per family; ADR 0007 Proposed; mixes_units_in_ranking:false)
curl -s http://127.0.0.1:8787/v1/leaderboards
curl -s 'http://127.0.0.1:8787/v1/leaderboards?outcome=lives_saved'
# Tax summary (assert_personal_deductibility always false)
curl -s http://127.0.0.1:8787/v1/tax/org_against_malaria_foundation
# Review queue (read-only; no write/approve)
curl -s http://127.0.0.1:8787/v1/review/queue
curl -s 'http://127.0.0.1:8787/v1/review/queue?status=all'
# Claims index (Wave CR/DP/EF — index-only; never invent CE;
# Python list_claims/get_claim · TS listClaims/getClaim · MCP list_claims/get_claim)
curl -s http://127.0.0.1:8787/v1/claims
curl -s 'http://127.0.0.1:8787/v1/claims?org_id=org_against_malaria_foundation&verified=true'
curl -s http://127.0.0.1:8787/v1/claims/eval_gw_amf__0
# Giving intent (NO charge; charge/charges false; donate URL sanitized)
curl -s 'http://127.0.0.1:8787/v1/giving/intent?org_id=org_against_malaria_foundation&amount_usd=100&vehicle=direct_cash'Client parity (API up)::
from better_world_client import BetterWorldClient
bw = BetterWorldClient.from_api("http://127.0.0.1:8787")
print(bw.list_claims(org_id="org_against_malaria_foundation", verified=True)["count"])
print(bw.get_claim("eval_gw_amf__0")["claim"]["claim_id"])import { createClient } from "../../clients/typescript/src/index.js";
const bw = createClient();
const listed = await bw.listClaims({ org_id: "org_against_malaria_foundation", verified: true });
const one = await bw.getClaim("eval_gw_amf__0");Without the server, import ranking directly:
python3 -c "import sys; sys.path.insert(0,'scripts'); from rank import recommend; import json; print(json.dumps(recommend('lives_saved', limit=5), indent=2))"Or read JSON under data/ — including data/ranking/leaderboards.json.
Decision tree
- User outcome = save lives →
GET /v1/recommend?outcome=lives_saved→ GiveWell Top Charities (Helen Keller, Malaria Consortium, New Incentives, AMF) and/or Top Charities Fund. - User outcome = happiness / wellbeing →
outcome=wellbeing_wellbys→ StrongMinds / Friendship Bench (Top); Pure Earth / Taimaka (Promising — higher uncertainty). - User wants cash / income benchmark →
outcome=income→ GiveDirectly (benchmark) plus deworming former-tops with caveats. - Always cite URLs from
citations[]/ record sources; surfacecaveats[]and trust flags. - Never invent CE numbers — only repeat
verified_claimsvalues from our data. - Parallel boards →
GET /v1/leaderboards(do not mix units; ADR 0007 Proposed;mixes_units_in_ranking: false). - Tax language →
GET /v1/tax/{id}first;assert_personal_deductibilityalways false. - Ready to give →
GET /v1/giving/intent(no charge); never invent donate URLs / crypto addresses. - Cite catalog identity →
GET /v1/metaor/v1/meta/snapshot(product_version,claims_index_fingerprint,adr_0007_statusstays Proposed until Ho Hum Accept). - Research / pending gates →
public/pages/decision-desk.md+cause-research.md(92 packs with QA passes on live disk; 90 at 0.2.15 cut / prior 83 at 0.2.14; 78 at 0.2.13; not a ranking; ADR 0007 Proposed). - Cite a flat claim →
GET /v1/claimsorGET /v1/claims/{id}(or Python/TSlist_claims/get_claim·listClaims/getClaim· MCPlist_claims/get_claim; index copy only; never invent CE).
Values-profile query params
Map schema/values_profile.schema.json fields onto /v1/recommend. Prefer binding a preset id:
| Profile field | Query param |
|---|---|
| (preset id) | values_profile_id (vp_* from GET /v1/values-profiles) |
outcome_preference |
outcome or outcome_preference |
budget_usd |
budget_usd |
risk |
risk |
geography |
geography |
require_geography |
require_geography |
tax |
tax |
red_lines |
red_lines (comma-separated) |
non_cash.prefer_orgs_with_options |
non_cash=true |
Example profile: data/examples/values_profile.example.json.
Named presets (static catalog): data/values_profiles/ / public/demo/values_profiles.json — see docs/values-discernment.md.
When a preset is bound, surface values_filtering / exclusions[]. RFMF on org payloads: unknown ≠ no room (api/FUNGIBILITY_INTEGRATION.md).
Contract notes: OpenAPI api/openapi.yaml (Provenance, AuditSnapshot); leaderboards api/LEADERBOARD_INTEGRATION.md.
IDs matter
Use stable org_*, cause_*, int_*, eval_*, gv_*, vp_* IDs in agent tool calls and memory.