# African SME Opportunities Scraper & AI Matcher (`loisadex/scouvela-african-sme-opportunities`) Actor

Discover and structure grants, tenders, accelerators, training and empowerment opportunities for African SMEs from public websites and social-media pages.

- **URL**: https://apify.com/loisadex/scouvela-african-sme-opportunities.md
- **Developed by:** [Lois Adegbohungbe](https://apify.com/loisadex) (community)
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 opportunity 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

## African SME Opportunities Scraper & AI Matcher

**One Actor. Thousands of opportunities for African businesses.**

[Visit the Scouvela website →](https://scouvela-web.vercel.app/)

Scouvela discovers grants, loans, accelerators, training programmes, competitions and other growth opportunities for African SMEs from public sources. It normalises fragmented pages, removes duplicates, and returns structured, source-linked records you can export as JSON, CSV or Excel — or consume through the Apify API, a webhook, a schedule, or an AI agent.

Standard extraction needs **no external API key**. Optional AI matching uses **your own OpenAI key**, so you stay in control of LLM cost.

### The problem

African entrepreneurs miss useful programmes because the information sits on government portals, foundation sites, corporate pages and development websites. It is hard to search, inconsistently formatted, often undated, and rarely available as an API.

### What this Actor does

1. Reads your country, sector, opportunity-type and keyword filters.
2. Selects matching public sources.
3. Extracts opportunities from index and detail pages.
4. Normalises dates, countries and categories.
5. Removes duplicates.
6. Marks each record `active`, `closing-soon`, `expired`, `ongoing` or `unverified`.
7. Keeps the original `sourceUrl`.
8. Optionally uses your OpenAI key to plan the search, summarise results and score matches.
9. Saves validated rows to the Dataset.

It does not apply on anyone’s behalf, invent missing amounts or deadlines, or claim full African coverage.

### MVP sources

This version crawls four reviewed public sources:

| Source | Geography | Types |
| --- | --- | --- |
| Bank of Industry SME products | Nigeria | Loans, funding, support programmes |
| Tony Elumelu Foundation programme pages | Africa-wide | Accelerator, training, seed support |
| Ghana Enterprises Agency programme pages | Ghana | Training, grants, business support |
| Kenya Climate Innovation Center programmes | Kenya | Accelerator, incubator, competition |

South Africa and Rwanda are accepted as filters for later sources. They are not crawled in this version.

### Public Instagram pages

You can add `"instagram"` to `sourceTypes` and submit public post, reel, or profile URLs in `startUrls`. Scouvela fetches those pages itself. It does not log in, search all of Instagram, or bypass a login wall. If a page is withheld, that URL is skipped and the rest of the run continues. See the Actor README for the input example and verification statuses.

### How to run

```json
{
  "query": "opportunities for women-owned fashion SMEs",
  "countries": ["Nigeria", "Ghana"],
  "opportunityTypes": ["grant", "accelerator", "training"],
  "maxResults": 10,
  "ai": { "enabled": false }
}
```

Optional AI:

```json
{
  "query": "Find grants and accelerator programmes for a woman-owned Nigerian fashion business",
  "countries": ["Nigeria"],
  "maxResults": 10,
  "ai": {
    "enabled": true,
    "provider": "openai",
    "model": "gpt-4.1-mini",
    "apiKey": "YOUR_OPENAI_KEY",
    "generateReport": true
  }
}
```

The API key is an Apify secret. It is never written to the Dataset, logs, or Actor output.

### Output

Every row includes title, provider, opportunity type, description, countries, status, source URL, source name and scrape time. Optional fields include eligibility, deadline, benefits, application URL and an `ai` object with a labelled summary and match reasons.

Confidence is extraction completeness, not an endorsement.

### Pricing

Scouvela uses transparent pay-per-event pricing. You pay only when the Actor successfully produces a chargeable result or optional AI output.

| Event | Price | When you are charged |
|---|---:|---|
| Opportunity result | **$0.01 per result** | When a valid, normalized opportunity is saved to the default Dataset |
| AI search plan | **$0.01 per plan** | When Scouvela successfully converts a natural-language request into a validated search plan |
| AI-enriched opportunity | **$0.02 per result** | When one opportunity is successfully summarized, classified and matched using AI |
| AI opportunity report | **$0.05 per report** | When a complete AI opportunity report is successfully generated and saved |

#### Example costs

A standard run that returns 10 opportunities costs:

```text
10 opportunity results × $0.01 = $0.10
```

A run with 10 opportunities and every optional AI feature enabled costs:

```text
10 opportunity results        $0.10
1 AI search plan              $0.01
10 AI-enriched results        $0.20
1 AI opportunity report       $0.05
Total                         $0.36
```

The current maximum is 50 opportunity results per run. A standard 50-result run costs up to **$0.50** in Scouvela event charges.

#### Optional AI costs

AI features are optional. Standard opportunity extraction works without an AI key.

When AI is enabled, you provide your own supported LLM API key through a secret Actor input. Your AI provider bills you separately for model usage. Scouvela never writes your API key to logs, Dataset records or reports.

You are not charged a successful-result event for duplicate, rejected or invalid records that are not saved to the Dataset. Failed AI operations are not charged as successful AI events.

### Limits

- No CAPTCHA, login, or WAF bypass.
- Bank of Industry may return a datacenter interstitial. Other sources still run.
- TEFConnect and other application portals are not crawled — only public programme pages.
- Missing facts stay missing.
- Always confirm terms on the original `sourceUrl`.

### About Scouvela

Scouvela is opportunity-intelligence infrastructure for African enterprise. It works as a Store Actor, a scheduled monitor, an automation step, and a data source for AI agents.

GitHub: <https://github.com/damlois/Scouvela>

# Actor input Schema

## `query` (type: `string`):

Natural-language need, for example opportunities for women-owned fashion businesses. Never used as a CSS selector or raw crawl URL.

## `countries` (type: `array`):

MVP sources currently cover Nigeria, Ghana and Kenya, plus Africa-wide programmes. Do not treat this as full continental coverage.

## `opportunityTypes` (type: `array`):

Leave empty to keep every matching type from the selected sources.

## `maxResults` (type: `integer`):

How many valid opportunities to save. Default 20. Hard cap 50. You pay per saved dataset item.

## `sectors` (type: `array`):

Optional sector hints such as fashion, agriculture or green.

## `targetGroups` (type: `array`):

Optional. Keep programmes aimed at groups such as women-owned, youth-owned or green businesses.

## `businessStages` (type: `array`):

Optional. idea, early-stage, growth or export-ready.

## `includeExpired` (type: `boolean`):

Keep programmes whose published deadline has already passed.

## `closingWithinDays` (type: `integer`):

Optional. Only keep opportunities with a deadline inside this many days.

## `requireDeadline` (type: `boolean`):

If enabled, drop opportunities that do not publish a deadline.

## `requireApplicationUrl` (type: `boolean`):

If enabled, drop opportunities that do not include an application link.

## `ai` (type: `object`):

Optional. Standard extraction works with AI off. When enabled, you supply your own OpenAI key. Scouvela charges only for successful AI events; OpenAI bills you separately.

## `openaiApiKey` (type: `string`):

Required only when AI matching is on. Stored as an Apify secret. Never logged or saved on records. You pay OpenAI directly.

## `sourceTypes` (type: `array`):

Curated websites stay on by default. Add submitted public webpages or public Instagram pages when you want Scouvela to read those URLs itself.

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

Optional public webpage or Instagram URLs. Maximum 20. HTTP and HTTPS only. Localhost, private-network addresses, and embedded credentials are rejected. URLs are not used as code or selectors.

## `discoverFromProfiles` (type: `boolean`):

When enabled, Scouvela may inspect a limited number of recent publicly visible posts from a submitted supported profile.

## `maxPostsPerProfile` (type: `integer`):

Used only when reading recent public profile posts is enabled. Minimum 1, maximum 10.

## Actor input object example

```json
{
  "query": "opportunities for women-owned fashion SMEs",
  "countries": [
    "Nigeria",
    "Ghana"
  ],
  "opportunityTypes": [
    "grant",
    "accelerator",
    "training"
  ],
  "maxResults": 10,
  "sectors": [
    "fashion",
    "creative-industries"
  ],
  "targetGroups": [
    "women-owned"
  ],
  "includeExpired": false,
  "requireDeadline": false,
  "requireApplicationUrl": false,
  "sourceTypes": [
    "curated-websites"
  ],
  "discoverFromProfiles": false,
  "maxPostsPerProfile": 5
}
```

# Actor output Schema

## `opportunities` (type: `string`):

Valid, normalized and source-linked SME opportunities saved to the default Dataset.

## `runSummary` (type: `string`):

Processing statistics, completed sources, filtered records and source failures for this run.

# 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 = {
    "query": "opportunities for women-owned fashion SMEs",
    "countries": [
        "Nigeria",
        "Ghana"
    ],
    "opportunityTypes": [
        "grant",
        "accelerator",
        "training"
    ],
    "maxResults": 10,
    "sectors": [
        "fashion",
        "creative-industries"
    ],
    "targetGroups": [
        "women-owned"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("loisadex/scouvela-african-sme-opportunities").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 = {
    "query": "opportunities for women-owned fashion SMEs",
    "countries": [
        "Nigeria",
        "Ghana",
    ],
    "opportunityTypes": [
        "grant",
        "accelerator",
        "training",
    ],
    "maxResults": 10,
    "sectors": [
        "fashion",
        "creative-industries",
    ],
    "targetGroups": ["women-owned"],
}

# Run the Actor and wait for it to finish
run = client.actor("loisadex/scouvela-african-sme-opportunities").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 '{
  "query": "opportunities for women-owned fashion SMEs",
  "countries": [
    "Nigeria",
    "Ghana"
  ],
  "opportunityTypes": [
    "grant",
    "accelerator",
    "training"
  ],
  "maxResults": 10,
  "sectors": [
    "fashion",
    "creative-industries"
  ],
  "targetGroups": [
    "women-owned"
  ]
}' |
apify call loisadex/scouvela-african-sme-opportunities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,loisadex/scouvela-african-sme-opportunities"
        }
    }
}
```

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/y6ZhExtDGbe1V9P34/builds/1T35mQdSB2xn26LPA/openapi.json
