Kitabisa APIkitabisa.com ↗
Access Kitabisa campaign listings, donor data, fundraiser profiles, categories, and search via a structured JSON API. 8 endpoints covering Indonesia's largest crowdfunding platform.
What is the Kitabisa API?
The Kitabisa API provides structured access to 8 endpoints covering Indonesia's largest crowdfunding platform, including campaign listings, donor records, fundraiser profiles, and keyword search. The get_campaign_detail endpoint returns the full campaign object — HTML description, donation totals, donor count, campaigner info, and campaign status — while get_campaign_donors exposes individual donation records with amount, timestamp, and anonymity flag.
curl -X GET 'https://api.parse.bot/scraper/cd131fa0-0793-4134-b338-fa4ef93229b0/list_campaigns?sort=terbaru&limit=5&offset=0&category_id=5&campaign_type=regular' \ -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 kitabisa-com-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: Kitabisa SDK — browse campaigns, search, drill into details and donors."""
from parse_apis.kitabisa_fundraising_api import (
Kitabisa, CampaignSort, DonorSort, CampaignNotFound
)
client = Kitabisa()
# List all categories to discover what's available
for cat in client.categories.list(limit=5):
print(cat.name, cat.slug)
# Construct a category by slug and browse its campaigns
disaster = client.category("bencana-alam")
for campaign in disaster.campaigns(sort=CampaignSort.TERBARU, limit=3):
print(campaign.title, campaign.donation_received, campaign.donation_target)
# Search campaigns by keyword, take the first result and drill into full details
result = client.campaignsummaries.search(query="pendidikan", limit=1).first()
if result:
detail = result.details()
print(detail.title, detail.donation_count, detail.campaign_status.name)
# Browse donors for this campaign
for donor in detail.donors.list(sort=DonorSort.LATEST, limit=3):
print(donor.user.name, donor.amount, donor.is_anonymous)
# Typed error handling: catch not-found on a bad slug
try:
client.campaignsummaries.search(query="nonexistent_xyz_123", limit=1).first()
except CampaignNotFound as exc:
print(f"Campaign not found: {exc.slug}")
print("exercised: categories.list / category.campaigns / campaignsummaries.search / details / donors.list")
Fetch a paginated list of fundraising campaigns with optional filters and sorting. Returns campaigns ordered by the specified sort parameter. Use offset/limit for manual pagination.
| Param | Type | Description |
|---|---|---|
| sort | string | Sort order for campaigns. |
| limit | integer | Number of campaigns to return per page. |
| offset | integer | Offset for pagination. |
| category_id | integer | Filter by category ID. Category IDs can be obtained from get_categories endpoint. |
| campaign_type | string | Filter by campaign type. Accepted values: 'regular', 'pool_of_fund'. |
{
"type": "object",
"fields": {
"items": "array of campaign summary objects with id, title, short_url, campaigner, donation_target, donation_received, category_name, campaign_type, days_remaining, and more"
},
"sample": {
"data": {
"items": [
{
"id": 729945,
"title": "KRISIS IKLIM! Ikut Jaga Bumi Sekarang!",
"short_url": "generasijagabumi",
"campaigner": "CollabForChange",
"campaign_type": "pool_of_fund",
"category_name": "Lingkungan",
"days_remaining": 4240,
"campaigner_type": "ORGANIZATION",
"donation_target": 350000000,
"donation_received": 180166246,
"is_forever_running": true,
"donation_percentage": 0.5147607
}
]
},
"status": "success"
}
}About the Kitabisa API
Campaign Discovery and Filtering
The list_campaigns endpoint returns paginated campaign summaries with fields including id, title, short_url, campaigner, donation_target, donation_received, and category_name. You can sort by parameters like terbaru (newest) and filter by category_id obtained from get_categories. The list_campaigns_by_category endpoint accepts a category_slug directly — slugs like bencana-alam, bantuan-medis, or beasiswa-pendidikan — and resolves the ID internally, making it easier to browse thematically without a prior category lookup. Note that campaign_type filtering (e.g. regular, pool_of_fund) is accepted as a parameter but may not be strictly enforced server-side.
Campaign Detail and Updates
get_campaign_detail accepts a slug from the short_url field of any listing and returns the full campaign object: HTML-formatted description, donation_count, donation_target, donation_received, campaigner details, and current campaign status. For ongoing transparency, get_campaign_latest_news accepts a numeric campaign_id and returns update posts with title, HTML content, and a Unix published timestamp — useful for tracking how actively a campaign communicates with donors.
Donors and Fundraiser Profiles
get_campaign_donors returns up to 10 recent verified donations per campaign, each with amount, verified Unix timestamp, is_anonymous flag, and associated user info. The sort parameter accepts verified or latest. To go deeper on a campaign organizer, get_fundraiser_profile takes the secondary_id hash found in campaign detail responses under campaigner.secondary_id and returns the fundraiser's full_name, biography, avatar URL, is_verified status, and active_since timestamp.
Search and Categories
search_campaigns accepts a query string and optional page and per_page parameters. A minimum per_page of 5 is required for results to be returned — lower values yield empty responses. get_categories requires no inputs and returns the complete category list with id, name, slug, and icon URL, which feeds directly into the filtering parameters of both listing endpoints.
The Kitabisa API is a managed, monitored endpoint for kitabisa.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when kitabisa.com 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 kitabisa.com 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?+
- Aggregate active disaster-relief campaigns using the
bencana-alamcategory slug and trackdonation_receivedover time. - Monitor donor activity on a specific campaign by polling
get_campaign_donorsand recording new entries byverifiedtimestamp. - Build a campaign search tool that queries
search_campaignsby keyword and surfacesdonation_target,donation_received, andcampaignerfor each result. - Profile fundraiser credibility by combining
get_fundraiser_profilefields (is_verified,active_since,biography) with their active campaign data. - Track campaign transparency by ingesting
get_campaign_latest_newsupdate posts and alerting when no new updates have been published within a threshold period. - Classify and count active campaigns across all categories using
get_categoriesIDs paired with paginatedlist_campaignscalls. - Compare fundraising progress across medical aid campaigns by filtering
list_campaignswith thebantuan-medisslug and comparingdonation_receivedtodonation_target.
| 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 Kitabisa have an official developer API?+
What does `get_campaign_donors` actually return, and how many records does it give per call?+
campaign_id. Each record includes amount, a verified Unix timestamp, an is_anonymous flag, and associated user info. The sort parameter accepts verified or latest to change ordering, but the page size is fixed at 10 results.Is there any way to get the total donation history for a campaign, not just the 10 most recent donors?+
get_campaign_donors endpoint returns a fixed page of up to 10 donors and does not support arbitrary pagination through full donation history. The get_campaign_detail endpoint does expose aggregate donation_count and donation_received totals. You can fork this API on Parse and revise it to add a paginated donor history endpoint if deeper history access is needed.Does the API cover Kitabisa Zakat or emergency-specific sub-platforms separately from regular campaigns?+
campaign_type values like regular and pool_of_fund is not currently available as a separate endpoint or filter. You can fork the API on Parse and revise it to add a dedicated endpoint targeting a specific campaign type or sub-platform.Why does `search_campaigns` return empty results even when I pass a valid query?+
per_page parameter must be set to a minimum of 5 for the endpoint to return results. Passing a value below 5 — or omitting it with a default that falls below the threshold — will produce an empty response array even for queries that match active campaigns.