Back to Blog

How to build a JAMB CBT app

Building a JAMB CBT app requires more than displaying past questions on a screen. A useful UTME practice app needs structured question data, exam timing, subject selection, question navigation, automatic scoring, explanations and reliable handling of student progress.

The easiest way to approach the project is to separate it into two parts:

CBT Application
      +
Question Data

Your application handles the user experience, while a question-data source such as SdashAPI can provide structured UTME questions through an API.

1. Decide what your JAMB CBT app will do

Before writing code, define the first version.

A simple JAMB CBT app might include:

  • User registration
  • Subject selection
  • Practice mode
  • Timed mock examination
  • Previous and Next navigation
  • Question palette
  • Automatic scoring
  • Explanations after submission
  • Result history

Don't try to build every possible feature at once.

Get the actual examination flow working first.

2. Choose your technology

You can build the application with almost any modern framework.

For mobile:

React Native
Flutter
Kotlin
Swift

For web:

React
Next.js
Vue
Angular

Your backend could use Node.js, PHP, Python, Java or another technology you're comfortable with.

A typical architecture is:

Mobile App / Website
        ↓
Your Backend
        ↓
Question API

This also keeps sensitive production API credentials away from public frontend code.

3. Get your JAMB question data

You now need actual UTME questions.

You have three main options:

Build the database yourself. You manually collect, structure, correct and maintain the questions.

License a dataset. You obtain structured data and store it in your own database.

Use an API. Your backend requests questions when needed.

SdashAPI provides an API-based option for developers who don't want to spend most of their development time manually building the question database.

For more detail on this part, see JAMB question bank for CBT app.

4. Connect your application to the question API

Your application should be able to specify what it needs.

For example:

Exam: UTME
Subject: Biology
Year: 2024
Limit: 40

Your backend sends the request and receives structured question data.

A simplified response could contain:

{
  "id": 89421,
  "question": "Which of the following is correct?",
  "option": {
    "a": "Option A",
    "b": "Option B",
    "c": "Option C",
    "d": "Option D"
  },
  "answer": "b",
  "solution": "Explanation of the answer.",
  "examtype": "UTME",
  "examyear": "2024"
}

Check the current request format and available parameters in the SdashAPI Documentation.

You can also read JAMB questions JSON API for the JSON-specific approach.

5. Build the question screen

Your main CBT screen should be simple.

For example:

Question 12 of 40                 21:45

Which of the following is...?

A. Option A

B. Option B

C. Option C

D. Option D

[ Previous ]              [ Next ]

Students should immediately understand:

  • Which question they're answering
  • Which option they selected
  • How much time remains
  • How to move between questions

Avoid overcrowding this screen with unnecessary features.

6. Add question navigation

Students should be able to move around the examination.

A question palette can show:

1  2  3  4  5
6  7  8  9  10
...

You can visually distinguish:

Answered
Not answered
Current question
Flagged for review

Store the student's selected answer against the question ID.

For example:

{
  "question_id": 89421,
  "selected_answer": "c"
}

This means moving to another question doesn't erase the previous answer.

7. Add the CBT timer

For mock examination mode, create a countdown timer.

When it reaches zero:

00:00
  ↓
Automatically submit examination

Save examination progress periodically so that a temporary application restart doesn't necessarily destroy the student's entire attempt.

Also, don't start the timer while you're still waiting for questions to download.

Prepare the session first, then begin the examination.

8. Add automatic scoring

When the student submits, compare their selected answers with the correct answers.

For example:

Total Questions: 40
Correct: 31
Incorrect: 9

Score: 77.5%

For serious mock-exam mode, avoid revealing correct answers while the examination is still active.

Your backend can handle grading if you don't want correct-answer information exposed to the client before submission.

9. Add explanations

After submission, allow students to review their answers.

For example:

Question 12

Your Answer: C
Correct Answer: B

Explanation:
[Explanation of why B is correct]

This is what turns the application from a simple quiz into a revision tool.

Where available, richer question data can also help you build topic and difficulty-based learning features.

10. Handle passages and images

Your interface should expect real examination questions to contain more than short text.

You may encounter:

  • Long questions
  • Long answer options
  • Comprehension passages
  • Mathematical expressions
  • Diagrams
  • Graphs
  • Scientific illustrations

Test these early.

If a question contains an image, display it responsively and consider allowing the student to enlarge it.

For passages, provide an easy way to reopen the passage while answering related questions.

11. Add practice and mock modes

You don't have to make every session behave like an examination.

You could provide:

Practice Mode

No strict timer
See answer after each question
Read explanation immediately

Mock Exam Mode

Timed
No answers shown during examination
Results after submission

This gives students two different ways to use the same underlying question data.

12. Add revision features

Once the basic CBT works, useful additions include:

Questions I Got Wrong

Automatically save incorrectly answered question IDs.

Bookmarks

Allow students to save difficult questions.

Weak Topics

If topic metadata is available, calculate where the student performs poorly.

For example:

Biology Performance

Ecology          78%
Genetics         42%
Cell Biology     71%

You can then recommend additional Genetics practice.

13. Plan for poor internet connections

A CBT app should not become unusable because the student's connection drops for a few seconds.

Where your data usage arrangement permits it, prepare the examination session before starting and cache the required session data temporarily.

The flow becomes:

Internet available
      ↓
Prepare examination
      ↓
Questions ready
      ↓
Start timer
      ↓
Student completes session

This is much better than requesting another question from the server every time the student presses Next.

14. Test with real questions early

Don't build your entire application using only:

What is 2 + 2?

Real UTME questions will expose problems that dummy data won't.

Test:

  • Long questions
  • Long options
  • Images
  • Passages
  • Explanations
  • Mathematical content
  • Different screen sizes
  • Failed network requests

Your UI should survive all of them.

15. Use 2,000 free credits while developing

SdashAPI provides 2,000 free credits for development and testing.

You can use them while building your first version to test real API responses, question loading, filtering, scoring, explanations and other features.

A simple development flow is:

Create SdashAPI account
        ↓
Get 2,000 free credits
        ↓
Generate development API key
        ↓
Connect your CBT app
        ↓
Build and test

Start through SdashAPI.

When you're ready for actual users, you can create a separate production API key and choose an appropriate option through SdashAPI Pricing.

16. Check question coverage before launch

Before displaying every possible subject and year in your application, verify what data is actually available.

You can check current examination coverage through SdashAPI Coverage.

Ideally, your app should only show combinations that can return questions.

A simple JAMB CBT app architecture

Putting everything together:

Student
   ↓
React Native / Flutter / Web App
   ↓
Your Backend
   ↓
SdashAPI
   ↓
UTME Question Data

Meanwhile:

Your Database
   ↓
Users
Results
Bookmarks
Attempts
Subscriptions
Progress

This separation keeps things manageable.

Your database handles information belonging to your product and users. The examination API handles the question-data layer.

SdashAPI is an independent examination-data platform and is not an official JAMB service.

If you're building your first JAMB CBT app, start small: load real UTME questions, make answering and navigation work properly, add scoring and explanations, then expand into mock exams, analytics and personalised revision.

The goal isn't simply to recreate past questions on a phone screen. It is to build a CBT experience that helps students practise effectively.

Avatar

How can we help?

We reply immediately

Hello! 👋 How can we help you today?