Discover/Ac API
live

Ac APIegyankosh.ac.in

Access IGNOU's eGyanKosh digital repository via API. Browse communities, list collection items, retrieve unit metadata, download PDF URLs, and search course materials.

Endpoints
5
Updated
2mo ago

What is the Ac API?

The eGyanKosh API provides 5 endpoints for navigating and extracting content from IGNOU's Self Learning Material digital repository. Using get_communities, you can retrieve the 22 top-level schools that organize the repository, then drill down through sub-communities and collections to individual course units, pulling full metadata and direct PDF file URLs for any item.

Try it

No input parameters required.

api.parse.bot/scraper/75eaec3c-43b1-4dff-9f15-4ad0419f35a0/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
curl -X GET 'https://api.parse.bot/scraper/75eaec3c-43b1-4dff-9f15-4ad0419f35a0/get_communities' \
  -H 'X-API-Key: $PARSE_API_KEY'
Python SDK · recommended

Typed, relational, agent-ready

A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.

  • Fully typed · autocompletes
  • Objects link to objects
  • Typed errors & pagination

Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:

uv add parse-sdk
uv run parse init
uv run parse add --marketplace egyankosh-ac-in-api

uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.

"""
eGyanKosh API Client - Educational Materials Navigator
Get your API key from: https://parse.bot/settings
"""

import os
import requests
from typing import Optional, Dict, Any, List


class ParseClient:
    """Client for interacting with the eGyanKosh API via Parse."""

    def __init__(self, api_key: Optional[str] = None):
        """
        Initialize the Parse API client.
        
        Args:
            api_key: API key for authentication. If None, reads from PARSE_API_KEY env var.
        """
        self.base_url = "https://api.parse.bot"
        self.scraper_id = "75eaec3c-43b1-4dff-9f15-4ad0419f35a0"
        self.api_key = api_key or os.getenv("PARSE_API_KEY")
        
        if not self.api_key:
            raise ValueError("API key not provided and PARSE_API_KEY env var not set")

    def _call(self, endpoint: str, method: str = "POST", **params) -> Dict[str, Any]:
        """
        Make a request to the Parse API.
        
        Args:
            endpoint: The endpoint name (e.g., 'get_communities')
            method: HTTP method ('GET' or 'POST')
            **params: Query/body parameters
            
        Returns:
            Response JSON as dictionary
        """
        url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
        headers = {
            "X-API-Key": self.api_key,
            "Content-Type": "application/json"
        }
        
        if method == "GET":
            response = requests.get(url, headers=headers, params=params)
        elif method == "POST":
            response = requests.post(url, headers=headers, json=params)
        else:
            raise ValueError(f"Unsupported HTTP method: {method}")
        
        response.raise_for_status()
        return response.json()

    def get_communities(self) -> Dict[str, Any]:
        """
        List all top-level communities in the repository.
        
        Returns:
            Dictionary containing list of communities with name and handle
        """
        return self._call("get_communities", method="GET")

    def get_community(self, handle: str) -> Dict[str, Any]:
        """
        Get details, sub-communities, and collections for a specific community.
        
        Args:
            handle: The handle ID of the community (e.g., '123456789/1')
            
        Returns:
            Dictionary with community details, sub-communities, and collections
        """
        return self._call("get_community", method="GET", handle=handle)

    def get_block_units(self, handle: str, page: int = 0) -> Dict[str, Any]:
        """
        List all units (items) within a collection.
        
        Args:
            handle: The handle ID of the collection
            page: Page number for pagination (default: 0)
            
        Returns:
            Dictionary with paginated items and metadata
        """
        return self._call("get_block_units", method="GET", handle=handle, page=page)

    def get_unit_detail(self, handle: str) -> Dict[str, Any]:
        """
        Get full metadata and direct PDF URLs for a specific unit.
        
        Args:
            handle: The handle ID of the unit/item
            
        Returns:
            Dictionary with unit title, metadata, and file URLs
        """
        return self._call("get_unit_detail", method="GET", handle=handle)

    def search(self, query: str, scope: str = "", page: int = 0) -> Dict[str, Any]:
        """
        Search for items across the repository.
        
        Args:
            query: Search keyword
            scope: Optional handle to limit search scope
            page: Page number for pagination (default: 0)
            
        Returns:
            Dictionary with search results and pagination info
        """
        return self._call(
            "search",
            method="GET",
            query=query,
            scope=scope,
            page=page
        )


