Go APIlapor.go.id ↗
Access resolved complaint data and government institution details from LAPOR!, Indonesia's official public complaint portal. Search agencies, ratings, and success stories.
What is the Go API?
The LAPOR! API provides access to Indonesia's official public complaints portal through 3 endpoints, covering resolved complaint listings, government institution search, and institution detail pages. The list_complaints endpoint returns paginated success stories with fields like title, description excerpt, author, comment count, and support count. The search_institutions and get_institution_detail endpoints expose agency names, types, ratings, follower counts, and associated resolved cases.
curl -X GET 'https://api.parse.bot/scraper/ff7ac48b-8a9d-4366-afd0-718b7301c6dc/list_complaints?page=1' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace lapor-go-id-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: LAPOR! Indonesia Government Complaints Portal — bounded, re-runnable."""
from parse_apis.lapor__indonesia_government_complaints_portal_api import (
Lapor, InstitutionNotFound
)
client = Lapor()
# List resolved complaints — capped at 5 items total.
for complaint in client.complaints.list(limit=5):
print(complaint.title, complaint.support_count, complaint.author)
# Search institutions by keyword, take the first result.
inst = client.institutions.search(query="kesehatan", limit=1).first()
if inst:
print(inst.name, inst.slug, inst.type)
# Get full institution detail from the first search hit.
if inst:
try:
detail = client.institutions.get(slug=inst.slug)
print(detail.name, detail.rating, detail.followers_count)
for story in detail.success_stories[:2]:
print(story.title, story.url)
except InstitutionNotFound as exc:
print(f"Institution gone: {exc.slug}")
print("exercised: complaints.list / institutions.search / institutions.get")
List resolved complaints (Kisah Sukses / Success Stories) from LAPOR!. Returns a paginated list of complaints that have been successfully resolved. Each complaint includes title, description excerpt, author, comments count, and support count. All results carry status SELESAI (resolved). Paginate by incrementing the page parameter; has_next_page indicates whether more pages exist.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (1-based) |
{
"type": "object",
"fields": {
"page": "current page number",
"count": "number of complaints on this page",
"complaints": "array of complaint objects with title, url, slug, description, author, comments_count, support_count, status",
"has_next_page": "boolean indicating if more pages exist",
"has_previous_page": "boolean indicating if previous pages exist"
},
"sample": {
"data": {
"page": 1,
"count": 10,
"complaints": [
{
"url": "https://www.lapor.go.id/laporan/detil/proyek-jalan-tol-pejagan-pemalang-seksi-3",
"slug": "proyek-jalan-tol-pejagan-pemalang-seksi-3",
"title": "Proyek Jalan Tol Pejagan-Pemalang Seksi 3",
"author": "62815772xxxx",
"status": "SELESAI",
"description": "Selamat siang, mau tanya tentang kelanjutan proyek jalan tol Pejagan-Pemalang seksi 3 di Kabupaten Tegal. Kapan sosialisasinya? Terima kasih...",
"support_count": 109,
"comments_count": 26,
"author_profile_id": "513"
}
],
"has_next_page": true,
"has_previous_page": false
},
"status": "success"
}
}About the Go API
Complaint Data
The list_complaints endpoint returns paginated resolved complaints (Kisah Sukses) from LAPOR!. Each complaint object includes a title, description excerpt, author identifier, comments count, and support count. Pagination is controlled via the page parameter, and the response includes has_next_page and has_previous_page flags along with a total count field to help you traverse the full dataset.
Institution Search
The search_institutions endpoint lets you query the directory of government institutions connected to LAPOR!. Pass a query string to filter results by institution name, or omit it to page through all institutions. Each result includes the institution name, type (ministry, agency, local government, etc.), parent institution, and SMS prefix used for complaint submission. The response also returns total_pages so you can enumerate the full directory.
Institution Detail
The get_institution_detail endpoint accepts a slug (e.g., kementerian-kesehatan) obtained from search_institutions and returns deeper information: email, phone, address, rating score, follower count, sub-units, and an array of success stories associated with that institution. Not all fields are present for every institution — email, phone, address, and sub-units are returned only when available.
The Go API is a managed, monitored endpoint for lapor.go.id — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when lapor.go.id changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official lapor.go.id API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track which government institutions have the highest ratings and follower counts on LAPOR!
- Monitor citizen complaint resolution trends by paginating through success stories over time
- Build a directory of Indonesian government agencies using institution name, type, and parent fields
- Map public complaints to specific ministries or local agencies by linking complaints to institution slugs
- Extract contact details (email, phone, address) for government institutions that have provided them
- Analyze support counts and comment counts to identify high-engagement resolved complaints
- Research how sub-units of large ministries relate to their parent institutions
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does LAPOR! have an official developer API?+
What does get_institution_detail return that search_institutions does not?+
search_institutions endpoint returns name, type, parent institution, and SMS prefix — enough to build a list. The get_institution_detail endpoint adds rating, followers count, contact fields (email, phone, address when available), sub-units, and an array of success stories linked to that institution. You need the slug from the search results to call the detail endpoint.Does list_complaints return all complaints on LAPOR!, or only resolved ones?+
Can I filter complaints by institution or by date?+
list_complaints endpoint currently accepts only a page parameter; there is no filter by institution slug, date range, or category. You can fork this API on Parse and revise it to add filtered complaint queries by institution or time period.Is there a limit to how many institutions are returned per page from search_institutions?+
total_pages field in the response tells you how many pages exist for a given query so you can paginate through the full result set. Very broad queries (empty query string) will have more pages than narrowly scoped keyword searches.