PapaCambridge APIpapacambridge.com ↗
Access the PapaCambridge CAIE past-paper library via API: list subjects by level, browse exam-session folders, retrieve PDF URLs, and search by subject code or name.
What is the PapaCambridge API?
The PapaCambridge API exposes 4 endpoints that give structured access to the CAIE past-paper library at papacambridge.com. Use list_subjects to enumerate every subject under a qualification level (AS & A Level, IGCSE, O Level, Pre U), list_subject_folders to browse exam-session and collection folders within a subject, list_papers to retrieve direct PDF URLs for question papers, mark schemes, grade thresholds, examiner reports, and inserts, and search_resources to find subjects by code or name fragment.
curl -X GET 'https://api.parse.bot/scraper/184029b8-0d39-481a-967f-85f5ad83f1e4/list_subjects?level=igcse' \ -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 papacambridge-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: PapaCambridge SDK — browse CAIE past papers end-to-end."""
from parse_apis.papacambridge_com_api import PapaCambridge, Level, PaperType, InputNotFound
client = PapaCambridge()
# List the first few IGCSE subjects.
for subject in client.subjects.list(level=Level.IGCSE, limit=5):
print(subject.subject_name, subject.subject_code)
# Drill into the first subject's exam-session folders.
subject = client.subjects.list(level=Level.IGCSE, limit=1).first()
if subject is not None:
for folder in subject.folders.list(limit=5):
print(folder.name, folder.kind, folder.year, folder.session)
# Open the newest folder and list its mark-scheme papers.
folder = subject.folders.list(limit=1).first()
if folder is not None:
for paper in folder.papers.list(paper_type=PaperType.MARK_SCHEME, limit=10):
print(paper.title, paper.paper_number, paper.variant)
print(" ", paper.pdf_url)
# Search by subject code; results span Past Papers, Notes, etc.
for hit in client.resources.search(query="9709", limit=5):
print(hit.name, hit.resource_type, hit.board, hit.subject_slug)
# Point-construct a known subject and list its folders directly.
try:
known = client.subject(subject_slug="igcse-accounting-0452")
for folder in known.folders.list(limit=3):
print(folder.name, folder.folder_slug)
except InputNotFound:
print("subject not found")
print("exercised: subjects.list / folders.list / papers.list / resources.search / subject()")
Lists every subject folder under one CAIE qualification level (AS & A Level, IGCSE, O Level or Pre U), one row per subject with its display name, parsed subject name, 4-digit subject code and the subject_slug consumed by list_subject_folders. One site request per call; the full list (roughly 40–150 subjects per level) is fetched once and paged locally with page/per_page (page defaults to 1, per_page to 50, max 200). Subjects are ordered alphabetically as the site lists them. Only the CAIE board is hosted on the site's free past-paper library; other boards are not available here.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page of the locally paged subject list. |
| levelrequired | string | Qualification level slug. |
| per_page | integer | Subjects per page; values above 200 are clamped to 200. |
{
"type": "object",
"fields": {
"board": "exam board code, always CAIE for this library",
"level": "level display name from the site",
"subjects": "array of subject rows: subject_slug (input to list_subject_folders), name (site display name), subject_name (name without code; a regional suffix is appended in parentheses), subject_code (4-digit code, null when the folder name carries none)",
"level_slug": "level slug as passed",
"pagination": "page, per_page, total (subjects on the level), has_more"
},
"sample": {
"data": {
"board": "CAIE",
"level": "IGCSE",
"subjects": [
{
"name": "Accounting - 0452",
"subject_code": "0452",
"subject_name": "Accounting",
"subject_slug": "igcse-accounting-0452"
},
{
"name": "Accounting - 0985",
"subject_code": "0985",
"subject_name": "Accounting",
"subject_slug": "igcse-accounting-0985"
}
],
"level_slug": "igcse",
"pagination": {
"page": 1,
"total": 148,
"has_more": true,
"per_page": 5
}
},
"status": "success"
}
}About the PapaCambridge API
Subject and Folder Navigation
Start with list_subjects, passing a level slug (e.g. as-a-level, igcse). The response returns an array of subject rows under subjects, each carrying a subject_slug (used as input to downstream endpoints), a name (site display name including code), a parsed subject_name (name without the code), and a 4-digit subject_code. A pagination object reports page, per_page, total, and has_more; per_page is clamped to 200. Pass the subject_slug to list_subject_folders to get its folder list. Each folder row includes folder_slug, name, kind (exam_session or collection), and for exam-session folders, parsed year (integer) and session (e.g. Oct-Nov). Collection folders — such as Solved Past Papers or Topical Past Papers — return null for year and session.
Retrieving Papers
list_papers takes a folder_slug and returns paginated papers rows. Each row includes title, filename, pdf_url (a direct link to the PDF file), viewer_url (the site's viewer page for that document), and parsed metadata: paper_type_code (e.g. qp, ms, gt, er), a human-readable paper_type, and additional CAIE file-name components. Use the paper_type filter parameter to narrow results to a single document type — pass qp for question papers or ms for mark schemes, for example. The response also reflects the year, session, subject, level, and board context inherited from the folder.
Searching by Code or Name
search_resources accepts a query string — a 4-digit subject code like 9709 or a name fragment like accounting — and returns matching entries across the PapaCambridge resource index. Each result row includes name, resource_type (one of Past Papers, Notes, Syllabus, E Books, Others), board (upper-case code), url (the resource page), and subject_slug for Past Papers hits, which can feed directly into list_subject_folders. The total field reports the number of rows returned.
Coverage Scope
All data is scoped to the CAIE board; the board field in every response always returns CAIE. The library covers AS & A Level, IGCSE, O Level, and Pre U qualifications. Individual papers are identified by filename following CAIE naming conventions, so parsed metadata like paper_type_code and year depends on those conventions holding.
The PapaCambridge API is a managed, monitored endpoint for papacambridge.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when papacambridge.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 papacambridge.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 revision tool that lets students filter past papers by qualification level, subject code, and exam session using
list_subjectsandlist_papers. - Aggregate direct PDF links for all mark schemes (
paper_type=ms) across multiple CAIE subjects for offline download pipelines. - Power a subject-search autocomplete using
search_resourceswith partial name or 4-digit code queries. - Construct a full paper index for a school portal by paginating through
list_subjectsacross all four qualification levels. - Track which exam sessions are available for a given subject by inspecting
yearandsessionfields fromlist_subject_folders. - Identify non-session resource collections (Topical Past Papers, Solved Past Papers) via
kind=collectionrows in folder listings. - Cross-reference grade threshold documents (
paper_type_code=gt) alongside question papers for a given exam session.
| 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 PapaCambridge have an official developer API?+
What does `list_papers` return, and how do I filter to a specific document type?+
papers array includes title, filename, pdf_url, viewer_url, paper_type_code (such as qp, ms, gt, er), and a human-readable paper_type. Pass the optional paper_type parameter with a code like ms to keep only mark schemes, or qp to keep only question papers. Omitting the parameter returns all file types in the folder.Does `list_subject_folders` separate exam-session folders from other collections?+
kind field. Folders with kind=exam_session carry a parsed integer year and a session string (e.g. Oct-Nov). Folders with kind=collection — such as Topical Past Papers — have null for both year and session.Does the API expose individual chapter notes, e-books, or syllabus PDFs for a subject, not just past papers?+
search_resources returns result rows with a resource_type field that includes Notes, Syllabus, and E Books entries alongside Past Papers, and each row carries a url to the resource page. However, there is no endpoint that lists or paginates the individual files within those non-past-paper resource types. You can fork this API on Parse and revise it to add endpoints that enumerate files inside Notes or Syllabus folders.Is pagination available when a subject has many papers in a folder?+
list_papers and list_subjects both support page and per_page parameters. The response includes a pagination object with page, per_page, total, and has_more. The maximum per_page is clamped to 200; requests above that value are silently reduced to 200.