# Ouedkniss Boutiques Scraper (`harpoon/ouedkniss-boutiques-scraper`) Actor

Collect Ouedkniss boutique (shop) profiles with location, categories and contact details.

- **URL**: https://apify.com/harpoon/ouedkniss-boutiques-scraper.md
- **Developed by:** [Harpoon](https://apify.com/harpoon) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 boutiques

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### Ouedkniss Boutiques Scraper — collect shop profiles, locations and contacts

Turn Ouedkniss boutiques into a clean, structured dataset. Every row is one shop with its name, categories, location and reachability — phone numbers (with WhatsApp/Viber/Telegram flags), emails, social profiles and website. Describe what you want in plain language and the search is filled for you, or set the keyword, category and wilayas yourself.

#### What can Ouedkniss Boutiques Scraper do?

- Start from a plain-language request and let the Actor fill the search filters
- Search the boutique directory by keyword, category and Algerian wilayah (province)
- Capture reachability: phones with WhatsApp/Viber/Telegram flags, emails, faxes, social profiles and website
- Capture location down to city, street address and map coordinates
- Tag every boutique with its categories and add follower/announcement counts
- Export results to JSON, CSV, Excel, or XML
- Run via the API, on a schedule, and integrate through webhooks or MCP

### What data can I extract?

<table>
<tr><th>What you get</th><th>Features</th></tr>
<tr><td>

- **Boutique** — id, name, slug, URL, description, logo, status, official/verified flags, store-only flag, follower and announcement counts, categories
- **Location** — wilayah, city, street address, latitude, longitude, opening hours
- **Contact** — phone numbers with WhatsApp/Viber/Telegram flags, emails, faxes, social profiles, website

</td><td>

- Plain-language search (AI prompt)
- Keyword, category and wilayah filters
- Results in English, French or Arabic
- Export to JSON, CSV, Excel, XML
- API access, webhooks, SDKs
- LLM-ready output for MCP, ChatGPT, Claude

</td></tr>
</table>

### How to use Ouedkniss Boutiques Scraper

1. [Create](https://console.apify.com/sign-up) a free Apify account.
2. Open **Ouedkniss Boutiques Scraper** in Apify Console.
3. In **Describe what you want**, type a request such as *real estate agencies in Alger* — or clear it and set the keyword, category and wilayas yourself.
4. Set **Max boutiques** if you want a smaller run.
5. Click **Save & Start**.
6. Download the results in JSON, CSV, Excel, or XML.

> The form is prefilled and runs as-is. The AI field sits on top for convenience; when you use it, its result overrides the manual search fields.

### Input

- `ai_prompt` — optional plain-language request. When set, it fills the keyword, category, wilayas and count automatically and overrides the manual fields.
- `search_query` — keyword matched against boutique names and descriptions.
- `category` — one of the marketplace's shop categories, or all categories.
- `regions` — one or more Algerian wilayas, chosen from a list of names.
- `max_results` — hard cap on the number of boutiques returned (default 100).
- `language` — English, French or Arabic, used for wilayah/city names and text.

**Example input**

```json
{
  "ai_prompt": "real estate agencies in Alger",
  "max_results": 100
}
```

**Same run without AI**

```json
{
  "search_query": "immobilier",
  "category": "agences_immobilieres",
  "regions": ["16"],
  "max_results": 100
}
```

See the **Input** tab above for every parameter.

### Output

One dataset item per boutique, with nested `location` and `contact` objects. Results land in a dataset under the **Storage** tab; export them as JSON, CSV, Excel, or XML, or pull them via the API.

```json
{
  "id": "2300",
  "name": "Yanis Immo",
  "slug": "yanis-immo",
  "url": "https://www.ouedkniss.com/store/2300/yanis-immo/",
  "description": "Bureau d'affaire Bekkai Islam El Mahdi",
  "image_url": "https://cdn.ouedkniss.com/medias/images/VJZ9z/hs6xftdgYDLyG7PvatkLdbEf3cu6fereApjLRIDs.jpg",
  "status": "ACTIVE",
  "is_official": false,
  "is_verified": false,
  "is_store_only": false,
  "follower_count": 6,
  "announcements_count": 24,
  "category_slugs": ["immobilier", "services"],
  "location": {
    "region": "Alger",
    "city": "Cheraga",
    "address": "Rue Bouchaoui 03 GP 527 Numéro 02 Cheraga Alger",
    "latitude": 36.727,
    "longitude": 3.096
  },
  "contact": {
    "phones": [
      {
        "number": "0553815016",
        "has_viber": false,
        "has_whatsapp": false,
        "has_telegram": false
      }
    ],
    "emails": ["Yanisimmobilierdz@outlook.fr"]
  }
}
```

Field names are lowercase snake\_case. The dataset ships with two ready-made tabs: **Overview** (audience and location) and **Contact details** (phones, emails, website).

### What can you do with the data?

Each recipe names the fields to use.

#### 1. Build a local B2B directory

1. Run with `category` set to `agences_immobilieres` and one or more `regions`.
2. Export the dataset to CSV or Excel.
3. Use `contact.emails`, `contact.phones` and `location.address` as your outreach and routing columns.

#### 2. Find reachable suppliers fast

1. Search by product keyword, e.g. `piece detachee`.
2. Filter rows that have `contact.phone` entries with `has_whatsapp` set to `true`.
3. Export the shortlist for outreach.

#### 3. Map the market

1. Keep the `location.latitude` and `location.longitude` columns.
2. Load the dataset into any map tool to see where a category concentrates.
3. Cross-check `is_verified` to weigh how established each shop is.

### How much does Ouedkniss Boutiques Scraper cost?

There is **no per-result surcharge** — you only pay for the Apify platform run (compute and storage) at your plan's rate. A run of **100 boutiques takes about 5 seconds** on the default 1 GB memory.

See the **Pricing** tab for current rates and plan discounts.

### FAQ

**Do I need an account, cookies, or an API key?**
No. The Actor works out of the box on public boutique data. No Ouedkniss login, cookie or key is required.

**Can I get private or restricted content?**
No. Only publicly visible boutique profiles are returned.

**How many boutiques can I get?**
Your run returns at most `max_results` boutiques (default 100).

**The AI field does nothing.**
The **Describe what you want** field needs the Actor's AI key to be configured. If it is not, clear the field and use the manual search inputs instead.

**Is it legal to collect this data?**
It collects publicly available information. Review Apify's guidance on legal and ethical data collection and use the results responsibly.

**Can I use it with the API / SDKs / MCP?**
Yes — see the **API** tab above, or connect through the Apify MCP server.

**Something isn't working.**
Open an issue from the **Issues** tab with your input and the run log. Boutiques that cannot be resolved are logged and skipped rather than failing the whole run.

### Notes and limitations

- Only public boutique data is returned.
- Follower and announcement counts are `0` when the source does not publish them.
- Some boutiques do not publish contact details; `contact` may be absent or partial.
- The wilayah filter matches province (wilaya) names; there is no separate city filter.
- AI results override the manual search fields, so leave the manual fields as you want them if you skip the AI prompt.

### Run locally

```
go run ./cmd/actor
```

Input is read from the Apify key-value store; see `INPUT_SCHEMA.json`.

### Support

Found a bug or have feedback? Open an issue in the **Issues** tab.

# Actor input Schema

## `ai_prompt` (type: `string`):

e.g. <code>real estate agencies in Alger</code>, <code>car showrooms in Oran</code>, or <code>top 50 electronics shops</code>. When set, it overrides the manual search fields below.

## `search_query` (type: `string`):

Match boutique names and descriptions. Keep it short for the best capture rate, e.g. <code>immobilier</code> or <code>meuble</code>. Leave empty to browse all boutiques in the chosen category and wilayas.

## `category` (type: `string`):

Restrict results to one shop category. <b>All categories</b> searches the full directory.

## `regions` (type: `array`):

Optional. Pick one or more Algerian wilayas (provinces). Nothing selected means the whole country.

## `max_results` (type: `integer`):

Hard cap on the number of boutiques returned. Higher values take longer and increase cost.

## `language` (type: `string`):

Language used for wilayah/city names and text. Choose the language you want the data in.

## Actor input object example

```json
{
  "ai_prompt": "computer shops in Constantine",
  "search_query": "informatique",
  "category": "",
  "regions": [],
  "max_results": 100,
  "language": "en"
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per scraped boutique. Export as JSON, CSV, Excel, or XML.

# 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 = {
    "search_query": "immobilier",
    "category": "",
    "regions": [],
    "max_results": 100,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("harpoon/ouedkniss-boutiques-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 = {
    "search_query": "immobilier",
    "category": "",
    "regions": [],
    "max_results": 100,
    "language": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("harpoon/ouedkniss-boutiques-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 '{
  "search_query": "immobilier",
  "category": "",
  "regions": [],
  "max_results": 100,
  "language": "en"
}' |
apify call harpoon/ouedkniss-boutiques-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,harpoon/ouedkniss-boutiques-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/JRsPglxZecdudxLDa/builds/QYcM3zSVFxymOVMof/openapi.json