def main():
    """Main workflow demonstrating practical usage of the eGyanKosh API."""
    
    # Initialize client
    client = ParseClient()
    
    print("=" * 80)
    print("eGyanKosh Educational Materials Navigator")
    print("=" * 80)
    
    # Step 1: Search for materials on a specific topic
    print("\n[STEP 1] Searching for 'philosophy' course materials...")
    search_results = client.search(query="philosophy", page=0)
    results = search_results.get("data", {}).get("results", [])
    
    if not results:
        print("  ✗ No results found. Trying alternative search...")
        search_results = client.search(query="course", page=0)
        results = search_results.get("data", {}).get("results", [])
    
    print(f"  ✓ Found {len(results)} results")
    
    # Display search results
    print("\n  Top 3 Search Results:")
    for i, result in enumerate(results[:3], 1):
        print(f"    {i}. {result.get('title', 'N/A')}")
        print(f"       Handle: {result.get('handle', 'N/A')} | Date: {result.get('date', 'N/A')}")
        print(f"       Contributor: {result.get('contributor', 'N/A')}")
    
    # Step 2: Get detailed information for the first search result
    if results:
        first_handle = results[0].get("handle")
        print(f"\n[STEP 2] Fetching detailed information for first result...")
        print(f"         Handle: {first_handle}")
        
        unit_detail = client.get_unit_detail(handle=first_handle)
        unit_data = unit_detail.get("data", {})
        
        print(f"\n  Title: {unit_data.get('title', 'N/A')}")
        print(f"  URI: {unit_data.get('metadata', {}).get('uri', 'N/A')}")
        
        metadata = unit_data.get("metadata", {})
        print("\n  Metadata:")
        for key, value in metadata.items():
            if value and key != "uri":
                print(f"    • {key}: {value}")
        
        # Show available files
        files = unit_data.get("files", [])
        if files:
            print(f"\n  Available Files ({len(files)}):")
            for file_info in files:
                filename = file_info.get("filename", "N/A")
                size = file_info.get("size", "N/A")
                print(f"    • {filename} {f'({size})' if size else ''}")
    
    # Step 3: Browse the hierarchy - get top-level communities
    print(f"\n[STEP 3] Browsing top-level communities...")
    communities_response = client.get_communities()
    communities = communities_response.get("data", {}).get("communities", [])
    
    print(f"  ✓ Found {len(communities)} top-level communities")
    print("\n  Communities:")
    for i, community in enumerate(communities[:5], 1):
        print(f"    {i}. {community.get('name', 'N/A')}")
    
    # Step 4: Explore the first community's structure
    if communities:
        first_community = communities[0]
        comm_handle = first_community.get("handle")
        
        print(f"\n[STEP 4] Exploring structure of '{first_community.get('name')}'...")
        community_detail = client.get_community(handle=comm_handle)
        community_data = community_detail.get("data", {})
        
        # Show sub-communities
        sub_communities = community_data.get("sub_communities", [])
        if sub_communities:
            print(f"\n  Sub-Communities ({len(sub_communities)}):")
            for sub in sub_communities[:5]:
                print(f"    • {sub.get('name', 'N/A')}")
        
        # Show collections
        collections = community_data.get("collections", [])
        if collections:
            print(f"\n  Collections ({len(collections)}):")
            for col in collections[:5]:
                print(f"    • {col.get('name', 'N/A')}")
            
            # Step 5: List units from first collection
            first_collection = collections[0]
            col_handle = first_collection.get("handle")
            
            print(f"\n[STEP 5] Listing units in '{first_collection.get('name')}'...")
            units_response = client.get_block_units(handle=col_handle, page=0)
            units_data = units_response.get("data", {})
            units = units_data.get("items", [])
            page = units_data.get("page", 0)
            
            print(f"  ✓ Found {len(units)} units (page {page})")
            
            if units:
                print("\n  Sample Units:")
                for i, unit in enumerate(units[:5], 1):
                    print(f"    {i}. {unit.get('title', 'N/A')}")
                    print(f"       Date: {unit.get('date', 'N/A')} | Handle: {unit.get('handle', 'N/A')}")
                
                # Step 6: Get details for first unit in collection
                first_unit = units[0]
                unit_handle = first_unit.get("handle")
                
                print(f"\n[STEP 6] Getting full details for first collection unit...")
                full_unit = client.get_unit_detail(handle=unit_handle)
                full_unit_data = full_unit.get("data", {})
                
                print(f"  Title: {full_unit_data.get('title', 'N/A')}")
                files = full_unit_data.get("files", [])
                if files:
                    print(f"  Files available: {len(files)}")
                    for file_info in files[:3]:
                        print(f"    • {file_info.get('filename', 'N/A')}")
    
    print("\n" + "=" * 80)
    print("Navigation complete!")
    print("=" * 80)


if __name__ == "__main__":
    main()
All endpoints · 5 totalmissing one? ·

List all top-level communities (schools) in the IGNOU Self Learning Material repository. Returns the 22 schools that form the main organizational structure.

Input

No input parameters required.

Response
{
  "type": "object",
  "fields": {
    "communities": "array of objects with name (string) and handle (string)"
  },
  "sample": {
    "data": {
      "communities": [
        {
          "name": "01. School of Humanities (SOH)",
          "handle": "123456789/19"
        },
        {
          "name": "02. School of Social Sciences (SOSS)",
          "handle": "123456789/26"
        }
      ]
    },
    "status": "success"
  }
}

