# AI Research Evidence Verification (`suezcanal.xyz/research-verification`) Actor

Verify whether caller-supplied research evidence is sufficient, independent, fresh, and non-contradictory. Returns SUPPORTED, UNRESOLVED, or INSUFFICIENT\_EVIDENCE with missing evidence and a confidence ceiling.

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

## Pricing

$0.02 / research verification report

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

AI Research Evidence Verification is a deterministic evidence-quality gate for agents, OSINT pipelines, research workflows, and automated decision systems. It checks whether caller-supplied evidence is structurally sufficient, independent, fresh, and non-contradictory enough to justify a downstream conclusion — without replacing missing information with an LLM guess.

The Actor returns `SUPPORTED`, `UNRESOLVED`, or `INSUFFICIENT_EVIDENCE`, plus the evidence gaps and confidence limits that explain the result.

### What it checks

For one structured claim and a set of caller-supplied evidence items, Research Verification evaluates:

- required evidence-class coverage;
- source independence;
- freshness and unknown freshness;
- supporting versus contradicting evidence;
- contradiction ratio;
- a maximum justifiable confidence ceiling;
- source provenance URLs supplied by the caller.

Duplicate evidence from the same source does not become independent corroboration merely because it has another URL or ID. Evidence with unknown freshness is not silently treated as current.

### What it does not do

This Actor does not crawl the web, discover evidence, perform forensic capture, establish chain of custody, or determine legal admissibility. It evaluates structured evidence supplied by an upstream retriever, researcher, agent, or application.

### Typical uses

Use Research Verification as a pre-publication evidence check, an OSINT evidence-quality gate, a guardrail before an autonomous agent acts on a researched claim, or a machine-readable step between retrieval and decision making.

It is especially useful when a workflow needs to preserve explicit missing evidence instead of forcing a fluent yes/no answer.

### Input

Provide a `claim`, an `evidence` inventory, and `as_of`. Evidence items can include a source identity and URL, evidence class, relation to the claim, observation timestamp, and freshness TTL.

```json
{
  "claim": {
    "id": "claim-1",
    "text": "The declared requirement is currently in force.",
    "required_evidence_classes": ["official_source", "independent_source"]
  },
  "evidence": [],
  "as_of": "2026-09-07T12:00:00Z"
}
```

### Output

The default dataset receives one machine-readable report containing the verdict, coverage ratio, missing evidence classes, contradiction IDs and ratio, source-independence ratio, freshness report, confidence ceiling, limiting factor, and provenance URLs.

The confidence ceiling is structural: it limits how confident a downstream system may reasonably be given the declared evidence. It is not a probability that the claim is true.

### Pricing

Research Verification uses Apify pay-per-event pricing. One `research-verification-report` event is charged only when a complete report is written to the default dataset. The beta event price is USD 0.02 per completed report.

### Limitations

The result depends on the quality and identity metadata of caller-supplied evidence. Hidden common ownership, copied reporting, inaccurate timestamps, or incorrect upstream extraction cannot be inferred unless represented in the input. Human review remains appropriate for high-impact or ambiguous decisions.

Do not submit passwords, API keys, private keys, personal data, or confidential material that is not necessary for the assessment.

### Suez Evidence & Decision Infrastructure for AI Agents

Research Verification is part of the Suez evidence-and-decision tool family. A typical workflow can use **Agent Readiness** to audit machine-facing publication, **Research Verification** to test evidence sufficiency, **Task Feasibility** to preflight execution, **Opportunity Decision** to make a bounded pursuit decision, and **Decision Monitor** to compare that decision as evidence or assumptions change. Each Actor remains independently callable.

# Actor input Schema

## `claim` (type: `object`):

Structured claim with the evidence classes that must be present before high confidence is justified.

## `evidence` (type: `array`):

Caller-supplied evidence items. Each item declares its source, class, relation to the claim, observation time and optional freshness TTL.

## `as_of` (type: `string`):

ISO 8601 timestamp used for explicit freshness calculations.

## Actor input object example

