Edu APIbooks.ebsu.edu.ng ↗
Retrieve the full EBSU Books storefront catalog, cover images, NGN prices, shelf membership, bundle composition, and per-book purchase flags via 2 endpoints.
What is the Edu API?
The EBSU Books API gives developers structured access to the entire books.ebsu.edu.ng storefront across 2 endpoints. list_books returns every title in the catalog — shelved, unshelved, and bundle components — with cover images, NGN prices, and shelf labels. get_book returns a single title's full record including bundle sub-books, attachments, purchase flags, and stock mode. Together they expose over a dozen distinct fields per record.
curl -X GET 'https://api.parse.bot/scraper/b12d2d2b-8c8d-49e2-b476-d17a08c29b2c/list_books?query=physics&has_cover=true' \ -H 'X-API-Key: $PARSE_API_KEY'
Returns the complete EBSU Books catalog in a single round trip: every book on the storefront's shelves (including the individual books inside a bundle, tagged with bundle_title) plus the unshelved books shown in the main 'Books' section. Each record carries cover_image_url, which is null when the shop has not uploaded a cover for that title. There is no pagination — the whole catalog (a few hundred records) is returned at once. Optional filters are applied to the full catalog: query matches a case-insensitive substring of title or author; shelf matches a shelf title exactly (case-insensitive) and an unknown shelf yields an empty list; has_cover keeps only books with (true) or without (false) a cover image. count is the number of records after filtering, total_in_catalog the number before filtering, and shelves the list of shelf titles the site currently exposes.
| Param | Type | Description |
|---|---|---|
| query | string | Case-insensitive substring matched against book title and author. Omitted = no text filter. |
| shelf | string | Shelf title to restrict results to, as returned in the shelves field (e.g. 200 Level GST). Case-insensitive exact match; an unknown shelf returns zero books. Omitted = all shelves and unshelved books. |
| has_cover | boolean | true keeps only books with a cover_image_url; false keeps only books without one. Omitted = no cover filter. |
{
"type": "object",
"fields": {
"books": "array of book records: book_id, title, author (nullable), cover_image_url (nullable absolute URL of the cover image), price_ngn (integer, Nigerian naira; 0 when no price is set), description (nullable), is_bundle, is_hot_selling, shelf (shelf title or null for unshelved books), bundle_title (title of the parent bundle when the record is a bundle component, else null)",
"count": "integer number of records returned after filtering",
"shelves": "array of shelf title strings currently exposed by the shop",
"total_in_catalog": "integer number of records in the whole catalog before filtering"
},
"sample": {
"data": {
"books": [
{
"shelf": "100 Level Sciences",
"title": "Practical Physics Manual 2",
"author": "Physics Department",
"book_id": "6a4344311b173fe3369fb8e4",
"is_bundle": false,
"price_ngn": 1500,
"description": null,
"bundle_title": null,
"is_hot_selling": true,
"cover_image_url": "http://www.jetmav.com/books/covers/book-1782796719128-51873507.jpg"
},
{
"shelf": null,
"title": "Practical Physics Manual 1",
"author": "Physics Department",
"book_id": "6a4344311b173fe3369fb8e2",
"is_bundle": false,
"price_ngn": 1500,
"description": null,
"bundle_title": null,
"is_hot_selling": false,
"cover_image_url": "http://www.jetmav.com/books/covers/book-1782796281149-191141543.jpg"
}
],
"count": 2,
"shelves": [
"100 level GST",
"100 Level Sciences",
"200 Level GST",
"300 Level GST"
],
"total_in_catalog": 227
},
"status": "success"
}
}About the Edu API
Catalog Endpoint
list_books returns all books in the EBSU Books storefront in one round trip. Each record in the books array includes book_id, title, author (nullable), cover_image_url (a nullable absolute URL), price_ngn (integer, Nigerian naira), is_bundle, and is_hot_selling. Books that belong to a bundle carry a bundle_title tag so you can identify their parent. The response also includes a shelves array of all shelf title strings currently in the shop (e.g. 200 Level GST) and total_in_catalog for the unfiltered count alongside count for the filtered count.
Filtering the Catalog
Three optional query parameters let you narrow results. query does a case-insensitive substring match against title and author. shelf restricts output to a single shelf by its title string as it appears in the shelves field. has_cover accepts a boolean to keep only records that have — or lack — a cover_image_url. Parameters can be combined; omitting all three returns the full catalog.
Single Book Detail
get_book accepts a 24-character hexadecimal book_id (as returned by list_books) and returns the complete record for that title. Beyond the listing fields it adds description (nullable text), bundle_only (true when the title is not sold standalone), stock_mode (e.g. own), sub_books (an array of component book records for bundles, empty for plain books), and attachments (an array of add-on items sold with the title). Each entry in sub_books and attachments carries its own book_id, title, author, cover_image_url, and price_ngn.
The Edu API is a managed, monitored endpoint for books.ebsu.edu.ng — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when books.ebsu.edu.ng 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 books.ebsu.edu.ng 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?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a searchable course-material directory filtered by shelf (e.g.
200 Level GST) usinglist_booksshelf and query params. - Display a bundle's component titles and their individual prices by reading
sub_booksfromget_book. - Identify hot-selling titles across the catalog with the
is_hot_sellingflag fromlist_books. - Audit catalog coverage by comparing
total_in_catalogagainst records with a non-nullcover_image_urlusing thehas_coverfilter. - Detect titles that can only be purchased as part of a bundle using the
bundle_onlyflag fromget_book. - Enumerate all add-on attachments available for a given title via the
attachmentsarray inget_book.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 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.
Does books.ebsu.edu.ng have an official developer API?+
What does list_books return for bundle members versus standalone books?+
bundle_title field identifying the parent bundle, while standalone books leave that field absent. Both types appear in the same books array. You can also use the is_bundle flag to identify records that are themselves top-level bundles.Does the API expose purchase history, user reviews, or sales volume data?+
Is there pagination for the catalog, or does list_books return all records at once?+
count field reflects how many records match any active filters, and total_in_catalog gives the unfiltered total.Can I look up books by ISBN or publisher rather than by title or author?+
query filter in list_books matches against title and author only; ISBN, publisher, and subject fields are not exposed. You can fork this API on Parse and revise it to surface those fields if the storefront exposes them.