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:
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
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
| Param | Type | Description | |
|---|---|---|---|
| subject | string | optional | Subject slug e.g. chemistry, mathematics. Get slugs from /v1/subjects. |
| type | string | optional | Exam type slug: utme, wassce, neco, post-utme, university. |
| year | string | optional | 4-digit year e.g. 2020. Coverage: 2001–present. Get valid years from /v1/years. |
| id | integer | optional | Fetch a specific question by its ID. |
| limit | integer | optional | Number 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
| Field | Type | Description |
|---|---|---|
| id | integer | Unique question ID. |
| question | string | The question text. |
| section | string | null | Optional shared passage or instruction block for a group of questions. |
| option | object | Nested object with keys a, b, c, d (and optionally e) containing the option texts. |
| answer | string | The correct option key e.g. "b". |
| solution | string | null | Worked solution or explanation. |
| image | string | null | URL to an image associated with the question, if any. |
| examtype | string | Exam name e.g. "JAMB", "WAEC", "NECO", "Post-UTME", "University". |
| examyear | string | 4-digit year as a string e.g. "2023". |
Example — single chemistry question (JAMB/UTME 2022)
GET /api/v1/q?subject=chemistry&type=utme&year=2022 AccessToken: sdash_xxxxxxxxxxxx
{
"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
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
Returns all exam types and their slugs (use as the type filter).
List years
Returns a list of available years as integers, newest first.
Report a question
Lets your users flag a question that has a wrong answer, typo, or other issue. Send JSON body:
| Field | Type | Description | |
|---|---|---|---|
| question_id | integer | required | The id from the question object. |
| report_type | string | optional | One of: wrong_answer, typo, unclear, other. Default: wrong_answer. |
| message | string | optional | Extra detail from the user. |
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."
}{
"status": 200,
"message": "Report submitted. Thank you!"
}Error codes
| Status | Meaning |
|---|---|
| 200 | Request succeeded. |
| 400 | Bad request — check your parameters. |
| 401 | Missing or invalid AccessToken. |
| 403 | Account suspended. |
| 404 | No questions matched your filters, or unknown endpoint. |
| 405 | Wrong HTTP method. |
| 429 | Monthly 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.
| Plan | Monthly calls |
|---|---|
| Free | 7,000 |
| Basic | 20,000 |
| Pro | 120,000 |
Need more? Contact us for a custom plan.