# Research Agent – Evidence-Graded Web Search for RAG (`perceptr0n/research-agent`) Actor

Ask a question, get a cited, evidence-graded context for your LLM: Google web and news, official EU and German law, Wikipedia, open-access science, Hacker News, Stack Overflow and GitHub. Every source rated by evidence level, facts cross-checked across sites, outdated information flagged.

- **URL**: https://apify.com/perceptr0n/research-agent.md
- **Developed by:** [Perceptron Data](https://apify.com/perceptr0n) (community)
- **Categories:** AI, Agents, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.00 / 1,000 answered questions

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

## Research Agent – Evidence-Graded Web Search for RAG

**New (13 October 2026): fewer gaps in your context.** Web pages that block bots, don't answer or need JavaScript are no longer just skipped – they get a second try through Apify's Web Fetch, rendered in a browser where needed, with no limit per question.

Ask a question, get a cited context for your LLM – and an evidence check that says how far to trust it.

<sub>By Perceptron Data</sub>

**Limits:** the checks are signals, not verdicts. Pages the agent cannot read itself – they refuse automated requests, do not answer or need JavaScript – are read through Apify's Web Fetch (billed by Apify on your account; JavaScript pages are rendered in a browser there) or else listed with the reason; PDFs are not sent there. Google returns at most 10 results per search; when Google does not answer (about one question in eight in our tests), the question is answered from the other sources, marked `partial` and not charged.

| Question | Status | Strongest evidence | Source \[1] | Time | Charged |
|---|---|---|---|---|---|
| What does Article 17 GDPR (right to erasure) require? | found | official (2 official, 1 community, 2 commercial sources) | eur-lex.europa.eu – Regulation (EU) 2016/679 (GDPR) | 25.3 s | $0.02 (question + 1 extra search) |
| What obligations do providers of high-risk AI systems have under the EU AI Act? | found | official (2 official, 3 commercial) | eur-lex.europa.eu – AI Act, consolidated version of 27 July 2026 | 52.6 s | $0.02 (question + 1 extra search) |
| Wann verjähren Mängelansprüche nach § 438 BGB? | found | official (3 official, 1 institution, 3 commercial) | gesetze-im-internet.de – § 438 BGB | 27.9 s | $0.02 (question + 1 extra search) |

*Apify platform runs of 12 October 2026 (the published example tasks). In the same check, "What is the German minimum wage per hour in 2026?" found no sources because Google did not answer – status `no_sources`, not charged.*

**What you are not charged for:** questions without relevant results, `partial` answers (Google did not respond), `skipped` and `error` rows, and the example question prefilled in the form. A run never charges more than the maximum cost you set; questions beyond it are listed as `skipped`. Every run has a start fee of $0.00005 at the default 1 GB.

### How to use – step by step

1. Click **Try for free** on this page (a free Apify account is enough) – the form opens with an example question, which is always free.
2. Type your question into **Question** – or many questions, one per line, into **Questions (batch)**. Name the law and the provision (*"Art. 17 GDPR"*, *"§ 438 BGB"*) to get that provision first.
3. Pick **Sources** (web and Wikipedia by default; add news, law, science, discussions, code) and, for legal or regulatory questions, **Evidence preference: official first**.
4. Click **Start**. A question usually takes 10–40 seconds, with news, law and the second search round 45–80 seconds.
5. Open the **Output** tab: **Overview** (question, status, context), **Evidence check**, **Sources** and **Passages**. Put `context` into your prompt, or read the rows through the API (examples below).

![Research Agent output: five questions with status, strongest evidence level, cited sources by level, first source, freshness and seconds – Apify platform runs of 12 October 2026](https://perceptron-data.github.io/assets/readme/research-agent.png)

### What one call does

One call searches Google (web and news), official legal texts, Wikipedia, open-access science,
Hacker News, Stack Overflow and GitHub, reads pages and PDFs in full and keeps only the passages that
answer the question. Every answer comes with an **evidence check**:

- **Evidence level for every source** — official (laws, authorities, courts, EU, standards bodies),
  academic (peer-reviewed), preprint, institution (chambers, associations, consumer organisations),
  reference, news, documentation, community or commercial. Option *Official first* ranks primary sources
  clearly ahead of blogs and vendor pages.
- **Facts cross-checked across sites** — amounts, percentages, energy and power figures, dates: which
  values are consistent across independent sites and which come from a single source. Amounts that
  contradict each other are flagged — only when they refer to the same thing, the same unit (per hour vs
  per month) and the same year — with the sentences side by side.
- **Freshness warnings** — age of the cited sources, a note when nothing is from the year you asked about,
  and wording that signals a change: *amended by, repealed, replaced by, postponed, geändert durch,
  aufgehoben …*
- **Official legal texts, hard to get elsewhere** — EU law straight from the EU Publications Office in its
  **current consolidated version** (all 24 EU languages, articles and annexes with their numbers, the
  amending acts listed), even though EUR-Lex blocks automated access; German federal law from
  gesetze-im-internet.de. Name the law and the provision — *"Art. 17 GDPR"*, *"Article 5 AI Act"*,
  *"Annex III AI Act"*, *"Recital 26 GDPR"*, *"§ 438 BGB"*, *"Art. 1 GG"* — and that provision is loaded
  and ranked first, even without a search. Recognised by name: GDPR, AI Act, DSA, DMA, Data Act, Data
  Governance Act, NIS2, DORA, Cyber Resilience Act, Machinery Regulation, MDR, IVDR, eIDAS, Product
  Liability Directive, Accessibility Act, CSRD, CSDDD, EUDR, Batteries Regulation, GPSR, EMFA, and 38
  German federal laws (BGB, HGB, GG, EEG, UWG, BDSG …). Short forms that also mean other things (DSA, DMA,
  DORA, CRA, MDR) count only next to legal wording, so *"DORA metrics"* stays a DevOps question. EUR-Lex
  pages found by the web search are read the same way, from the EU Publications Office.
- **Open-access papers read in full** — not just abstracts (OpenAlex, 330 M+ works).
- **Optional second search round** — learns the specialist terms the first results use (a regulation
  number, the official name of a programme) and searches again.

No language model is involved: ranking and checks are rule-based, reproducible, and nothing is sent to a
third-party AI.

### Example of the evidence check

Question: *"Was kostet ein Balkonkraftwerk 2026?"* (real run, 8 October 2026):

```json
"agreement": {
  "summary": "3 fact(s) consistent across 2+ independent sites, 0 conflict(s), 6 single-source fact(s)",
  "facts": [
    { "topic": "kostet Balkonkraftwerk", "kind": "money:EUR",
      "values": ["200 und 1.200 €", "250 und 500 Euro", "350 Euro", "500 Euro"],
      "citations": [1, 3, 5, 6], "sites": 4, "status": "consistent" }
  ]
},
"freshness": { "status": "current", "newestSource": "2026-08-21", "medianAgeDays": 149, "notes": [] }
```

The `context` field ends with these findings as *Evidence notes*, so the LLM sees them too.

### What you get per question

| Field | What it is |
|---|---|
| `context` | Ready-to-paste block: numbered sources `[1]`, `[2]` … with URL, date and evidence level, their top-ranked passages, then the evidence notes. |
| `passages` | Selected passages with stable `id` (for vector-database upserts), citation, URL, title, site, `publishedAt`, `updatedAt`, `evidenceLevel`, score, tokens. |
| `evidence` | Evidence levels of the cited sources and the strongest one. |
| `agreement` | Facts compared across independent sites: consistent, single source, conflicts. |
| `freshness` | `current` / `aging` / `stale`, newest source, median age, notes, change signals. |
| `sources` | Every source considered — also those that could not be read, with the reason. EU acts carry CELEX number, consolidated version and amending acts. |
| `coverage` | Per source: results and failures; Google searches used; the second-round query. |
| `status` | `found`, `partial` (Google did not answer), `no_relevant_text`, `no_sources`, `not_readable`, `skipped` (time or cost limit) or `error` — never an empty row without a reason. |

### Limits first

- **Checks are signals, not verdicts.** Consistency means the values of several sites overlap; a
  "conflict" may still describe different variants of a product — the example sentences are included so
  your LLM can judge. Dates are listed and compared, but never reported as conflicts (a law has several
  deadlines).
- **Pages the agent cannot read itself** – they refuse automated requests (HTTP 401/402/403/429 or a bot
  check), do not answer (timeout, network or server error) or are drawn by JavaScript – are read through
  Apify's own Web Fetch instead; JavaScript pages are rendered in a browser there. Billed by Apify on your
  account (see Pricing). A page on its way through Web Fetch may take up to 30 seconds longer than the
  others; if Web Fetch does not get it in time either, the page is listed with both reasons. PDFs are not
  sent there: in our test of 13 October 2026, PDFs behind a bot check (PubMed Central, MDPI) did not come
  back through Web Fetch either. YouTube, Reddit, X, Facebook, Instagram, TikTok and LinkedIn posts are
  skipped up front.
- **Speed:** with the default sources typically 10–40 seconds per question; with news, law and the second
  round 45–80 seconds. A slow Google answer is retried automatically; Google News is dropped after
  25 seconds rather than delaying the answer. If Google does not answer at all (in our tests about one
  question in eight), the question is answered from the other sources, marked `partial` and **not
  charged**.
- **Science:** full text only for open-access papers (top 3 per question); otherwise the abstract.
- **German federal law** pages are read through one Apify Proxy address per run; the site refuses
  direct connections from data centres.
- **GitHub without a token** allows about 10 searches per minute. OpenAlex and Stack Exchange limit
  anonymous use per day; when a limit is reached, the source is reported as failed in `coverage` — never
  silently as "no results".
- **Google returns at most 10 results per search**, so `maxResults` is capped at 10.
- **Wikipedia, GitHub and Stack Overflow** show their last edit as `updatedAt`; it is not used as a
  publication date for the freshness check.

### How it works

1. **Search** the selected sources in parallel.
2. **Read** every page once: main text as Markdown (tables kept), PDFs page by page, EU acts as articles
   and annexes with their numbers (recitals from the act as adopted when the question names one —
   consolidated versions leave them out); title, site and date from the page.
3. **Split** into passages along headings and paragraphs; photo credits, app banners and affiliate notes
   are removed.
4. **Score** each passage (BM25 with stemming for 15 languages, question terms in heading and title,
   exact phrases, search position, year in the question, evidence level); drop off-topic passages,
   near-duplicates, link lists and boilerplate.
5. **Select** the top-ranked passages within the token budget (at most 3 per source by default); sources are
   numbered in the order of their top-ranked passage, so `[1]` is the strongest match.
6. **Check** facts and freshness across the selected passages.

### Input

| Option | Default | Notes |
|---|---|---|
| `query` / `queries` | – | One question, or many (one per line). The example question (prefilled in the form) is always free. |
| `sources` | web, wikipedia | Add `news`, `law`, `science`, `discussions`, `code`. |
| `preferEvidence` | balanced | `official_first` ranks primary sources first. |
| `deepResearch` | off | Second search round with the learned terms. |
| `scienceFullText` | on | Read open-access papers in full. |
| `tokenBudget` | 3,000 | 300–30,000 tokens of passages per question; `context` adds source headers and notes (5–15 %). |
| `maxResults` | 8 | Google results read per question (1–10). |
| `language` | auto | Detects en, de, fr, es, it, nl, pl, sv; or set a code (EU law in all 24 languages). Very short keyword queries may need it set. |
| `freshness` | any | Past day, week, month or year. |
| `urls` | – | Your own pages or PDFs (up to 50), read once per run and ranked together with the results for every question. |
| `outputMode` | one row per question | Or one row per passage, for vector databases. |

### Integrations

**API — one call, answer in the response.** A question usually takes 10–80 seconds, well within the
synchronous endpoint:

```bash
curl -X POST "https://api.apify.com/v2/acts/perceptr0n~research-agent/run-sync-get-dataset-items?fields=query,status,context" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"query": "Art. 17 GDPR: when must personal data be erased?", "sources": ["web", "law"]}'
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("perceptr0n/research-agent").call(run_input={
    "query": "What does Article 17 GDPR (right to erasure) require?",
    "sources": ["law", "web"],
})
## apify-client 3.x; with versions 1–2 use run["defaultDatasetId"]
for row in client.dataset(run.default_dataset_id).iterate_items():
    print(row["status"], row["evidence"]["strongest"], row["context"][:300])
```

**JavaScript** (`npm install apify-client`):

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('perceptr0n/research-agent').call({
    query: 'What does Article 17 GDPR (right to erasure) require?',
    sources: ['law', 'web'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].status, items[0].evidence.strongest, items[0].context.slice(0, 300));
```

**MCP (Claude, Cursor, VS Code and other agents).** Add the Apify MCP server with this Actor as a tool:
`https://mcp.apify.com?tools=perceptr0n/research-agent` – the client signs in to Apify on first
connection, or you set the header `Authorization: Bearer <APIFY_TOKEN>`. The agent sends `query`, puts
`context` into its prompt, cites with `passages[].url` and can read `agreement.conflicts` and
`freshness.notes` before it answers. Price per call (live on 12 October 2026): **$0.015 per answered
question** with one Google search, **$0.005 per additional search**, plus $0.00005 per run start;
unanswered and `partial` questions are free.

**LangChain:**

```python
from langchain_apify import ApifyActorsTool

research = ApifyActorsTool("perceptr0n/research-agent")
research.invoke({"run_input": {"query": "What does Article 5 of the AI Act prohibit?", "sources": ["law"]}})
```

**Vector databases.** Set `outputMode` to one row per passage: each row is a ready chunk with `text`,
citation metadata and a stable `id` (same URL and text → same id), so repeated runs update instead of
duplicating. Works with Apify's vector-database integrations (Pinecone, Qdrant and others) or your own
loader.

**No-code:** the Apify modules in n8n, Make and Zapier run the Actor and return the same rows.

**AI agents without an Apify account:** the Actor is enabled for Apify's agentic payments (x402, Skyfire),
so an agent can run it and pay per call.

### Examples, tested every week

The **Examples** tab has ten ready-made questions: EU AI Act obligations, GDPR articles, German law (§ BGB),
fact-checking figures, open-access science, developer questions, this week's news, RAG chunks for vector
databases, a plain web-search call for agents and two-round deep research. Every example is re-run on the
live Actor each week and checked automatically — for legal questions, for instance, that the named provision
is cited from the official text first.

### Pricing

**$0.015 per answered question** (one Google search included) and **$0.005 per additional Google
search** – news, legal texts or the second round – plus a start fee of $0.00005 per run at the default
1 GB (live since 8 October 2026). Questions without results, `partial` answers (Google did not respond),
`skipped` and `error` rows and the example question are not charged. A run never charges more than the
maximum cost you set (at least $0.05); questions beyond it are listed as `skipped`.

**Web Fetch is billed by Apify, not by this actor.** Only a page the agent cannot read itself (refused,
no answer, drawn by JavaScript) is read through Apify's own [Web Fetch](https://apify.com/apify/web-fetch)
actor. It runs on your Apify account and Apify bills it there: $0.0015 per delivered page on the free plan
plus $0.00005 per call start (Apify Store, 13 October 2026); a page that comes back drawn by JavaScript or
as a bot check is tried once more in a browser, which is a second call. Such sources say
`readVia: "Apify Web Fetch"` (or `"Apify Web Fetch (browser)"`); `webFetch: false` switches it off.

### Changelog

- **13 October 2026 (evening)** – Apify's Web Fetch now reads every page the agent cannot read itself: besides pages that refuse automated requests (now also HTTP 402, as Investopedia answers) also pages that do not answer (timeout, network or server error) and pages drawn by JavaScript, which are rendered in a browser there (`readVia: "Apify Web Fetch (browser)"`). The limit of 2 pages per question is gone; instead a page through Web Fetch may take up to 30 seconds longer than the page deadline. PDFs are not sent there. Test on the Apify platform, 13 October 2026: the technology sections of the Washington Post and the New York Times and a legal notice drawn by JavaScript (fischer.de, rendered in a browser) came back through Web Fetch; the run took 38 seconds.
- **13 October 2026** – Pages that refuse automated requests (HTTP 401/403/429, bot check) are read through Apify's Web Fetch, at most 2 per question, billed by Apify on your account ($0.0015 per delivered page); input `webFetch`, on by default. Sources read this way say `readVia: "Apify Web Fetch"`.
- **12 October 2026** – A page now gets only a date it states for itself – in its address, its metadata or next to a label such as "Last updated" – instead of a year from the page code or the date of a post linked on it; an undated page says so in `sources[].dateNote` and as "undated" in `context`. Code in passages from Stack Overflow, GitHub and other pages keeps its indentation across blank lines. More newspapers, public broadcasters and news agencies are graded `news` (for example Taipei Times and RNZ); unknown sites are not guessed to be news, and the Irish Data Protection Commission counts as `official`. OpenAlex: when the open-access PDF belongs to a different work than the record, it is not used and the work's DOI is cited (`meta.pdfNotUsed`).
- **8 October 2026 (1.0)** – First public release: evidence level for every source, facts cross-checked across sites, freshness warnings, official EU and German legal texts, open-access full texts, optional second search round. Questions Google did not answer are marked `partial` and not charged; the example question is free. Ten example tasks published and re-run every week.

### Auf Deutsch

Frage rein, zitierter Kontext mit Vertrauens-Check raus: Jede Quelle bekommt eine Evidenzstufe (amtlich,
wissenschaftlich, Preprint, Institution wie IHK oder Verbraucherzentrale, Nachschlagewerk, Nachrichten,
Dokumentation, Community, kommerziell), Zahlen werden über unabhängige Seiten abgeglichen, veraltete
oder geänderte Informationen werden markiert. Dazu amtliche Rechtstexte: EU-Recht in der aktuellen
konsolidierten Fassung (alle 24 Amtssprachen) und Bundesrecht — wer die Vorschrift nennt
(*„§ 438 BGB“*, *„Art. 17 DSGVO“*), bekommt genau diese Vorschrift. Deutsche Fragen werden automatisch
erkannt. Nicht beantwortete Fragen kosten nichts. Seiten, die automatische Abrufe abweisen, liest der Agent
über Apifys eigenen Web Fetch – ebenso Seiten, die nicht antworten, und JavaScript-Seiten, die dort im
Browser dargestellt werden (Apify rechnet das über das eigene Apify-Konto ab, 0,0015 $ je gelieferter
Seite; `webFetch: false` schaltet es ab).

### More from Perceptron Data

| Actor | What it does |
|---|---|
| [PDF to Markdown](https://apify.com/perceptr0n/pdf-to-markdown-converter) | PDF, Word, Excel and PowerPoint to Markdown for AI – tables as JSON, OCR for scans |
| [Advertiser Check (Google & Bing)](https://apify.com/perceptr0n/google-ads-transparency-scraper) | Company list in, one row per company out: Google ads, Bing ads, ad counts, accounts |
| [Imprint & VAT Check](https://apify.com/perceptr0n/imprint-impressum-website-contact-scraper) | Domains in, company rows out: legal name, address, register number and EU VAT ID checked against VIES (Swiss UIDs excluded) |
| [TED Tenders](https://apify.com/perceptr0n/eu-tenders-ted-scraper) | EU public tenders and contract awards from TED |
| [Data Source Finder](https://apify.com/perceptr0n/dach-eu-data-source-finder) | Free: tells you which ready-made scraper covers your data source |

### Support

Bug reports are welcome in the **Issues** tab.

# Actor input Schema

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

One question or search phrase. For several questions at once use **Questions** below. AI agents: put the user's question here.

## `queries` (type: `array`):

Several questions, one per line — each gets its own row. Combined with **Question** above.

## `sources` (type: `array`):

Where to look. **web**: Google results (pages are read in full, PDFs too). **news**: Google News. **law**: official legal texts — EU law in its current consolidated version (all 24 languages, via the EU Publications Office) and German federal law. **wikipedia**: Wikipedia in the question's language. **science**: OpenAlex, 330 M+ scholarly works; open-access papers are read in full. **discussions**: Hacker News threads and Stack Overflow answers. **code**: GitHub repositories (README).

## `preferEvidence` (type: `string`):

Every source gets an evidence level (official, academic, reference, news, documentation, community, commercial). **Official first** ranks laws, authorities, standards bodies and peer-reviewed work clearly ahead of blogs and vendor pages.

## `deepResearch` (type: `boolean`):

Learns the specialist terms the first results use (e.g. a regulation number) and searches Google again with them. More complete answers; charged as one extra search.

## `scienceFullText` (type: `boolean`):

For the top 3 science results with an open-access PDF, the full paper is read, not only the abstract.

## `tokenBudget` (type: `integer`):

Maximum tokens of the selected passages per question. The `context` block adds source headers and evidence notes on top (typically 5–15 %).

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

How many Google results are opened and read per question (Google returns at most 10 per search; news: half of it).

## `maxPassagesPerSource` (type: `integer`):

Keeps the context diverse: no single page can fill the budget.

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

`auto` detects the language of each question (en, de, fr, es, it, nl, pl). Or set a two-letter code — it sets the Google interface language, the Wikipedia edition and word stemming.

## `country` (type: `string`):

Two-letter country code to localise Google results, e.g. `us`, `de`.

## `freshness` (type: `string`):

Only results from the last day, week, month or year (web, news; science: month or year).

## `urls` (type: `array`):

Pages or PDFs to include in every question — e.g. your own docs. They are read and ranked together with the search results.

## `outputMode` (type: `string`):

**One row per question**: context block, passages and sources — best for agents. **One row per passage**: flat rows for vector databases.

## `includeFullText` (type: `boolean`):

Adds the complete extracted Markdown of each source to `sources[].fullText` (larger rows).

## `githubToken` (type: `string`):

Only for the code source: without a token GitHub allows about 10 searches per minute.

## `fetchTimeoutSecs` (type: `integer`):

Pages slower than this are skipped and listed with the reason. Each question waits at most this long plus 6 seconds for all pages together.

## `useProxyForPages` (type: `boolean`):

Uses one Apify datacenter proxy address for the whole run when reading pages.

## `webFetch` (type: `boolean`):

ON by default. A page the agent cannot read itself — it refuses automated requests (HTTP 401/402/403/429, a bot check), does not answer (timeout, network or server error) or is drawn by JavaScript — is read through Apify's own Web Fetch actor instead; JavaScript pages are rendered in a browser there. It runs on your Apify account and Apify bills it there: $0.0015 per delivered page on the free plan plus $0.00005 per call start (Apify Store, 13 October 2026); a page that comes back drawn by JavaScript or as a bot check is tried once more in a browser (a second call). Such a page may take up to 30 seconds longer than the others. PDFs are not sent there. Sources read this way say readVia: "Apify Web Fetch" or "Apify Web Fetch (browser)".

## Actor input object example

```json
{
  "query": "What changed in the EU AI Act with the 2026 AI omnibus?",
  "queries": [
    "What does Article 17 GDPR (right to erasure) require?",
    "What obligations do providers of high-risk AI systems have under the EU AI Act?"
  ],
  "sources": [
    "web",
    "wikipedia"
  ],
  "preferEvidence": "balanced",
  "deepResearch": false,
  "scienceFullText": true,
  "tokenBudget": 3000,
  "maxResults": 8,
  "maxPassagesPerSource": 3,
  "language": "auto",
  "country": "de",
  "freshness": "any",
  "outputMode": "query",
  "includeFullText": false,
  "fetchTimeoutSecs": 12,
  "useProxyForPages": false,
  "webFetch": true
}
```

# Actor output Schema

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

Full rows: context, passages, sources, evidence check

## `overview` (type: `string`):

No description

## `contextForLlm` (type: `string`):

Only question, status and the ready-to-paste context block

# 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": "What changed in the EU AI Act with the 2026 AI omnibus?"
};

// Run the Actor and wait for it to finish
const run = await client.actor("perceptr0n/research-agent").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": "What changed in the EU AI Act with the 2026 AI omnibus?" }

# Run the Actor and wait for it to finish
run = client.actor("perceptr0n/research-agent").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": "What changed in the EU AI Act with the 2026 AI omnibus?"
}' |
apify call perceptr0n/research-agent --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,perceptr0n/research-agent"
        }
    }
}
```

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/vN44ziKInYUkbi8pZ/builds/dORCXf2tcd2BENUa7/openapi.json
