# HorizonScholar scraper (`seyi_glory/horizon-scholar-scraper`) Actor

Scrapes verified African scholarship and essay-competition opportunities from trusted sources, with eligibility, required documents, and a trusted-source flag.

- **URL**: https://apify.com/seyi\_glory/horizon-scholar-scraper.md
- **Developed by:** [Seyi Oladepo](https://apify.com/seyi_glory) (community)
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Scholarship Assistant – Verified African Scholarships

### Overview

The **Scholarship Assistant** is an Apify Actor that aggregates verified African scholarship and essay‑competition opportunities from trusted sources. It scrapes each listing, extracts structured information (title, provider, deadline, eligibility, required documents, apply link) and flags entries as **trusted**.

A scholarship is considered trusted when:

- Its apply‑link belongs to a domain listed in `trustedDomains`, **or**
- The scraper finds at least **three** eligibility criteria **and** at least **three** required‑document items.

### Features

- **Domain whitelist** – configurable list of verified funder domains.
- **Completeness check** – ensures at least three eligibility points and three required documents before marking as trusted.
- **Configurable start URLs** – defined via the input schema.
- **JSON dataset output** – each record follows a clear schema.
- **Ready for publishing** – includes input and output schemas for the Apify Store.

### Input Schema (`.actor/input_schema.json`)

- `startUrls` – array of URLs to scrape (e.g., `https://scholarsworld.ng/all-scholarships/`).
- `trustedDomains` – whitelist of domains (e.g., `airbus.com`, `docs.google.com`).
- `maxRequestsPerCrawl` – optional limit to keep demo runs small.

### Output Schema (`.actor/output_schema.json`)

The output schema title is **"Verified African Scholarships"**. Each dataset item contains:

- `title`
- `provider`
- `deadline`
- `eligibility` (array of strings)
- `requiredDocuments` (array of strings)
- `applyLink`
- `isTrusted` (boolean)
- `sourceUrl`

### Quick Start

```bash
## Install dependencies
npm install

## Run locally
apify run
```

The actor reads input from `storage/key_value_stores/default/INPUT.json` and stores results in `storage/datasets/default/`.

### Deploy to Apify

1. Log in to the Apify CLI:

```bash
apify login
```

2. Push the actor to the platform:

```bash
apify push
```

3. Configure the input (start URLs and trusted domains) in the Apify Console and run the actor.

### Example Output

```json
{
  "title": "African Women in Science Scholarship",
  "provider": "African Union",
  "deadline": "2024-12-31",
  "eligibility": ["Women", "Undergraduate", "STEM fields"],
  "requiredDocuments": ["Transcripts", "Recommendation letters", "Personal statement"],
  "applyLink": "https://airbus.com/scholarship/apply",
  "isTrusted": true,
  "sourceUrl": "https://scholarsworld.ng/all-scholarships/..."
}
```

### License

MIT – feel free to modify and reuse for hackathon projects.

# Actor input Schema

## `startUrls` (type: `array`):

Listing pages to crawl. Use the full scholarships list, not the homepage, so every scholarship is reachable.

## `maxRequestsPerCrawl` (type: `integer`):

Total pages the crawler may visit (listing pages + individual scholarship pages). Keep small for demos.

## `trustedDomains` (type: `array`):

Apply-link domains that count as verified. Extend this list as your team confirms more funders.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://scholarsworld.ng/all-scholarships/"
    },
    {
      "url": "https://brainsbeyondborders.org/"
    }
  ],
  "maxRequestsPerCrawl": 30,
  "trustedDomains": [
    "daad.de",
    "ec.europa.eu",
    "mastercardfdn.org",
    "chevening.org",
    "fulbright.org",
    "docs.google.com",
    "forms.gle",
    "airbus.com",
    "un.org",
    "fao.org",
    "who.int",
    "worldbank.org",
    "gatesfoundation.org",
    "fordfoundation.org",
    "microsoft.com",
    "ox.ac.uk",
    "cam.ac.uk",
    "harvard.edu",
    "mit.edu",
    "stanford.edu"
  ]
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://scholarsworld.ng/all-scholarships/"
        },
        {
            "url": "https://brainsbeyondborders.org/"
        }
    ],
    "trustedDomains": [
        "daad.de",
        "ec.europa.eu",
        "mastercardfdn.org",
        "chevening.org",
        "fulbright.org",
        "docs.google.com",
        "forms.gle",
        "airbus.com",
        "un.org",
        "fao.org",
        "who.int",
        "worldbank.org",
        "gatesfoundation.org",
        "fordfoundation.org",
        "microsoft.com",
        "ox.ac.uk",
        "cam.ac.uk",
        "harvard.edu",
        "mit.edu",
        "stanford.edu"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seyi_glory/horizon-scholar-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        { "url": "https://scholarsworld.ng/all-scholarships/" },
        { "url": "https://brainsbeyondborders.org/" },
    ],
    "trustedDomains": [
        "daad.de",
        "ec.europa.eu",
        "mastercardfdn.org",
        "chevening.org",
        "fulbright.org",
        "docs.google.com",
        "forms.gle",
        "airbus.com",
        "un.org",
        "fao.org",
        "who.int",
        "worldbank.org",
        "gatesfoundation.org",
        "fordfoundation.org",
        "microsoft.com",
        "ox.ac.uk",
        "cam.ac.uk",
        "harvard.edu",
        "mit.edu",
        "stanford.edu",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("seyi_glory/horizon-scholar-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://scholarsworld.ng/all-scholarships/"
    },
    {
      "url": "https://brainsbeyondborders.org/"
    }
  ],
  "trustedDomains": [
    "daad.de",
    "ec.europa.eu",
    "mastercardfdn.org",
    "chevening.org",
    "fulbright.org",
    "docs.google.com",
    "forms.gle",
    "airbus.com",
    "un.org",
    "fao.org",
    "who.int",
    "worldbank.org",
    "gatesfoundation.org",
    "fordfoundation.org",
    "microsoft.com",
    "ox.ac.uk",
    "cam.ac.uk",
    "harvard.edu",
    "mit.edu",
    "stanford.edu"
  ]
}' |
apify call seyi_glory/horizon-scholar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seyi_glory/horizon-scholar-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gLBfEdXhhOICeSfId/builds/DJE0kZw0oBUvGF597/openapi.json
