Pintarnya APIpintarnya.com ↗
Access job listings from Pintarnya via API. Search by keyword, location, salary, and education level. Get full job details including employer info and requirements.
What is the Pintarnya API?
The Pintarnya API provides 2 endpoints to search and retrieve job listings from Indonesia's Pintarnya platform, which targets candidates across all education levels. The search_jobs endpoint returns paginated job summaries filterable by province, city, salary range in IDR, employment type, and work type. The get_job_details endpoint returns a full listing record including job description, employer profile, granular location data, and validity dates.
curl -X GET 'https://api.parse.bot/scraper/4e5ff3cb-9210-4ab1-9c3c-cc096381b396/search_jobs?page=1&sort=%2Bdistance&search=driver&page_size=5' \ -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 pintarnya-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.
"""Pintarnya Jobs API — search Indonesian job listings and drill into details."""
from parse_apis.pintarnya_jobs_api import Pintarnya, Sort, JobNotFound
client = Pintarnya()
# Search for driver jobs sorted by distance, capped at 5 results
for job in client.jobsummaries.search(search="driver", sort=Sort.DISTANCE, limit=5):
print(job.title, job.city, f"IDR {job.min_salary}-{job.max_salary}")
# Drill into the first result for full details
summary = client.jobsummaries.search(search="marketing", limit=1).first()
if summary:
detail = summary.details()
print(detail.title, detail.employer.name, detail.employer.industry)
print(detail.location.city, detail.location.address)
for req in detail.requirements:
print(req.label, req.value)
# Fetch a specific job by slug and handle not-found
try:
job = client.jobs.get(slug="driver-direksi-680749")
print(job.title, job.salary.min_salary, job.total_vacancies)
except JobNotFound as exc:
print(f"Job not found: {exc.slug}")
print("exercised: jobsummaries.search / summary.details / jobs.get / JobNotFound")
Search for job openings on Pintarnya. Returns paginated results sorted by relevance by default. Supports keyword search and filtering by location (province/city), salary range, employment type, work type, and education level. Each result is a summary; use get_job_details with the slug for full information including description and requirements.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination, starting from 1. |
| sort | string | Sort order for results. Omit or pass empty string for default relevance sorting. |
| search | string | Keyword to search for in job titles and descriptions. |
| city_id | string | City ID to filter jobs by city (e.g. '152' for Kota Adm. Jakarta Pusat). |
| page_size | string | Number of results per page. |
| max_salary | string | Maximum salary filter in IDR. |
| min_salary | string | Minimum salary filter in IDR (e.g. '4000000'). |
| province_id | string | Province ID to filter jobs by province (e.g. '11' for DKI Jakarta). |
| type_of_work | string | Work type filter ID. |
| type_of_employment | string | Employment type filter ID. |
| min_education_level | string | Minimum education level filter ID. |
{
"type": "object",
"fields": {
"jobs": "array of job summary objects including id, title, slug, employer info, location, salary, work type, shift, skills, documents, age range, vacancies, and timestamps",
"page": "integer current page number",
"page_size": "integer results per page",
"total_data": "integer total number of matching jobs",
"total_page": "integer total number of pages"
},
"sample": {
"data": {
"jobs": [
{
"id": 680749,
"city": "Kota Adm. Jakarta Pusat",
"slug": "driver-direksi-680749",
"title": "Driver Direksi area Jakarta Pusat",
"gender": "Pria",
"skills": [
"Mengendarai Kendaraan Manual"
],
"city_id": 152,
"max_age": 40,
"min_age": 17,
"province": "DKI Jakarta",
"documents": [
"KTP",
"SIM A"
],
"created_at": "2025-08-04T09:44:35.097Z",
"expired_at": "2026-07-07T17:00:00Z",
"max_salary": 6000000,
"min_salary": 5300000,
"updated_at": "2026-06-08T07:51:36.8Z",
"is_verified": true,
"province_id": 11,
"published_at": "2026-06-08T07:51:36.8Z",
"type_of_work": "Onsite",
"employer_logo": "https://cdn.pintarnya.com/images/employer/logo_ish_1738898247.jpeg",
"employer_name": "PT Infomedia Solusi Humanika",
"type_of_shift": "Day",
"interview_type": "SCHEDULED_INTERVIEW",
"type_of_source": "Direct",
"total_vacancies": 3,
"is_urgently_needed": false,
"min_education_level": "SMA/SMK",
"type_of_employments": [
"Full-Time"
],
"years_of_experience": 1,
"employer_is_bigbrand": false
}
],
"page": 1,
"page_size": 5,
"total_data": 1344,
"total_page": 269
},
"status": "success"
}
}About the Pintarnya API
What the API covers
The Pintarnya API surfaces job listings from pintarnya.com, an Indonesian platform that indexes roles from blue-collar and entry-level positions through professional vacancies. The search_jobs endpoint accepts a search keyword, geographic filters (province_id and city_id), salary bounds (min_salary, max_salary in IDR), and pagination controls (page, page_size). Results include an array of job summary objects alongside a pagination object carrying total_data and total_page so you can walk through full result sets.
Job detail fields
The get_job_details endpoint takes a slug — returned directly from search_jobs results — and returns the complete record for that listing. Response fields include title, a salary object with min_salary and max_salary, a description string with the full job posting text, a skills array, and created_at/expired_at ISO datetimes for tracking listing freshness. The employer object contains the company name, about text, logo_url, industry classification, a is_bigbrand boolean flag, and a web_link. Location is broken down to city, district, subdistrict, address, and postal_code.
Filtering and sorting
search_jobs supports a sort parameter with three accepted values: +distance for proximity-based ordering, -recommend for recommendation-ranked results, or an empty string for the default sort. Geographic filtering can be applied at the province level via province_id (e.g. 11 for DKI Jakarta) or narrowed to a specific city using city_id (e.g. 155 for Kota Adm. Jakarta Selatan). Salary filters accept raw IDR integers, making it straightforward to scope results to a specific compensation band.
The Pintarnya API is a managed, monitored endpoint for pintarnya.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when pintarnya.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 pintarnya.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 Indonesian job market data by province or city using province_id and city_id filters
- Build salary benchmarking tools using min_salary and max_salary fields returned in job details
- Track employer hiring activity by monitoring the employer.name and employer.industry fields over time
- Flag expiring job listings by comparing expired_at dates against the current date
- Identify in-demand skills by collecting and aggregating the skills arrays across many listings
- Power a job alert system by polling search_jobs with specific keywords and salary thresholds
- Enrich a company directory with hiring signals using the employer.is_bigbrand flag and web_link
| 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.