Agency: Mahkamah Agung RI (Supreme Court of Indonesia) Portal: https://putusan3.mahkamahagung.go.id API type: โ Public web search + full-text HTML/PDF access
Millions of Indonesian court decisions publicly accessible: civil, criminal, commercial, administrative (TUN), and religious courts. Searchable by keyword, case number, judge, court, and year.
import requests
BASE = "https://putusan3.mahkamahagung.go.id"
resp = requests.post(
f"{BASE}/search/index/pencarian/ajax/putusan",
json={
"q": "wanprestasi kontrak",
"tahun": "2024",
"jenis_doc": "Putusan",
"page": 1,
},
headers={"X-Requested-With": "XMLHttpRequest"},
timeout=30,
)
results = resp.json()import time
for page in range(1, 50):
data = requests.post(
f"{BASE}/search/index/pencarian/ajax/putusan",
json={"q": "wanprestasi", "tahun": "2023", "page": page},
headers={"X-Requested-With": "XMLHttpRequest"},
timeout=30,
).json()
decisions = data.get("data", [])
if not decisions:
break
for d in decisions:
print(d.get("nomor"), d.get("tanggal_musyawarah"))
time.sleep(1)| Code | Description |
|---|---|
PN |
Pengadilan Negeri (District Court) |
PT |
Pengadilan Tinggi (High Court) |
MA |
Mahkamah Agung (Supreme Court) |
PA |
Pengadilan Agama (Religious Court) |
PTUN |
Pengadilan Tata Usaha Negara (Administrative Court) |
| Code | Type |
|---|---|
Pdt.G |
Civil lawsuit |
Pid.B |
Criminal |
Pdt.Sus-PHI |
Labor dispute |
TUN |
Administrative |
Ag |
Religious/Islamic |
- No auth required โ all decisions publicly accessible
- POST for search, GET for detail โ different verbs
- Millions of records โ use specific queries + year filters
- Older decisions are scanned PDFs โ need OCR for text extraction
- Rate limit โ 1s delay between pages is sufficient