Documentation

SdashAPI Reference

A REST API for Nigerian past exam questions (UTME, WAEC, NECO, Post-UTME) with answers and solutions.

Introduction

SdashAPI returns JSON. Base URL:

https://sdashapi.com/api/

All responses have a top-level status field (HTTP status code) and either a data field (success) or a message field (error).

Authentication

Every request needs your AccessToken sent as an HTTP header:

curl https://sdashapi.com/api/v1/q?subject=biology \
  -H "AccessToken: YOUR_ACCESS_TOKEN"

You can also pass it as a query parameter ?token=YOUR_TOKEN for quick testing, but the header is recommended for production.

Get your token by creating a free account.

Fetch questions

GET /api/v1/q

Returns one or more past-exam questions from our bank (2001–present). By default returns one random question. Use query parameters to filter by subject, exam type and year.

Query parameters

ParamTypeDescription
subjectstringoptionalSubject slug e.g. chemistry, mathematics. Get slugs from /v1/subjects.
typestringoptionalExam type slug: utme, wassce, neco, post-utme, university.
yearstringoptional4-digit year e.g. 2020. Coverage: 2001–present. Get valid years from /v1/years.
idintegeroptionalFetch a specific question by its ID.
limitintegeroptionalNumber of questions to return (1–50). Default: 1. When limit=1 the response data is an object; limit>1 returns an array.

Response object schema

FieldTypeDescription
idintegerUnique question ID.
questionstringThe question text.
sectionstring | nullOptional shared passage or instruction block for a group of questions.
optionobjectNested object with keys a, b, c, d (and optionally e) containing the option texts.
answerstringThe correct option key e.g. "b".
solutionstring | nullWorked solution or explanation.
imagestring | nullURL to an image associated with the question, if any.
examtypestringExam name e.g. "JAMB", "WAEC", "NECO", "Post-UTME", "University".
examyearstring4-digit year as a string e.g. "2023".

Example — single chemistry question (JAMB/UTME 2022)

Request
GET /api/v1/q?subject=chemistry&type=utme&year=2022
AccessToken: sdash_xxxxxxxxxxxx
Response
{
  "status": 200,
  "data": {
    "id": 4821,
    "question": "Which of the following is the chemical formula for table salt?",
    "section": null,
    "option": {
      "a": "NaCl",
      "b": "KCl",
      "c": "CaCO3",
      "d": "NaOH"
    },
    "answer": "a",
    "solution": "NaCl is sodium chloride...",
    "image": null,
    "examtype": "JAMB",
    "examyear": "2022"
  }
}

Example — 10 random questions (mixed)

GET /api/v1/q?limit=10
AccessToken: sdash_xxxxxxxxxxxx

List subjects

GET /api/v1/subjects

Returns all available subjects and their slugs (use the slug as the subject filter).

{
  "status": 200,
  "data": [
    { "id": 1, "name": "Biology", "slug": "biology" },
    { "id": 2, "name": "Chemistry", "slug": "chemistry" },
    ...
  ]
}

List exam types

GET /api/v1/exams

Returns all exam types and their slugs (use as the type filter).

List years

GET /api/v1/years

Returns a list of available years as integers, newest first.

Report a question

POST /api/v1/report

Lets your users flag a question that has a wrong answer, typo, or other issue. Send JSON body:

FieldTypeDescription
question_idintegerrequiredThe id from the question object.
report_typestringoptionalOne of: wrong_answer, typo, unclear, other. Default: wrong_answer.
messagestringoptionalExtra detail from the user.
Request
POST /api/v1/report
AccessToken: sdash_xxxxxxxxxxxx
Content-Type: application/json

{
  "question_id": 4821,
  "report_type": "wrong_answer",
  "message": "Option B should be the correct answer."
}
Response
{
  "status": 200,
  "message": "Report submitted. Thank you!"
}

Error codes

StatusMeaning
200Request succeeded.
400Bad request — check your parameters.
401Missing or invalid AccessToken.
403Account suspended.
404No questions matched your filters, or unknown endpoint.
405Wrong HTTP method.
429Monthly quota exceeded — upgrade your plan.

Rate limits & quotas

Limits are per calendar month and reset on the 1st. Each successful call to /v1/q, /v1/report, or any list endpoint counts as one call.

PlanMonthly calls
Free7,000
Basic20,000
Pro120,000

Need more? Contact us for a custom plan.