← All use cases
Research & NicheRegexJSONPath

Academic Journal and Paper Update Alerts

Watch journal issue pages and preprint servers for new papers matching your interests - without waiting for the weekly digest.

Verid Use Cases·4 min read

The scenario

You're an active researcher. Your literature watch covers ten venues - a few journals in your field, arXiv categories that matter, maybe Semantic Scholar topics. Most journals send a weekly TOC email. arXiv has RSS. Each system is a different latency and a different inbox.

You'd like one alerting system that fires the moment a new paper matching your filter posts.

The problem

The native subscription channels have wildly different cadences. Journal TOC emails are weekly. arXiv RSS updates daily-ish. Google Scholar alerts are noisy and don't speak Slack. The result is that researchers usually have either an underused alert that fires too rarely or an overused inbox folder they ignore.

How Verid solves it

For RSS- or Atom-based sources (arXiv, most journal RSS feeds), the regex extractor against the feed XML is fast and reliable. For sources with a JSON API (Semantic Scholar, OpenAlex, Crossref), JSONPath against the API response is even cleaner.

Verid polls on your interval, extracts the most recent paper's title and authors, and fires when it changes. Keyword filtering happens via a regex predicate against the title.

Build the monitor

Extraction config - arXiv RSS

{
  "method": "regex",
  "fields": {
    "latest_title": "<entry>\\s*<id>[^<]+</id>\\s*<updated>[^<]+</updated>\\s*<published>[^<]+</published>\\s*<title>([^<]+)</title>",
    "latest_url": "<entry>\\s*<id>([^<]+)</id>"
  }
}

Extraction config - Semantic Scholar API (JSON)

{
  "method": "json_path",
  "fields": {
    "latest_title": "$.data[0].title",
    "latest_authors": "$.data[0].authors[*].name",
    "latest_year": "$.data[0].year",
    "latest_url": "$.data[0].url"
  }
}

Predicate

For all new papers from a venue:

{ "type": "field_changes", "field": "latest_title" }

For only papers matching a keyword (e.g. "diffusion"):

{
  "type": "composite",
  "operator": "AND",
  "conditions": [
    { "type": "field_changes", "field": "latest_title" },
    { "type": "field_matches_regex", "field": "latest_title", "pattern": "(?i)diffusion" }
  ]
}

Create the monitor

arXiv via RSS:

curl -X POST https://api.verid.dev/v1/monitors \
  -H "Authorization: Bearer vrd_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "arXiv cs.LG - diffusion papers",
    "url": "https://arxiv.org/rss/cs.LG",
    "schedule_interval_seconds": 21600,
    "extract_config": {
      "method": "regex",
      "fields": {
        "latest_title": "<entry>\\s*<id>[^<]+</id>\\s*<updated>[^<]+</updated>\\s*<published>[^<]+</published>\\s*<title>([^<]+)</title>",
        "latest_url": "<entry>\\s*<id>([^<]+)</id>"
      }
    },
    "diff_predicate": {
      "type": "composite",
      "operator": "AND",
      "conditions": [
        { "type": "field_changes", "field": "latest_title" },
        { "type": "field_matches_regex", "field": "latest_title", "pattern": "(?i)diffusion" }
      ]
    },
    "deliveries": [
      { "type": "slack", "webhookUrl": "https://hooks.slack.com/services/..." }
    ]
  }'

SDK:

import { VeridClient } from '@verid.dev/sdk';

const client = new VeridClient({ apiKey: 'vrd_your_api_key' });

await client.monitors.create({
  name: 'arXiv cs.LG - diffusion papers',
  url: 'https://arxiv.org/rss/cs.LG',
  schedule_interval_seconds: 21600,
  extract_config: {
    method: 'regex',
    fields: {
      latest_title:
        '<entry>\\s*<id>[^<]+</id>\\s*<updated>[^<]+</updated>\\s*<published>[^<]+</published>\\s*<title>([^<]+)</title>',
      latest_url: '<entry>\\s*<id>([^<]+)</id>',
    },
  },
  diff_predicate: {
    type: 'composite',
    operator: 'AND',
    conditions: [
      { type: 'field_changes', field: 'latest_title' },
      { type: 'field_matches_regex', field: 'latest_title', pattern: '(?i)diffusion' },
    ],
  },
  deliveries: [
    { type: 'slack', webhookUrl: 'https://hooks.slack.com/services/...' },
  ],
});

What the webhook delivers

{
  "id": "del_01H...",
  "fired_at": "2026-05-08T06:00:00Z",
  "diff": {
    "fields_changed": ["latest_title", "latest_url"],
    "before": {
      "latest_title": "Compute-Adaptive Stochastic Optimization for Transformers",
      "latest_url": "http://arxiv.org/abs/2605.09823v1"
    },
    "after": {
      "latest_title": "Diffusion Models for Structured Reasoning",
      "latest_url": "http://arxiv.org/abs/2605.09877v1"
    }
  }
}

The newest paper matched your keyword filter - the alert fires and the URL lands in your inbox or Slack.

Caveats & tips

  • arXiv updates in daily batches. A six-hour interval is plenty; a one-minute interval will not surface anything sooner because nothing posts at minute granularity.
  • Burst publishing. When a venue publishes thirty papers at once, you'll get one fire for the new top-of-list. To process the entire batch, your handler should fetch the venue's listing and process backward from the previously-seen paper.
  • JSON APIs are higher-signal. If a venue has a JSON API (Semantic Scholar's /paper/search, OpenAlex's /works), prefer that over scraping the HTML.
  • Pair filters via the regex predicate. Case-insensitive ((?i)) and word-boundary (\\b) patterns let you express "papers where the title contains 'diffusion' but not 'diffusion equation'" type filters.

Related use cases

For RSS feeds more broadly, see RSS feed new items. For grant deadlines tied to research output, see scholarship & grant deadlines. For appointment/slot availability when scheduling research interviews, see appointment & calendar slot availability.

Ship this monitor today

5 monitors free, no credit card. Set up takes about a minute.

Get started free