Developers

The Learnify Questions API

Build your own JAMB prep app, quiz bot or study tool on top of our bank of 10,800+ verified UTME past questions — 15 subjects, tagged by syllabus topic, complete with answers, explanations and reading passages.

Base URL: https://learnifyforjamb.netlify.app/api/v1

Authentication

Every endpoint (except the index at GET /api/v1) needs an API key. Send it as a Bearer token or with the X-API-Key header:

curl https://learnifyforjamb.netlify.app/api/v1/subjects \
  -H "Authorization: Bearer lfy_live_YOUR_KEY"
const res = await fetch("https://learnifyforjamb.netlify.app/api/v1/questions?subject=ENG&topic=eng-2&limit=20", {
  headers: { Authorization: "Bearer lfy_live_YOUR_KEY" },
});
const { data, meta } = await res.json();

Keep your key on your server, never in public client-side code. Keys can be rotated or revoked at any time — if yours leaks, ask us for a new one.

Endpoints

GET /subjects

All subjects in the bank with live question counts.

GET /topics?subject=ENG

The syllabus topics for one subject, each with its question count. Topic ids (e.g. eng-2) are what you pass to the questions endpoint.

GET /questions

Paginated questions. Query parameters:

  • subject — subject code, e.g. ENG, MTH, BIO (optional)
  • topic — a topic id from /topics (optional)
  • year — exam year, e.g. 2019 (optional)
  • limit — page size, 1–100 (default 50)
  • offset — pagination offset (default 0)
  • random=true — shuffle the results (for quiz apps)

GET /questions/{id}

One question by id.

A question looks like this

{
  "data": {
    "id": "eng-2019-q14",
    "subject": "ENG",
    "topicId": "eng-2",
    "topic": "Lexis & Vocabulary",
    "year": 2019,
    "questionNumber": 14,
    "question": "Choose the option nearest in meaning to...",
    "options": { "A": "...", "B": "...", "C": "...", "D": "..." },
    "correctOption": "B",
    "explanation": "...",
    "difficulty": "medium",
    "imageUrl": null,
    "images": [],
    "passage": null
  }
}

Comprehension and diagram questions carry a passage object with the shared text or image, so your app can render the stimulus with the question. List endpoints return { data: [...], meta: { total, limit, offset, returned } }.

Limits & errors

  • Free: 100 requests/month, 30 requests/minute
  • Premium: 10,000 requests/month, 120 requests/minute
  • Ultra: unlimited requests, 600 requests/minute
  • Monthly quotas reset on the 1st. Paid plans are billed once a year — see pricing below.
// Errors always look like this:
{ "error": { "code": "invalid_api_key", "message": "..." } }

// 401 missing_api_key / invalid_api_key
// 403 key_inactive
// 400 invalid_topic / invalid_year / missing_subject
// 404 subject_not_found / question_not_found
// 429 rate_limited / quota_exceeded

Pricing — simple, yearly, priced for Nigeria

One payment covers a full year of access. No per-request surprises, no foreign-currency card required.

Free

₦0

forever

  • 100 requests / month
  • 30 requests / minute
  • All 15 subjects & topics
  • Answers & explanations included

For trying the API and small school projects.

Most popular

Premium

₦25,000

per year (≈ ₦2,083/month)

  • 10,000 requests / month
  • 120 requests / minute
  • Everything in Free
  • Passages & diagram stimuli
  • Email support

For prep apps, quiz bots and tutorial centres.

Ultra

₦75,000

per year (≈ ₦6,250/month)

  • Unlimited requests
  • 600 requests / minute
  • Everything in Premium
  • Priority support
  • For platforms & school networks

For products serving thousands of students.

Compared with global question-bank APIs (often $10–$30/month billed in dollars), Learnify's yearly naira pricing keeps a full year of Premium under the cost of two months abroad.

Get an API key — self-serve

Your developer account is your Learnify account — no separate signup. Open the developer dashboard, create a key in seconds (Free plan included), and upgrade to Premium or Ultra whenever you're ready: checkout is automatic, payment is verified securely, and your plan activates instantly for a full year.