# Research Watch Feed (`flintglade/research-watch-feed`) Actor

Monitor scholarly DOIs, model cards, clinical studies, and software repositories, producing deterministic evidence-linked JSON, Atom, and RSS change feeds.

- **URL**: https://apify.com/flintglade/research-watch-feed.md
- **Developed by:** [Flintglade](https://apify.com/flintglade) (community)
- **Categories:** Automation, Developer tools, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 entity checks

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## Research Watch Feed

Run a compact, schedulable watch over scholarly DOIs, model cards, clinical studies, and software repositories, producing evidence-linked JSON, Atom, or RSS feed artifacts without another Flintglade service.

### What this does not do

- No broad web monitoring.
- No hosted dashboard dependency.
- No nested calls to paid Flintglade Actors.
- No generic RSS reader.
- No LLM summaries.
- No source type outside the four launch profiles.

### Source classes and authorization

`scholarlyDoi` checks both Crossref and NCBI. `modelCard` resolves an immutable Hugging Face revision and reads its `README.md`. `clinicalStudy` reads ClinicalTrials.gov API v2. `softwareRepository` reads bounded GitHub repository, release, tag, and requested repository-advisory metadata. These are official APIs or official repository content. Optional `hfToken` and `githubToken` values go only to their matching adapter and never appear in output.

### Inputs

Provide 1-500 discriminated `entities`, a stateless preview or persistent baseline mode, a deterministic `changeThreshold`, one or more feed formats, and concurrency from 1 through 8. Persistent mode requires `baselineStoreId`; stateless mode forbids it.

```json
{
  "entities": [{"profile": "scholarlyDoi", "doi": "10.1038/s41586-021-03819-2"}],
  "mode": "stateless",
  "feedFormats": ["json"],
  "includeUnchanged": true,
  "concurrency": 1
}
````

### Outputs

Each admitted entity produces one strict dataset result with its normalized identity, terminal status, source status, source evidence, baseline transaction, deterministic summary, stable event ID, and artifact link. A final uncharged run-summary row reports profile/status counts, paid events, baseline commits, failures, and artifacts. Requested KVS files are `RESEARCH_WATCH.json`, `RESEARCH_WATCH.atom`, and `RESEARCH_WATCH.rss`; `RESEARCH_WATCH_MANIFEST.json` records content type, byte length, SHA-256, schema version, and generation rule.

```json
{
  "recordType": "result",
  "profile": "scholarlyDoi",
  "status": "baseline_created",
  "sourceStatus": "complete",
  "charge": {"event": "entity-check", "chargeable": true, "reason": "baseline_created"},
  "event": {"changeType": "baseline_created", "severity": "info", "summary": "Baseline created for 10.1038/s41586-021-03819-2."},
  "artifactLink": "RESEARCH_WATCH.json"
}
```

### Pricing

The primary pay-per-event business event is `entity-check` at $0.02. The maximum estimate is the number of terminal entity checks multiplied by $0.02: one check is $0.02, 100 are at most $2.00, and 500 are at most $10.00. Baseline creation, unchanged, changed, and profile-confirmed terminal negatives are chargeable. Source outage, auth failure, unsafe input, malformed responses, duplicate entries, and charge-limit rows are not. Feed generation and the run summary are never charged.

The runtime asks Apify for the preflight event allowance, never schedules beyond that allowance, stops new scheduling when `event_charge_limit_reached` is returned, uses the exact `entity-check` spelling only on chargeable `push_data` calls, and commits baseline state or includes a paid feed event only after `charged_count == 1`.

### State and baseline behavior

Stateless mode creates preview baseline events without writing monitoring state. Persistent records are namespaced by profile and hashed entity identity. A prepared journal is written before billing; the current baseline and history are committed after billing succeeds. Recovery completes charged pending journals. Expected-prior-hash checks refuse concurrent overwrite. Clinical-study absence requires two persistent observations at least six hours apart.

### Partial failures and negative results

Mixed batches continue when one profile fails. A failed entity has a stable status, evidence locator, safe error code, and no charge. Scholarly absence requires terminal Crossref and NCBI responses. Hugging Face and GitHub official 404 responses are definitive. ClinicalTrials.gov 404 is uncharged until persistent confirmation. Duplicate normalized identities are not fetched twice.

### Resource limits

The Actor accepts at most 500 entities, runs at concurrency 1-8, limits each response to 5 MB and JSON depth to 50, caps GitHub releases/tags/advisories at 20 each, and uses at most 256 MB minimum, 1024 MB default, and 2048 MB maximum memory. Hosted timeout is 900 seconds.

### Data handling, privacy, and deletion

Source records are canonicalized in memory. Result rows contain bounded evidence and semantic changes, not full raw responses. Feed artifacts and persistent baselines live in Apify storage selected by the user and follow that storage's retention/deletion controls. See [PRIVACY.md](PRIVACY.md).

### Source rights and attribution

Every source record names the provider, official request locator, raw hash, attribution, and terms URL. This Actor does not bypass access controls or retrieve paywalled full text. See [SOURCE\_POLICY.md](SOURCE_POLICY.md).

### Limitations

Deterministic templates are not expert interpretation. Provider metadata can be incomplete or delayed. `materialOnly` is a versioned operational filter, not a legal, medical, security, or scientific significance judgment. A moved Git tag is high-severity evidence but is not automatically malicious.

### Support and changelog

See [SUPPORT.md](SUPPORT.md) for support and [CHANGELOG.md](CHANGELOG.md) for release history.

# Actor input Schema

## `inputSchemaVersion` (type: `integer`):

Fixed input contract version. Leave this set to 1.

## `entities` (type: `array`):

One of the four fixed launch profiles. Duplicate normalized identities are reported once and never fetched or charged twice.

## `mode` (type: `string`):

Stateless creates a one-run baseline preview. Persistent compares and commits through the selected baseline store.

## `baselineStoreId` (type: `string`):

Required in persistent mode and forbidden in stateless mode.

## `changeThreshold` (type: `string`):

allSemantic emits every deterministic semantic change; materialOnly emits profile-specific material paths while still advancing a paid baseline.

## `feedFormats` (type: `array`):

KVS artifacts generated from the same stable WatchEvent objects.

## `includeUnchanged` (type: `boolean`):

Include paid unchanged checks in feed artifacts. Dataset result rows remain present because charging is per entity check.

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

Maximum simultaneous entity checks. Source requests remain bounded within each profile.

## `hfToken` (type: `string`):

Optional credential passed only to the model-card adapter.

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

Optional credential passed only to the software-repository adapter.

## Actor input object example

```json
{
  "inputSchemaVersion": 1,
  "entities": [
    {
      "profile": "scholarlyDoi",
      "doi": "10.1038/s41586-021-03819-2"
    }
  ],
  "mode": "stateless",
  "changeThreshold": "allSemantic",
  "feedFormats": [
    "json"
  ],
  "includeUnchanged": true,
  "concurrency": 4
}
```

# Actor output Schema

## `defaultDataset` (type: `string`):

No description

## `jsonFeed` (type: `string`):

No description

## `atomFeed` (type: `string`):

No description

## `rssFeed` (type: `string`):

No description

## `artifactManifest` (type: `string`):

No description

# 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 = {
    "entities": [
        {
            "profile": "scholarlyDoi",
            "doi": "10.1038/s41586-021-03819-2"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("flintglade/research-watch-feed").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 = { "entities": [{
            "profile": "scholarlyDoi",
            "doi": "10.1038/s41586-021-03819-2",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("flintglade/research-watch-feed").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "entities": [
    {
      "profile": "scholarlyDoi",
      "doi": "10.1038/s41586-021-03819-2"
    }
  ]
}' |
apify call flintglade/research-watch-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=flintglade/research-watch-feed",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Research Watch Feed",
        "description": "Monitor scholarly DOIs, model cards, clinical studies, and software repositories, producing deterministic evidence-linked JSON, Atom, and RSS change feeds.",
        "version": "0.1",
        "x-build-id": "w3nFVHcrXBVAa59qH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/flintglade~research-watch-feed/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-flintglade-research-watch-feed",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/flintglade~research-watch-feed/runs": {
            "post": {
                "operationId": "runs-sync-flintglade-research-watch-feed",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/flintglade~research-watch-feed/run-sync": {
            "post": {
                "operationId": "run-sync-flintglade-research-watch-feed",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "entities"
                ],
                "properties": {
                    "inputSchemaVersion": {
                        "title": "Input schema version",
                        "minimum": 1,
                        "maximum": 1,
                        "type": "integer",
                        "description": "Fixed input contract version. Leave this set to 1.",
                        "default": 1
                    },
                    "entities": {
                        "title": "Research entities",
                        "minItems": 1,
                        "maxItems": 500,
                        "type": "array",
                        "description": "One of the four fixed launch profiles. Duplicate normalized identities are reported once and never fetched or charged twice.",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "profile": {
                                    "title": "Profile",
                                    "description": "One fixed launch profile.",
                                    "type": "string",
                                    "enum": [
                                        "scholarlyDoi",
                                        "modelCard",
                                        "clinicalStudy",
                                        "softwareRepository"
                                    ]
                                },
                                "doi": {
                                    "title": "DOI",
                                    "description": "Required only for scholarlyDoi.",
                                    "type": "string",
                                    "minLength": 7,
                                    "maxLength": 512
                                },
                                "huggingFaceRepo": {
                                    "title": "Hugging Face repository",
                                    "description": "Required owner/name only for modelCard.",
                                    "type": "string",
                                    "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,98}/[A-Za-z0-9][A-Za-z0-9._-]{0,98}$"
                                },
                                "revision": {
                                    "title": "Model-card revision",
                                    "description": "Optional branch, tag, or revision for modelCard; omitted values use main and resolve to an immutable SHA.",
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 128
                                },
                                "studyId": {
                                    "title": "NCT ID",
                                    "description": "Required NCT plus eight digits only for clinicalStudy.",
                                    "type": "string",
                                    "pattern": "^[Nn][Cc][Tt][0-9]{8}$"
                                },
                                "repository": {
                                    "title": "GitHub repository",
                                    "description": "Required owner/name only for softwareRepository.",
                                    "type": "string",
                                    "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,98}/[A-Za-z0-9][A-Za-z0-9._-]{0,98}$"
                                },
                                "includeAdvisories": {
                                    "title": "Include repository advisories",
                                    "description": "Request official repository advisories for softwareRepository; omitted values default to true at runtime.",
                                    "type": "boolean"
                                }
                            },
                            "required": [
                                "profile"
                            ]
                        }
                    },
                    "mode": {
                        "title": "Monitoring mode",
                        "enum": [
                            "stateless",
                            "persistent"
                        ],
                        "type": "string",
                        "description": "Stateless creates a one-run baseline preview. Persistent compares and commits through the selected baseline store.",
                        "default": "stateless"
                    },
                    "baselineStoreId": {
                        "title": "Baseline key-value store",
                        "minLength": 1,
                        "maxLength": 100,
                        "type": "string",
                        "description": "Required in persistent mode and forbidden in stateless mode."
                    },
                    "changeThreshold": {
                        "title": "Change threshold",
                        "enum": [
                            "allSemantic",
                            "materialOnly"
                        ],
                        "type": "string",
                        "description": "allSemantic emits every deterministic semantic change; materialOnly emits profile-specific material paths while still advancing a paid baseline.",
                        "default": "allSemantic"
                    },
                    "feedFormats": {
                        "title": "Feed formats",
                        "minItems": 1,
                        "maxItems": 3,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "KVS artifacts generated from the same stable WatchEvent objects.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "json",
                                "atom",
                                "rss"
                            ]
                        },
                        "default": [
                            "json"
                        ]
                    },
                    "includeUnchanged": {
                        "title": "Include unchanged events",
                        "type": "boolean",
                        "description": "Include paid unchanged checks in feed artifacts. Dataset result rows remain present because charging is per entity check.",
                        "default": true
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Maximum simultaneous entity checks. Source requests remain bounded within each profile.",
                        "default": 4
                    },
                    "hfToken": {
                        "title": "Hugging Face token",
                        "type": "string",
                        "description": "Optional credential passed only to the model-card adapter."
                    },
                    "githubToken": {
                        "title": "GitHub token",
                        "type": "string",
                        "description": "Optional credential passed only to the software-repository adapter."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
