Public API.

Read-only JSON over every document HealthSignal tracks. No key needed.

Base URL https://www.health-signal.com
Authentication None
Rate limit 100 req / min
Format JSON

Endpoints

GET /api/regulations

Tracked documents, filterable and paginated. Sorted by relevance by default; see sort.

ParameterTypeDescription
viewstringall (default) · healthtech. all is every classified item; healthtech narrows to general-scope, health-tech-relevant ones
searchstringFull-text search (indexed) across original and English titles, summaries and descriptions
topic[]arrayClassifier topic slug (repeatable; values OR together), e.g. samd, ai-act, ehds, reimbursement. Bare topic= also accepted for one value; /api/topics lists the full vocabulary with display labels
scopestringgeneral (binds a class of actors) · single_entity (one named product or company)
kind[]arrayDocument type (repeatable): rule_change · guidance · consultation · safety_alert · approval · supply_notice · enforcement · administrative · news. Bare kind= also accepted for one value
breadth[]arrayHow widely a document binds (repeatable): framework · sector · product_class. Bare breadth= also accepted
relevancestringHealth-tech relevance floor: core · adjacent · all (default, no floor). Narrows within view, never widens it
sortstringrelevance (default: health-tech score, obligation level and recency combined) · newest · impact (obligation level, HIGH first)
sincedateISO date; only items published or first seen on or after it
impact[]arrayObligation level (repeatable): HIGH · MEDIUM · LOW. Shown on the site as “Obligation”
category[]arrayOne of the ten categories below (repeatable)
region[]arraye.g. EU-wide, Germany, France (repeatable)
sourcestringSource registry key, e.g. ema, uk_mhra — the keys behind /sources, returned on each item as sourceKey. Repeatable as source[]
dateRangestringtoday · week · month · 3months · 6months · year
hasDeadlinesbooleantrue returns only items with extracted deadlines
pageintegerPage number, default 1
limitintegerItems per page, default 50, max 200
collapsestringinstrument groups rows on the page that cite the same instrument or digest series; the first row lists the others in alsoReported. A collapsed page can hold fewer than limit rows; pagination.total still counts documents. Off by default
curl "https://www.health-signal.com/api/regulations?topic=samd&since=2026-08-01"
curl "https://www.health-signal.com/api/regulations?impact[]=HIGH&dateRange=month&limit=10"
curl "https://www.health-signal.com/api/regulations?source=ema&kind=guidance"

An unknown filter value returns 400, and invalid in the body lists every one. /feed.xml ignores unknown values instead.

Sample response
{
  "status": "success",
  "data": {
    "regulations": [
      {
        "_id": "6908d35e99792966b6f85b38",
        "title": "AI Act General Application (High-Risk AI)",
        "description": "Obligations for high-risk AI systems apply…",
        "link": "https://eur-lex.europa.eu/…",
        "source": "European Commission",
        "sourceKey": "ec_health",
        "impact": "HIGH",
        "impactScore": 3,
        "categories": ["Digital Health & AI"],
        "geographicScope": ["EU-wide"],
        "originalPubDate": "2026-06-14T00:00:00",
        "createdAt": "2026-06-15T05:17:03",
        "classification": { "kind": "rule_change", "scope": "general", "breadth": "framework", "healthTech": { "score": 92, "relevant": true }, "topics": ["ai-act"], "titleEn": "AI Act General Application (High-Risk AI)", "summaryEn": "Obligations for high-risk AI systems apply from 2 August 2026.", "appliesFrom": "2026-08-02", "status": "ok" },
        "bodySummaryEn": "The Commission states that the obligations for high-risk AI systems under the AI Act apply from 2 August 2026.",
        "hasDeadlines": true,
        "deadlineStatus": "upcoming",
        "nextDeadline": "2026-08-02T00:00:00",
        "deadlines": [
          { "date": "2026-08-02T00:00:00", "eventType": "ENTERS_FORCE", "originalText": "General application" }
        ]
      }
    ],
    "pagination": { "page": 1, "limit": 10, "total": 2302, "pages": 231 }
  }
}

Response fields

Each item in data.regulations carries the following fields.

