Mirror the whole feed, then keep it current
This keeps a full local copy of the feed and keeps it current. Two phases: first backfill every report by paging from the start, then on each later run pull only what changed since the newestupdatedAt you stored.
reportId. A withdrawal moves updatedAt, so retractions arrive through the same loop. When you see withdrawn: true, retire the record on your side.
Poll for new malicious npm packages
Keep the lastupdatedAt you saw. Then pull only verified-malicious npm reports that changed after it:
updatedAt in each batch.

