# Dataset AI Enrich (LLM Classify, Extract, Summarise Rows) (`nerolabs/dataset-ai-enrich`) Actor

Runs one plain-English instruction against every row of any Apify dataset, CSV/Excel/JSON file URL or JSON array and writes the answer back as new structured columns: classify, extract, score, summarise, translate. No API key needed (tokens billed via apify/openrouter). Pay per enriched row.

- **URL**: https://apify.com/nerolabs/dataset-ai-enrich.md
- **Developed by:** [Adam Pearce](https://apify.com/nerolabs) (community)
- **Categories:** AI, Developer tools, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 row enricheds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**Stop hand-tagging scraped data.** Dataset AI Enrich takes any Apify dataset, a CSV, Excel or JSON file by URL, a Google Sheet, or a JSON array you paste in, runs one plain-English instruction against every row, and writes the answer back as **new structured columns**: sentiment, category, a 1 to 10 score, an extracted company name, a summary, a translation, a normalised job title, a yes/no decision. **No API key needed**: the model tokens are billed to your Apify account through Apify's own OpenRouter proxy, and you only pay this Actor per row that comes back enriched. Use Claude Haiku 4.5 (the default), GPT, Gemini, DeepSeek, Mistral or any of 400+ models by id.

### Why use Dataset AI Enrich?

Scrapers give you raw text. What you actually need is a label, a number or a clean field you can filter, sort and count. The usual fix is a Python script with an API key, a prompt loop, retries and a JSON parser, rewritten for every dataset. This Actor is that loop as a reusable, scheduled, API-callable step:

- **Reviews and social listening**: sentiment, main topic, product aspects, urgency, "needs a reply" flag.
- **Lead lists**: industry, company size bucket, seniority, buying-signal score, "is this a real business?".
- **Job boards**: normalised title, seniority, remote or on-site, salary extracted from free text, tech stack.
- **E-commerce**: category, colour, material, size from a messy title and description; spec extraction.
- **Content and news**: one-line summary, named entities, language, tone, relevance to your topic.
- **Any language**: translate a field, or answer in the language you choose.
- **Data cleanup the rules can't do**: split "Dr. Jane A. Smith-Jones" into first and last name, standardise addresses, resolve "NYC" to "New York".

Because it runs on Apify, you get scheduling, API access, dataset integrations (Zapier, Make, Google Sheets, webhooks), and full run history for free. Chain it after any scraper and before the other Nero Labs dataset tools.

### How to use Dataset AI Enrich

1. Click **Try for free** (or **Start**) on this Actor.
2. Bring in your rows: pick a dataset, paste a **File URL** (CSV, Excel, JSON, Google Sheet), or paste rows into **Data (inline)**.
3. Write the **Instruction** with `{{field}}` placeholders for the row values you want the model to see.
4. Define the **Output columns**: a name, a type (string, number, boolean, array, object) and a one-line description of what goes in each.
5. Set **Preview** to 5, run, and check the new columns. Adjust the instruction if needed.
6. Set Preview back to 0 and run the full input. Optionally export CSV/Excel, append to a named dataset, or POST to a webhook.

The default input runs three product reviews through the default model in a few seconds so you can see exactly how it behaves before pointing it at your own data.

### Example

Instruction:

```
Classify the sentiment of this customer review as positive, neutral or negative.
Then name the main topic in one to three words, and list up to three product aspects the customer mentions.

Product: {{product}}
Review: {{review}}
```

Output columns:

```json
[
  { "name": "sentiment", "type": "string", "description": "exactly one of: positive, neutral, negative" },
  { "name": "topic", "type": "string", "description": "what the review is mainly about, one to three words, never the product name" },
  { "name": "aspects", "type": "array", "description": "up to three short product aspects the customer mentions" }
]
```

One output row:

```json
{
  "id": 1,
  "product": "Wireless earbuds",
  "review": "Battery life is fantastic and the sound is crisp, but the charging case feels cheap and creaks.",
  "sentiment": "neutral",
  "topic": "battery life and build quality",
  "aspects": ["battery life", "sound quality", "charging case"],
  "aiModel": "anthropic/claude-haiku-4.5",
  "aiError": null
}
```

### Writing a good instruction

- **Name the allowed values** in the column description ("exactly one of: hot, warm, cold") and the model will stick to them. That is what makes the column filterable afterwards.
- **Reference only the fields the model needs.** Only referenced fields are sent, which keeps cost down and answers focused. Reference none and the whole row is sent.
- **Ask for `null` when unsure.** The system prompt already tells the model never to invent facts; repeat it for high-stakes fields ("if no salary is stated, return null").
- **Use Extra context** for things that apply to every row: your category list, your industry, the language to answer in.
- **Long texts**: set **Rows per model request** to 1 or 2 and raise the per-field character limit if you really need the whole text.

### Models and what they cost

Two costs, both visible in your run:

1. **This Actor**: $0.005 per row that comes back enriched. Skipped rows (nothing to process) and failed rows (the model could not answer) are never charged.
2. **The model tokens**, billed to your Apify account by Apify's official [OpenRouter proxy](https://apify.com/apify/openrouter) at OpenRouter's own rates, shown in the run summary as token counts. A typical short row (a review, a job title, a product name) is roughly 150 to 400 input tokens and 30 to 80 output tokens. Rows are batched five per request by default so the instruction is only sent once per batch.

| Model | Tokens per million (in / out) | Typical cost per row | Good for |
|---|---|---|---|
| Claude Haiku 4.5 (default) | $1.00 / $5.00 | about $0.001 | accurate classification and extraction |
| GPT-4.1 nano | $0.10 / $0.40 | about $0.0001 | simple labels at scale |
| Gemini 2.5 Flash Lite | $0.10 / $0.40 | about $0.0001 | simple labels, long inputs |
| GPT-4.1 mini | $0.40 / $1.60 | about $0.0004 | balanced |
| Claude Sonnet 4.5 | $3.00 / $15.00 | about $0.003 | nuanced judgement, summaries |

So enriching **1,000 short rows** with the default model costs about **$5 to this Actor plus about $1 of tokens**; with GPT-4.1 nano about $5 plus $0.10. Free Apify plans pay 10x the token rate through the proxy (Apify's rule for free accounts), so a paid Apify plan or your own OpenRouter key is worth it above a few thousand rows.

**Own key**: paste an OpenRouter API key and requests go straight to openrouter.ai on your account, with no token cost billed through Apify.

### Input

See the **Input** tab for the full schema. Three ways to bring in data:

- **`datasetId`**: any existing Apify dataset (yours or from another Actor's run).
- **`fileUrl`**: a CSV, TSV, Excel, JSON or JSON Lines file, or a Google Sheet link (sharing set to "Anyone with the link can view").
- **`data`**: paste a JSON array directly.

```json
{
  "datasetId": "YOUR_DATASET_ID",
  "prompt": "Extract the salary range from this job ad. Return the minimum and maximum yearly salary as numbers in the ad's currency, and the currency code. If no salary is stated, return null.\n\nTitle: {{title}}\nDescription: {{description}}",
  "outputFields": [
    { "name": "salaryMin", "type": "number" },
    { "name": "salaryMax", "type": "number" },
    { "name": "currency", "type": "string", "description": "ISO code like USD, GBP, EUR, or null" }
  ],
  "model": "anthropic/claude-haiku-4.5",
  "previewRows": 5
}
```

### Output

Every input row is written to the run's dataset with the new columns added, plus `aiModel` and `aiError` (null on success). Rows the model could not process carry the error message in `aiError`; rows with nothing to process carry `aiSkipped: true`. Neither is charged. You can download the dataset as JSON, CSV or Excel from the Apify Console, request a ready-made CSV/Excel via `exportFormats`, append to a named dataset that accumulates across scheduled runs, or POST the result to a webhook. A run summary (rows enriched, skipped, failed, model, token usage, warnings) is saved to the key-value store as `AI_ENRICH_SUMMARY`.

### Pricing

Pay-per-event, no subscription:

- **$0.005** per row enriched (a row the model answered and that was written out)
- **$0.01** per file export (CSV or Excel)
- **$0.02** per confirmed webhook delivery (only when the endpoint responds 2xx)
- A small per-GB run-start fee (the platform default)
- Model tokens are billed separately by Apify's OpenRouter proxy at OpenRouter's rates (see the table above), or not at all if you use your own key

Enriching a 500-row lead list with an industry label and a fit score costs **$2.50** here plus roughly **$0.50** of tokens on the default model.

### Works with the rest of the Nero Labs dataset toolkit

Six small tools that chain together, all pay-per-event, none of them scrape anything:

- [Dataset Cleaner & Exporter](https://apify.com/nerolabs/dataset-cleaner-exporter): dedupe (exact, normalized or fuzzy), flatten nested JSON, clean emails/phones/URLs, export.
- [Dataset Filter & Transform](https://apify.com/nerolabs/dataset-filter-transform): filter rows by rule, reshape fields (dates, replace, split, hash, 25 ops), sort, dedupe, limit; also reads files and Google Sheets by URL.
- **Dataset AI Enrich** (this one): add model-generated columns to every row.
- [Dataset Join & Merge](https://apify.com/nerolabs/dataset-join-merge): VLOOKUP-style joins and unions across two datasets on a key field.
- [Dataset Aggregate, Group By & Pivot](https://apify.com/nerolabs/dataset-aggregate-pivot): counts, sums, averages and pivot tables per group.
- [Dataset Diff & Change Detector](https://apify.com/nerolabs/dataset-diff-detector): what was added, removed or changed between two runs.

A common pipeline: scraper, then Cleaner, then AI Enrich (label every row), then Filter & Transform (keep the rows that matter), then Aggregate for the weekly count per label.

### Tips

- Always run a **Preview** of 5 to 10 rows first. It costs a few cents and shows you exactly what the columns will look like.
- Keep **Temperature** at 0 for labels and extraction; the same row then gets the same answer on every run.
- If a column comes back null too often, put the allowed values or a worked example into the column description or Extra context.
- **Rows per model request** at 5 to 10 is the sweet spot for short rows; use 1 for rows with long article text.
- Set **Maximum rows to process** as a cost cap on big datasets, and **Also append to a named dataset** when this runs on a schedule.

### FAQ

**Do I need an OpenAI or Anthropic account?** No. The model is called through Apify's own OpenRouter proxy and the tokens are billed to your Apify account. You can optionally use your own OpenRouter key instead.

**Where does my data go?** The referenced fields of each row are sent to the chosen model via OpenRouter for the duration of the request, and the answer comes back into your own Apify storage. This Actor keeps nothing. Check the model provider's data policy on openrouter.ai if your rows contain personal data.

**Will it invent values?** The system prompt instructs the model to return null when a value cannot be determined from the row, every output is coerced to the declared type (a non-number in a number column becomes null, never a guess), and rows the model could not answer are written with `aiError` set rather than a made-up value. Models can still be wrong; preview, and keep the source fields alongside the new columns.

**What happens on a rate limit or a model outage?** Requests retry with backoff. Rows that still fail are written with `aiError` and are not charged, so a partial outage never silently loses rows or costs you money.

**Can I use it from an AI agent or via MCP?** Yes. It is pay-per-event with limited permissions, so it works with Apify's MCP server and agentic payments; the description and input fields are written to be read by an agent.

If this replaced a manual tagging or classification pass, a review on this page helps a small tool get found. Found a bug or want a feature? Open an issue on the **Issues** tab, replies come from a real person, usually within hours.

# Actor input Schema

## `datasetId` (type: `string`):

Pick an existing Apify dataset (for example the output of any scraper run). Use this OR 'File URL' OR 'Data (inline)' below. Declaring it this way is what lets this Actor run with limited permissions: it may read the dataset you point at, and nothing else on your account.

## `fileUrl` (type: `string`):

Instead of a dataset, download the rows from a public link: a CSV or TSV file, an Excel .xlsx file (first sheet, header row), a JSON array or JSON Lines file, or a Google Sheet (paste the normal sheet link with sharing set to 'Anyone with the link can view'). Format detected automatically. Up to 100 MB.

## `fileFormat` (type: `string`):

Only needed if automatic detection gets the file URL's format wrong.

## `data` (type: `array`):

A JSON array of records to enrich, for ad-hoc data instead of a dataset ID or file URL.

## `prompt` (type: `string`):

Plain-English instruction applied to each row on its own. Use {{field}} placeholders to insert that row's values (dotted paths like {{address.city}} work). Only the fields you reference are sent to the model; if you reference none, every field is sent. Examples: classify, extract a value, score 1 to 10, summarise, translate, normalise a job title, decide yes/no.

## `outputFields` (type: `array`):

The new columns the model must fill in for every row, as a JSON list of {"name", "type", "description"}. Types: string (default), number, boolean, array, object. The description tells the model exactly what goes in the column (allowed values, units, language). Leave empty to get one free-text column called 'aiResponse'.

## `systemPrompt` (type: `string`):

Optional background the model should know for every row: your industry, the categories you use, the language to answer in, edge-case rules.

## `model` (type: `string`):

Which model answers. Claude Haiku 4.5 is the default: fast, accurate on classification and extraction, about $0.001 of tokens per typical row. Cheaper options for simple labelling: GPT-4.1 nano, Gemini 2.5 Flash Lite, Mistral Small. Stronger options for nuanced judgement: Claude Sonnet 4.5, GPT-5 mini.

## `customModel` (type: `string`):

Any model id from openrouter.ai/models in vendor/model form, e.g. anthropic/claude-opus-4.5 or meta-llama/llama-3.3-70b-instruct.

## `openRouterApiKey` (type: `string`):

If set, requests go straight to openrouter.ai on your own key and no token cost is billed through Apify. Leave empty to use Apify's built-in proxy with no key at all.

## `previewRows` (type: `integer`):

Test your instruction cheaply before running everything: set to 5 or 10, check the output columns, then set back to 0 for the full run.

## `maxRows` (type: `integer`):

A cost guard. Rows beyond this are not loaded. Hard ceiling 50,000 per run.

## `rowsPerRequest` (type: `integer`):

How many rows share one model call. Higher is cheaper (the instruction is sent once per call) and faster; lower is safer for long texts. 5 is a good default; use 1 for very long rows.

## `concurrency` (type: `integer`):

How many model calls run at once.

## `maxInputCharsPerField` (type: `integer`):

Longer values are cut (with a '\[truncated]' marker) so one huge text field can't run up the token bill.

## `maxOutputTokensPerRow` (type: `integer`):

150 covers a label plus a short summary; raise it for long summaries or translations.

## `temperature` (type: `integer`):

0 (default) for consistent, repeatable answers, which is what classification and extraction need. Only raise it for creative rewriting. Whole number 0 to 2.

## `skipIfEmpty` (type: `boolean`):

On (default): a row with nothing in any {{field}} the instruction uses is written out with 'aiSkipped: true' and never sent to the model or charged.

## `includeOriginalFields` (type: `boolean`):

On (default): each output row is the original row plus the new columns. Off: only the new columns (plus aiModel/aiError).

## `outputDatasetName` (type: `string`):

Optional. A name (3 to 63 letters, digits or hyphens). Enriched rows are appended to a dataset with this name in your account, created on the first run, so scheduled runs accumulate in one place. Not charged again.

## `exportFormats` (type: `array`):

Also save the enriched rows as a real downloadable file in the run's key-value store. CSV opens anywhere; XLSX opens in Excel and Google Sheets.

## `webhookUrl` (type: `string`):

Optional. If set, the enriched rows (plus download links and a summary) are POSTed here as JSON the moment the run finishes. Works with a Zapier/Make/n8n catch-hook, your own API, or a Slack incoming webhook. Only charged on a confirmed HTTP 2xx; a failed delivery is a warning and costs nothing.

## Actor input object example

```json
{
  "fileFormat": "auto",
  "data": [
    {
      "id": 1,
      "product": "Wireless earbuds",
      "review": "Battery life is fantastic and the sound is crisp, but the charging case feels cheap and creaks."
    },
    {
      "id": 2,
      "product": "Standing desk",
      "review": "Arrived with a scratched top and the motor is loud enough to annoy my colleagues. Returned it."
    },
    {
      "id": 3,
      "product": "Coffee grinder",
      "review": "Does the job. Nothing special, nothing wrong, grinds evenly."
    }
  ],
  "prompt": "Classify the sentiment of this customer review as positive, neutral or negative. Then name the main topic in one to three words, and list up to three product aspects the customer mentions.\n\nProduct: {{product}}\nReview: {{review}}",
  "outputFields": [
    {
      "name": "sentiment",
      "type": "string",
      "description": "exactly one of: positive, neutral, negative"
    },
    {
      "name": "topic",
      "type": "string",
      "description": "what the review is mainly about, one to three words, e.g. battery life or delivery damage, never the product name"
    },
    {
      "name": "aspects",
      "type": "array",
      "description": "up to three short product aspects the customer mentions, e.g. battery life"
    }
  ],
  "model": "anthropic/claude-haiku-4.5",
  "previewRows": 0,
  "maxRows": 1000,
  "rowsPerRequest": 5,
  "concurrency": 4,
  "maxInputCharsPerField": 4000,
  "maxOutputTokensPerRow": 150,
  "temperature": 0,
  "skipIfEmpty": true,
  "includeOriginalFields": true,
  "exportFormats": [
    "csv"
  ]
}
```

# Actor output Schema

## `enrichedRows` (type: `string`):

Every input row with the model's output columns added (aiError set on rows the model could not process, aiSkipped on rows with nothing to process).

## `csvFile` (type: `string`):

A ready-to-open CSV file of the enriched rows, if requested.

## `xlsxFile` (type: `string`):

A ready-to-open Excel (.xlsx) file of the enriched rows, if requested.

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

Counts of rows enriched, skipped and failed, the model used, token usage, and warnings.

# 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 = {
    "data": [
        {
            "id": 1,
            "product": "Wireless earbuds",
            "review": "Battery life is fantastic and the sound is crisp, but the charging case feels cheap and creaks."
        },
        {
            "id": 2,
            "product": "Standing desk",
            "review": "Arrived with a scratched top and the motor is loud enough to annoy my colleagues. Returned it."
        },
        {
            "id": 3,
            "product": "Coffee grinder",
            "review": "Does the job. Nothing special, nothing wrong, grinds evenly."
        }
    ],
    "prompt": `Classify the sentiment of this customer review as positive, neutral or negative. Then name the main topic in one to three words, and list up to three product aspects the customer mentions.

Product: {{product}}
Review: {{review}}`,
    "outputFields": [
        {
            "name": "sentiment",
            "type": "string",
            "description": "exactly one of: positive, neutral, negative"
        },
        {
            "name": "topic",
            "type": "string",
            "description": "what the review is mainly about, one to three words, e.g. battery life or delivery damage, never the product name"
        },
        {
            "name": "aspects",
            "type": "array",
            "description": "up to three short product aspects the customer mentions, e.g. battery life"
        }
    ],
    "exportFormats": [
        "csv"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nerolabs/dataset-ai-enrich").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 = {
    "data": [
        {
            "id": 1,
            "product": "Wireless earbuds",
            "review": "Battery life is fantastic and the sound is crisp, but the charging case feels cheap and creaks.",
        },
        {
            "id": 2,
            "product": "Standing desk",
            "review": "Arrived with a scratched top and the motor is loud enough to annoy my colleagues. Returned it.",
        },
        {
            "id": 3,
            "product": "Coffee grinder",
            "review": "Does the job. Nothing special, nothing wrong, grinds evenly.",
        },
    ],
    "prompt": """Classify the sentiment of this customer review as positive, neutral or negative. Then name the main topic in one to three words, and list up to three product aspects the customer mentions.

Product: {{product}}
Review: {{review}}""",
    "outputFields": [
        {
            "name": "sentiment",
            "type": "string",
            "description": "exactly one of: positive, neutral, negative",
        },
        {
            "name": "topic",
            "type": "string",
            "description": "what the review is mainly about, one to three words, e.g. battery life or delivery damage, never the product name",
        },
        {
            "name": "aspects",
            "type": "array",
            "description": "up to three short product aspects the customer mentions, e.g. battery life",
        },
    ],
    "exportFormats": ["csv"],
}

# Run the Actor and wait for it to finish
run = client.actor("nerolabs/dataset-ai-enrich").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 '{
  "data": [
    {
      "id": 1,
      "product": "Wireless earbuds",
      "review": "Battery life is fantastic and the sound is crisp, but the charging case feels cheap and creaks."
    },
    {
      "id": 2,
      "product": "Standing desk",
      "review": "Arrived with a scratched top and the motor is loud enough to annoy my colleagues. Returned it."
    },
    {
      "id": 3,
      "product": "Coffee grinder",
      "review": "Does the job. Nothing special, nothing wrong, grinds evenly."
    }
  ],
  "prompt": "Classify the sentiment of this customer review as positive, neutral or negative. Then name the main topic in one to three words, and list up to three product aspects the customer mentions.\\n\\nProduct: {{product}}\\nReview: {{review}}",
  "outputFields": [
    {
      "name": "sentiment",
      "type": "string",
      "description": "exactly one of: positive, neutral, negative"
    },
    {
      "name": "topic",
      "type": "string",
      "description": "what the review is mainly about, one to three words, e.g. battery life or delivery damage, never the product name"
    },
    {
      "name": "aspects",
      "type": "array",
      "description": "up to three short product aspects the customer mentions, e.g. battery life"
    }
  ],
  "exportFormats": [
    "csv"
  ]
}' |
apify call nerolabs/dataset-ai-enrich --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nerolabs/dataset-ai-enrich"
        }
    }
}

```

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/CQva52xpHuIbnQ4Mm/builds/kK61pnYH5GazcHQOl/openapi.json