About the Ac API

Repository Navigation

The API exposes the full hierarchical structure of eGyanKosh. get_communities returns all 22 top-level communities, each with a name and handle. Passing any handle to get_community yields that community's name, its collections array, and any sub_communities — letting you traverse arbitrarily deep into IGNOU's school and programme structure. Handles flow through the hierarchy, so a handle obtained from sub_communities can be passed directly back into get_community.

Collection and Item Access

get_block_units accepts a collection handle from get_community and returns paginated results (20 items per page, controlled by a zero-indexed page parameter). Each item in the items array includes date, title, and handle. To retrieve full details for any unit, pass its handle to get_unit_detail, which returns the item's title, a structured metadata object (covering contributors, issue date, publisher, URI, and collection membership), and a files array with filename, url, and size for every associated PDF.

Search

The search endpoint accepts a query string and returns up to 10 results per page (zero-indexed page). Each result includes date, title, handle, and contributor. An optional scope parameter accepts a community or collection handle to constrain results to a specific programme or subject area, rather than searching the full repository.

Reliability & maintenance

The Ac API is a managed, monitored endpoint for egyankosh.ac.in — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when egyankosh.ac.in 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 egyankosh.ac.in 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?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Build a subject-specific course catalogue by iterating communities and collections for a chosen school.
  • Automate PDF discovery for IGNOU study units by chaining get_block_units and get_unit_detail.
  • Index IGNOU Self Learning Materials by contributor using the contributor field returned in search results.
  • Create a programme navigator that maps the full community and sub-community hierarchy from get_community responses.
  • Compile a metadata dataset of IGNOU units including issue dates, publishers, and collection membership.
  • Search across the repository for course materials on a specific topic and surface direct PDF download URLs.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo1005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min

One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.

Frequently asked questions
Does eGyanKosh have an official developer API?+
eGyanKosh is built on DSpace, which historically exposed a REST API. However, IGNOU does not publicly document or support a stable developer API for eGyanKosh as of now. This Parse API provides structured, consistent access to the repository's communities, collections, items, and search.
What does get_unit_detail return beyond the item title?+
It returns a metadata object with fields including contributors, issue date, publisher, URI, and the collections the item appears in. It also returns a files array where each entry has a filename, a direct url, and a size string — typically pointing to the PDF version of the study unit.
Can I search within a specific programme or subject area rather than the whole repository?+
Yes. The search endpoint accepts an optional scope parameter. Pass any community or collection handle obtained from get_communities or get_community to restrict results to that scope. Omitting scope searches the entire eGyanKosh repository.
Does the API expose assignment questions, exam papers, or audio-visual media metadata?+
Not currently. The API covers Self Learning Material units, their metadata, and associated PDF file URLs. Repository items that are audio, video, or exam-related but stored under different collection types may not surface. You can fork this API on Parse and revise it to add an endpoint targeting those specific collection handles.
How does pagination work across endpoints, and are there any limits to be aware of?+
get_block_units returns 20 items per page and search returns 10 results per page, both using a zero-indexed page parameter. There is no built-in way to request the total item count for a collection in a single call, so iterating pages until an empty items array is returned is the reliable way to exhaust a collection.
Page content last updated . Spec covers 5 endpoints from egyankosh.ac.in.
Related APIs in EducationSee all →
econtent.msbte.edu.in API
Browse technical diploma programs and access their bilingual curriculum materials, including courses, learning outcomes, and educational content across multiple semesters. Search for specific educational resources by keyword and download course materials available in both Marathi and English.
shiksha.com API
Search and browse Shiksha colleges by stream/course, then fetch detailed institute profiles and course offerings, plus upcoming exam schedules by stream.
myschool.ng API
Search for Nigerian schools by type, explore courses and admission requirements, and stay updated with the latest education news all in one place. Find detailed information about schools and their programs to make informed decisions about your education.
boslive.icai.org API
Access the ICAI Board of Studies Knowledge Portal, including announcements, examination updates, Live Virtual Class (LVC) and Live Virtual Revisionary Class (LVRC) schedules, and study materials. Browse available courses, languages, and papers, and retrieve direct PDF links for any portal page.
indiankanoon.org API
indiankanoon.org API
jstor.org API
Search and browse millions of academic articles, journals, and research issues from JSTOR's library, or retrieve specific articles and journal details to explore scholarly content by subject. Access peer-reviewed research across multiple disciplines to find the academic sources you need.
naac.gov.in API
Search for India's accredited educational institutions and access their NAAC accreditation history, assessment reports, and detailed evaluation data by state. Find comprehensive information about institution quality metrics, self-study reports, and peer team evaluations all in one place.
kys.udiseplus.gov.in API
Search for schools across India by geographic region and management type, then access detailed information about any school including academic performance, facilities, and enrollment data. Navigate through states, districts, and blocks to find schools that match your criteria and compare their profiles.