FieldTypeDescription
_idstringStable document identifier
titlestringTitle as published by the source, in its original language. The English title is classification.titleEn
descriptionstringThe source’s own description text, when it provides one
linkstringCanonical URL to the official source
sourcestringIssuing body, as a display name (UK MHRA). Prose — it changes if an agency renames itself
sourceKeystringRegistry key of the issuing body (uk_mhra). This is what ?source= accepts. Absent on a few early documents
impactstringObligation level — how widely and how hard the document binds: HIGH (creates or changes binding obligations for a class of actors) · MEDIUM (binds one narrow product type, or proposes something that would bind broadly) · LOW (no new obligation for a class). Derived from kind, scope and breadth; classification.healthTech.score carries topical relevance. Displayed as “Obligation”
impactScoreintegerNumeric obligation level: 3 / 2 / 1
categoriesarrayOne or more of the ten categories
geographicScopearraye.g. EU-wide, Germany
originalPubDatestringPublication date (ISO 8601, may be null)
createdAtstringWhen the item entered HealthSignal (ISO 8601)
classificationobjectThe classifier’s verdict: kind, scope, breadth (framework · sector · product_class — how widely the document binds), healthTech.score (0–100 topical proximity), topics[], titleEn, summaryEn, appliesFrom, status. AI-generated; the official source is authoritative
bodySummaryEnstringAI-generated English summary of the item’s own text: 2–4 sentences, only what the text states. Absent when the text could not be fetched, or when it is a short English text
hasDeadlinesbooleanWhether any deadlines were extracted
deadlineStatusstringupcoming · passed · none
nextDeadlinestringNext upcoming deadline date (may be null)
deadlinesarray{ date, eventType, originalText } per deadline, plus extractor metadata (confidence, pattern)
instrumentIdsarrayNormalized legal-instrument IDs extracted from the raw text — eu:2017/745, mdcg:2024-14, mhra:dsi/2026/5, us-fr:2026-14358. Absent when no instrument is cited
digestKeystringPresent on items in a source’s recurring digest series (e.g. MHRA’s weekly Field Safety Notices round-up)
alsoReportedarrayOnly with collapse=instrument: the grouped siblings this row represents — { id, source, dateLabel, kind }

GET /feed.xml

RSS 2.0 of the newest 50 items, newest first. Accepts the same filter parameters as /api/regulations — topic[], kind[], breadth[], relevance, impact[], scope, category[], region[], source, search, view. Pagination, sort, since, dateRange and collapse do not apply.

curl "https://www.health-signal.com/feed.xml?kind[]=rule_change&kind[]=consultation&relevance=core"
curl "https://www.health-signal.com/feed.xml?topic[]=ai-act&topic[]=samd"

GET /api/topics

The topic vocabulary with display labels: the valid values for topic / topic[]. Changes only with releases.

curl "https://www.health-signal.com/api/topics"
Sample response
{
  "status": "success",
  "data": {
    "topics": [
      { "slug": "samd", "label": "Software as a medical device" }
    ]
  }
}

GET /api/active-countries

Every region with stored documents or an active source, with display labels.

curl "https://www.health-signal.com/api/active-countries"
Sample response
{
  "status": "success",
  "countries": [
    { "value": "EU-wide", "label": "🇪🇺 EU-wide", "code": "EU", "order": 0, "group": "Europe" },
    { "value": "Germany", "label": "🇩🇪 Germany", "code": "DE", "order": 11, "group": "Europe" }
  ],
  "total": 2
}

GET /api/health

Detailed service health, including database status and response time. Returns 503 with { "status": "unhealthy" } when the database is unreachable. A lighter probe with no database call lives at /health.

curl "https://www.health-signal.com/api/health"
Sample response
{
  "status": "healthy",
  "database": "connected",
  "response_time_seconds": 0.182,
  "timestamp": "2026-07-20T07:08:12.770756"
}

Reference

Categories

  • Pharmaceuticals
  • Medical Devices & IVD
  • Digital Health & AI
  • Clinical Trials & Research
  • Health Data, Privacy & Security
  • Market Access & Reimbursement
  • Health System & Payment
  • Public Health
  • Other Regulated Products
  • General Regulatory

Machine-readable

Fair use

Responses are cached for 5 minutes. /api/* is limited to 100 requests per minute per IP; above that the IP is blocked from the whole site (403) for about 10 minutes. The data updates once a day. Questions: info@healcapital.com