QConcursos APIqconcursos.com ↗
Access Brazilian public exam questions from QConcursos. Search by keyword, discipline, banca, year, and difficulty. Get question details, subjects, and examining boards.
What is the QConcursos API?
The QConcursos API exposes 5 endpoints for accessing Brazilian concurso público (public exam) questions, covering search with multi-dimensional filters, full question detail retrieval, and reference lists for disciplines, examining boards, and subjects. The search_questions endpoint alone supports eight filter parameters including difficulty level, modality, year, and institution, returning 20 questions per page with total count and pagination metadata.
curl -X GET 'https://api.parse.bot/scraper/08cf3fe4-249a-41cf-b993-4854ddccbcd7/search_questions?page=1&year=2024&keyword=administra%C3%A7%C3%A3o' \ -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 qconcursos-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: QConcursos SDK — search Brazilian public exam questions."""
from parse_apis.qconcursos_com_api import QConcursos, QuestionNotFound
client = QConcursos()
# List available disciplines to find the right ID for filtering
for disc in client.disciplines.list(limit=5):
print(disc.id, disc.name)
# Search questions filtered by discipline and year
for question in client.questions.search(discipline_ids="3", year="2024", limit=3):
print(question.year, question.banca, question.enunciation[:80])
for alt in question.alternatives:
print(f" {alt.letter}: {alt.text[:60]}")
# Drill-down: fetch a single question by slug
first = client.questions.search(keyword="constituição", limit=1).first()
if first:
detail = client.questions.get(slug=first.slug)
print(detail.discipline, detail.orgao, detail.prova)
# List examining boards for reference
for board in client.examining_boards.list(limit=3):
print(board.acronym, board.name)
# Typed error handling: catch a missing question
try:
client.questions.get(slug="nonexistent-slug-000")
except QuestionNotFound as exc:
print(f"Question not found: {exc.slug}")
print("exercised: disciplines.list / questions.search / questions.get / examining_boards.list")
Search and filter public exam questions. Supports keyword search, filtering by discipline, subject, examining board, institution, job, year, scholarity level, modality, and difficulty. Returns 20 questions per page. Results are ordered by most recent by default.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| year | string | Comma-separated publication years to filter by (e.g. '2024' or '2023,2024'). |
| job_ids | string | Comma-separated job/position IDs to filter by. |
| keyword | string | Free-text keyword to search in question content. |
| difficulty | string | Comma-separated difficulty levels: 1 (Muito Fácil), 2 (Fácil), 3 (Médio), 4 (Difícil), 5 (Muito Difícil). |
| subject_ids | string | Comma-separated subject IDs to filter by. IDs from list_subjects endpoint. |
| modality_ids | string | Comma-separated modality IDs: 1 (Múltipla Escolha), 2 (Certo ou Errado). |
| institute_ids | string | Comma-separated institution/organization IDs to filter by. |
| discipline_ids | string | Comma-separated discipline IDs to filter by (e.g. '26' or '26,21'). IDs from list_disciplines endpoint. |
| scholarity_ids | string | Comma-separated scholarity level IDs: 1 (Fundamental), 2 (Médio), 3 (Superior). |
| examining_board_ids | string | Comma-separated examining board IDs to filter by. IDs from list_examining_boards endpoint. |
{
"type": "object",
"fields": {
"page": "integer",
"total": "integer",
"questions": "array of question objects",
"total_pages": "integer"
},
"sample": {
"data": {
"page": 1,
"total": 7737,
"questions": [
{
"id": "2524206",
"slug": "e9b62ae1-39",
"year": "2024",
"banca": "CESPE / CEBRASPE",
"orgao": "Câmara de Maceió - AL",
"prova": "CESPE / CEBRASPE - 2024 - Câmara de Maceió - AL - Apoio Legislativo",
"answer": "",
"subjects": [
"Organização dos Poderes"
],
"banca_slug": "cespe-cebraspe",
"discipline": "Direito Constitucional",
"enunciation": "Acerca do contencioso administrativo...",
"alternatives": [
{
"text": "Certo",
"letter": ""
},
{
"text": "Errado",
"letter": ""
}
],
"discipline_id": "3",
"comments_count": 22
}
],
"total_pages": 387
},
"status": "success"
}
}About the QConcursos API
Search and Filter Exam Questions
The search_questions endpoint is the primary entry point for finding questões de concursos. It accepts a keyword for free-text search and a range of structured filters: discipline_ids, subject_ids, institute_ids, job_ids, year (comma-separated for multi-year ranges), difficulty (1–5 scale from Muito Fácil to Muito Difícil), and modality_ids (1 for Múltipla Escolha, 2 for Certo ou Errado). Results default to most-recent ordering and return a questions array alongside total, total_pages, and page fields for cursor-based pagination.
Full Question Detail
The get_question endpoint takes a slug (obtained from search results, e.g. '10131b30-79') and returns the complete question record. Response fields include id, slug, year, banca, banca_slug, orgao, prova, discipline, subjects (array of subject names), and answer when publicly available. This gives enough context to reconstruct which exam the question belongs to and where it sits in the subject hierarchy.
Reference Lists for Filter IDs
Three lookup endpoints provide the IDs required by the search filters. list_disciplines returns all available disciplines with id and name in Portuguese. list_examining_boards returns all bancas with id, acronym, and full name. list_subjects requires one or more discipline_ids (comma-separated) and returns a flat list of subjects with id, name, discipline_id, discipline_name, and nested_subjects for hierarchical navigation. These reference endpoints carry no required inputs except list_subjects, which needs at least one discipline ID.
The QConcursos API is a managed, monitored endpoint for qconcursos.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when qconcursos.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 qconcursos.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?+
- Build a study platform that lets users filter practice questions by banca (e.g. CESPE, FCC) and discipline using
list_examining_boardsandsearch_questions. - Track year-over-year question distribution for a specific examining board by querying
search_questionswith differentyearvalues. - Generate topic-specific question sets by combining
list_subjectswithsubject_idsinsearch_questionsfor targeted practice sessions. - Classify questions by difficulty (1–5) to build adaptive quizzes that adjust based on user performance.
- Retrieve full question text and official answers via
get_questionto populate a question bank for a mobile exam-prep app. - Map the subject hierarchy for a given discipline using
list_subjectsnested_subjectsfield to display a structured syllabus browser. - Filter questions by modality to separate multiple-choice (
modality_ids=1) from true/false (modality_ids=2) sets for different test formats.
| 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 QConcursos have an official developer API?+
What does `get_question` return and when is the answer available?+
enunciation, alternatives, year, banca, orgao, prova, discipline, and a subjects array. The answer field is populated only when QConcursos makes the gabarito publicly available for that question; it will be absent or null for questions without a published answer.Does `search_questions` return the full question text, or just metadata?+
get_question using the slug from the search result.Is there a way to filter by institution or job position, and where do those IDs come from?+
search_questions accepts institute_ids and job_ids as comma-separated strings. However, the current API does not include dedicated list endpoints for institutions or job positions the way it does for disciplines, examining boards, and subjects. You can fork the API on Parse and revise it to add those lookup endpoints.