```json
{
  "claim": {
    "id": "claim-1",
    "text": "The restriction is currently in force.",
    "required_evidence_classes": [
      "official_record",
      "independent_report"
    ]
  },
  "evidence": [
    {
      "id": "official",
      "evidence_class": "official_record",
      "source": {
        "id": "authority",
        "url": "https://example.org/official-record",
        "source_type": "official_record",
        "publisher": "Example Authority"
      },
      "evidence_kind": "TRANSMITTED",
      "observed_at": "2026-09-06T10:00:00Z",
      "max_age_seconds": 86400,
      "claim_id": "claim-1",
      "relation": "SUPPORTS"
    },
    {
      "id": "independent",
      "evidence_class": "independent_report",
      "source": {
        "id": "observer",
        "url": "https://example.org/independent-report"
      },
      "evidence_kind": "TRANSMITTED",
      "observed_at": "2026-09-06T09:30:00Z",
      "max_age_seconds": 86400,
      "claim_id": "claim-1",
      "relation": "SUPPORTS"
    }
  ],
  "as_of": "2026-09-06T12:00:00Z"
}
```

# Actor output Schema

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

Default dataset items containing verdict, evidence coverage, missing evidence, contradiction ratio, source independence, freshness, confidence ceiling and provenance.

# 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 = {
    "claim": {
        "id": "claim-1",
        "text": "The restriction is currently in force.",
        "required_evidence_classes": [
            "official_record",
            "independent_report"
        ]
    },
    "evidence": [
        {
            "id": "official",
            "evidence_class": "official_record",
            "source": {
                "id": "authority",
                "url": "https://example.org/official-record",
                "source_type": "official_record",
                "publisher": "Example Authority"
            },
            "evidence_kind": "TRANSMITTED",
            "observed_at": "2026-09-06T10:00:00Z",
            "max_age_seconds": 86400,
            "claim_id": "claim-1",
            "relation": "SUPPORTS"
        },
        {
            "id": "independent",
            "evidence_class": "independent_report",
            "source": {
                "id": "observer",
                "url": "https://example.org/independent-report"
            },
            "evidence_kind": "TRANSMITTED",
            "observed_at": "2026-09-06T09:30:00Z",
            "max_age_seconds": 86400,
            "claim_id": "claim-1",
            "relation": "SUPPORTS"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("suezcanal.xyz/research-verification").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 = {
    "claim": {
        "id": "claim-1",
        "text": "The restriction is currently in force.",
        "required_evidence_classes": [
            "official_record",
            "independent_report",
        ],
    },
    "evidence": [
        {
            "id": "official",
            "evidence_class": "official_record",
            "source": {
                "id": "authority",
                "url": "https://example.org/official-record",
                "source_type": "official_record",
                "publisher": "Example Authority",
            },
            "evidence_kind": "TRANSMITTED",
            "observed_at": "2026-09-06T10:00:00Z",
            "max_age_seconds": 86400,
            "claim_id": "claim-1",
            "relation": "SUPPORTS",
        },
        {
            "id": "independent",
            "evidence_class": "independent_report",
            "source": {
                "id": "observer",
                "url": "https://example.org/independent-report",
            },
            "evidence_kind": "TRANSMITTED",
            "observed_at": "2026-09-06T09:30:00Z",
            "max_age_seconds": 86400,
            "claim_id": "claim-1",
            "relation": "SUPPORTS",
        },
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("suezcanal.xyz/research-verification").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 '{
  "claim": {
    "id": "claim-1",
    "text": "The restriction is currently in force.",
    "required_evidence_classes": [
      "official_record",
      "independent_report"
    ]
  },
  "evidence": [
    {
      "id": "official",
      "evidence_class": "official_record",
      "source": {
        "id": "authority",
        "url": "https://example.org/official-record",
        "source_type": "official_record",
        "publisher": "Example Authority"
      },
      "evidence_kind": "TRANSMITTED",
      "observed_at": "2026-09-06T10:00:00Z",
      "max_age_seconds": 86400,
      "claim_id": "claim-1",
      "relation": "SUPPORTS"
    },
    {
      "id": "independent",
      "evidence_class": "independent_report",
      "source": {
        "id": "observer",
        "url": "https://example.org/independent-report"
      },
      "evidence_kind": "TRANSMITTED",
      "observed_at": "2026-09-06T09:30:00Z",
      "max_age_seconds": 86400,
      "claim_id": "claim-1",
      "relation": "SUPPORTS"
    }
  ]
}' |
apify call suezcanal.xyz/research-verification --silent --output-dataset

```

## MCP server setup

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

```

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/PrgKvnTJUdTUEwUXW/builds/gBSIfjIU4cv1uLtwk/openapi.json
