Co APIbri.co.id ↗
Access Bank BRI job vacancies via API. Paginated listings with filters by area, title, and position code, plus full job detail including description and deadline.
What is the Co API?
The BRI Careers API exposes 2 endpoints that cover Bank BRI's official e-recruitment portal, returning paginated job vacancy listings and full per-job detail. The list_jobs endpoint supports filtering by regional office, job title substring, position code, and vacancy status, while get_job returns the complete description, posting date, application deadline, placement location, and active/expired status for a single vacancy identified by its job ID.
curl -X GET 'https://api.parse.bot/scraper/75601d68-6fb6-4bba-833c-98ca282c48fb/list_jobs?area=KW07' \ -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 bri-co-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: BRI Careers SDK — browse vacancies and fetch full details."""
from parse_apis.bri_co_id_api import BriCareers, JobStatus, JobNotFound
client = BriCareers()
# List all expired vacancies, capped at 5 items total.
for summary in client.job_summaries.list(status=JobStatus.EXPIRED, limit=5):
print(summary.title, "|", summary.location, "| deadline:", summary.apply_before)
# Drill into the first result's full detail via typed navigation.
summary = client.job_summaries.list(status=JobStatus.EXPIRED, limit=1).first()
if summary is not None:
job = summary.details()
print(job.title)
print("posted:", job.posted_at, "| office:", job.regional_office)
print(job.description[:200])
# Point-lookup using the identifier discovered above.
if summary is not None:
try:
detail = client.jobs.get(job_id=summary.job_id)
print(detail.title, "—", detail.status)
except JobNotFound:
print("job no longer listed")
print("exercised: job_summaries.list / details / jobs.get")
Returns one page of job vacancies from BRI's e-recruitment portal, newest first, exactly as the site lists them: 5 jobs per page (fixed by the site). Each row carries the job title, the hiring regional office (location), the position/job family the site classifies the vacancy under, the application deadline (ISO date plus the site's own text), the site's active/expired status badge, the job_id and the direct URL of the listing page. Pagination is offset-based: pass `offset` (0, 5, 10, ...) and follow `next_offset` until `has_more` is false; `total` is the site's count for the current filter combination. Optional filters are forwarded to the site: free-text title search, hiring area (regional office code), position code, and active/expired status. An empty filter result (for example status=active when no vacancy is open) is a successful response with `jobs: []` and `total: 0`. The posting (publication) date is not shown in the list; use get_job for it.
| Param | Type | Description |
|---|---|---|
| area | string | Hiring area (regional office) code. Omitted = all areas. |
| title | string | Free-text search over the job title (case-insensitive substring, e.g. mantri). Omitted = no title filter. |
| offset | integer | Zero-based index of the first job to return; the site pages in steps of 5. Use `next_offset` from the previous response. |
| status | string | Filter by the site's vacancy status. Omitted = both active and expired vacancies. |
| position | string | Position code from the site's position dropdown (e.g. JAM = Junior Associate Mantri, AO1 = Relationship Manager Kredit, FO1 = Relationship Manager Dana). Unknown codes are forwarded to the site and simply yield an empty result. Omitted = all positions. |
{
"type": "object",
"fields": {
"jobs": "array of job rows on this page (title, location = hiring regional office, position, apply_before ISO date, apply_before_text as displayed, status active|expired, job_id, url)",
"total": "site-reported number of jobs matching the current filters",
"offset": "offset echoed for this page",
"has_more": "true when another page exists",
"next_offset": "offset to request the next page, or null on the last page"
},
"sample": {
"data": {
"jobs": [
{
"url": "https://e-recruitment.bri.co.id/jobs/view/v04Gn25Wop5EeVNO",
"title": "PEMBUKAAN REKRUTMEN BRILIAN BANKING ASSOCIATE PROGRAM (BBAP) BATCH 2 TAHUN 2026 REGION 11 / YOGYAKARTA",
"job_id": "v04Gn25Wop5EeVNO",
"status": "expired",
"location": "Regional Office Yogyakarta",
"position": "Junior Associate Mantri",
"apply_before": "2026-07-31",
"apply_before_text": "Jul 2026, 31"
}
],
"total": 3,
"offset": 0,
"has_more": false,
"next_offset": null
},
"status": "success"
}
}About the Co API
What the API Returns
The list_jobs endpoint returns up to 5 job rows per page — the fixed page size used by BRI's portal — ordered newest first. Each row includes the job title, the hiring regional office (location), a position/job-family label, the application deadline as both an ISO date (apply_before) and the site's original display text, and a job_id you can pass to the detail endpoint. The total field reports how many vacancies match the active filters, and has_more / next_offset let you walk through subsequent pages by passing next_offset as the offset parameter on the next call.
Filtering and Pagination
list_jobs accepts four optional filters: area (regional office code), title (case-insensitive substring match against the job title), position (a position code from the site's dropdown, e.g. JAM for Junior Associate Mantri or AO1 for Relationship Manager), and status (to restrict results to active or expired vacancies only). Omitting all filters returns all vacancies across all areas and positions. Pagination is zero-based via the offset parameter; increment by 5 or use the next_offset value from the previous response.
Job Detail
The get_job endpoint accepts a job_id (the opaque identifier from list_jobs.jobs[*].job_id) and returns the full vacancy record: title, regional_office, location (placement city/region, which can differ from the hiring office), position, status (active or expired), posted_at as ISO YYYY-MM-DD (null if the site text is unparseable), posted_at_text as the site's literal display string, apply_before deadline, the description as newline-separated paragraphs, and the canonical url of the listing page.
The Co API is a managed, monitored endpoint for bri.co.id — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bri.co.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 bri.co.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?+
- Aggregate BRI open positions into an internal HR dashboard filtered by regional office using the
areaparameter - Build a job-alert service that polls
list_jobswith atitlekeyword and notifies users when new matches appear - Track application deadlines across BRI vacancies by reading the
apply_beforeISO date field fromlist_jobs - Display the full job description and placement location on a third-party careers site using
get_job - Monitor whether previously listed vacancies have changed status from active to expired via the
statusfield inget_job - Filter vacancies by position code (e.g.
JAM,AO1) to surface only relevant roles for a specific candidate profile
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Bank BRI provide an official developer API for its job listings?+
How does pagination work in `list_jobs`, and why are there always exactly 5 results per page?+
offset parameter controls the zero-based starting index. Each response includes has_more (boolean) and next_offset (integer or null); pass next_offset as offset in your next call to advance through pages. On the last page, next_offset is null.What is the difference between `location` and `regional_office` in the `get_job` response?+
regional_office is the BRI hiring unit responsible for the vacancy (e.g. a regional kanwil). location is the city or region where the selected candidate will actually be placed. These can differ — for example, a Kanwil Jakarta posting may place the hire in a branch outside Jakarta.Does the API cover BRI internship programs or PKWT contract postings separately from regular vacancies?+
description field in get_job may contain employment-type details in the body text. You can fork this API on Parse and revise it to add an employment-type filter if BRI introduces that field on the portal.Can I retrieve the list of valid `area` or `position` filter codes?+
JAM (Junior Associate Mantri) and AO1 (Relationship Manager). You can fork this API on Parse and revise it to add a lookup endpoint that returns the full set of dropdown values.