Discover/PapaCambridge API
live

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.

Endpoint health
monitored
list_papers
list_subject_folders
list_subjects
search_resources
Checks pendingself-healing
Endpoints
4
Updated
2h ago

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.

This call costs1 credit / call— charged only on success
Try it
1-based page of the locally paged subject list.
Qualification level slug.
Subjects per page; values above 200 are clamped to 200.
→ api.parse.bot/scraper/184029b8-0d39-481a-967f-85f5ad83f1e4/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/184029b8-0d39-481a-967f-85f5ad83f1e4/list_subjects?level=igcse' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

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()")
All endpoints · 4 totalmissing one? ·

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.

Input
ParamTypeDescription
pageinteger1-based page of the locally paged subject list.
levelrequiredstringQualification level slug.
per_pageintegerSubjects per page; values above 200 are clamped to 200.
Response
{
  "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.

Reliability & maintenance

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?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Build a revision tool that lets students filter past papers by qualification level, subject code, and exam session using list_subjects and list_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_resources with partial name or 4-digit code queries.
  • Construct a full paper index for a school portal by paginating through list_subjects across all four qualification levels.
  • Track which exam sessions are available for a given subject by inspecting year and session fields from list_subject_folders.
  • Identify non-session resource collections (Topical Past Papers, Solved Past Papers) via kind=collection rows in folder listings.
  • Cross-reference grade threshold documents (paper_type_code=gt) alongside question papers for a given exam session.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does PapaCambridge have an official developer API?+
No. PapaCambridge does not publish an official developer API or documented data access layer. This Parse API provides structured programmatic access to the same library.
What does `list_papers` return, and how do I filter to a specific document type?+
Each row in the 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?+
Yes. Each folder row includes a 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?+
Not directly. 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.
Page content last updated . Spec covers 4 endpoints from papacambridge.com.
Related APIs in EducationSee all →