CMS Opt Out Affidavit Delta
Pricing
$10.00 / 1,000 opt-out status changeds
CMS Opt Out Affidavit Delta
Monitors named NPIs in the official CMS Opt Out Affidavits registry and reports only real changes: a new opt-out affidavit, a status change, or confirmed removal from the registry. For payer compliance, credentialing and billing teams. Free when nothing changes.
Pricing
$10.00 / 1,000 opt-out status changeds
Rating
0.0
(0)
Developer
Radu Furtuna
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Monitors named NPIs (National Provider Identifiers) in the official, free, public CMS Opt Out
Affidavits registry (data.cms.gov) and reports only genuine changes since your last check:
- added — a new opt-out affidavit is published for an NPI you watch (the provider has opted out of Medicare participation);
- status_changed — an already-known opt-out record changes its actual status: flips, or theEligible to Order and Refer
Optout End Datemoves (a renewal or a shortened window); - removed — the NPI is confirmed gone from the registry (rejoined Medicare, or the opt-out lapsed
without renewal). Confirmed only after two consecutive monthly checks find it missing — a single
miss is reported as an unpaid
removal_candidatesignal, never billed; - name, specialty, or address edits alone are not billed — only the two status fields above matter.
You are billed once per real change, not per row returned and not per run. A run that finds nothing new is free.
Why this exists
The source dataset (Opt Out Affidavits, described by
describedBy: https://data.cms.gov/resources/opt-out-affidavits-data-dictionaryaccrualPeriodicity: R/P1M). Every published API distribution gets a brand-new UUID on every
release — there is no latest alias — so this Actor re-resolves the current dataset UUID from
https://data.cms.gov/data.json on every run, then does one point lookup per NPI
(?filter[NPI]=<npi>), and remembers your last-known state per NPI in durable Apify storage so it can
tell you what actually changed.
Two competing tools were checked before building this (both confirmed live, via their own published descriptions): one bills per delivered record on every run regardless of whether anything changed, the other is an explicit snapshot/export tool that detects which datasets were updated, not which individual records changed. Neither offers a durable per-NPI delta with pay-per-real-event billing.
Input
monitorId— a stable name for this monitor's durable history (^[a-z0-9-]{1,40}$).watches— 1 to 25 objects{"watchId": "dr-smith", "npi": "1720444581"}.npimust be exactly 10 ASCII digits and is matched byte-for-byte against CMS's ownNPIfield — no normalization, no whitespace trimming, no leading-zero handling. You can add new watches under the samemonitorIdlater; eachwatchIdis permanently bound to thenpiit was first used with.notifyOn—new_alerts(default, webhook only when something billable was delivered),always, ornever.webhookUrl— optional HTTPS endpoint that receives a JSON digest of delivered (billed) changes.
Output
- Dataset — one row per delivered change, plus a
run_summaryrow every run. Key fields:watchId,npi,status(added|status_changed|removed|removal_candidate),lastName/firstName/specialty,optoutEffectiveDate/optoutEndDate,eligibleToOrderAndRefer(current or last-known),previousOptoutEndDate/previousEligibleToOrderAndRefer.removal_candidaterows carry— an early, unpaid signal that a second check will either confirm or retract.billed: false - Key-value store —
coverage(per-watch status/reason, requested/attempted/succeeded/failed counts, records delivered/billed, exactly what was charged for) anddigest(a short human-readable summary).
Guarantees and honest limits
- At-most-once delivery and billing, not exactly-once: an atomic claim (
RequestQueue.addRequest) is the only thing that can authorize a Dataset write and a paid event. If the run crashes after claiming but before finishing, the event can be lost (never delivered) but is never billed twice. - This is an informational monitor of a published, monthly-refreshed registry — it does not confirm a provider's real-time opt-out status, and it is not a substitute for verifying directly with CMS before making a billing or credentialing decision based on it.
- If the source structurally changes its response shape mid-registry, affected watches are marked
source_access_limitedrather than silently producing wrong data — this is surfaced incoverage, the digest, and (if configured) the webhook payload.