SAM.gov amendments guide

Tracking SAM.gov amendments with a change feed.

A SAM.gov opportunity can change after you first see it: dates, descriptions, attachments, buyer details, and status can move. Boring Data Platform exposes recent procurement changes through one feed, then lets you fetch the source-linked history for the record.

SAM.gov amendments APISAM.gov change feedtrack government contract amendments
The problem

Keyword alerts miss the state of the record.

A daily search can tell you that a notice exists. It does not tell you whether an amendment changed the close date, added a document, or moved the opportunity into a different state. A change feed lets your app process the event and then fetch the current record when needed.

json
{
  "data": [
    {
      "eventId": "00000000-0000-4000-8000-000000000101",
      "recordId": "00000000-0000-4000-8000-000000000001",
      "noticeId": "2d73364f6e5f4b889c8e6e6a5c9f2b67",
      "title": "Enterprise IT Support Services",
      "changeType": "modified",
      "eventClass": "change",
      "changedAt": "2026-06-09T15:22:18.000Z",
      "actionable": true,
      "reasonSummary": "Notice fields changed"
    }
  ],
  "page": {
    "limit": 5,
    "nextCursor": "eyJ2IjoxLCJzb3J0IjoiLi4uIn0"
  }
}
Polling model

Poll changes, then process by recordId.

Use the change feed for incremental sync. Store the newest processed event and the returned cursor. If the worker restarts without a cursor, resume from your last processed changedAt timestamp with updatedSince.

bash
# First page
curl -s 'https://api.boringdataplatform.com/v1/changes?limit=5' \
  -H 'Authorization: Bearer <YOUR_API_KEY>'

# Resume by timestamp when your worker restarts
curl -s 'https://api.boringdataplatform.com/v1/changes?updatedSince=2026-06-09T00:00:00.000Z&limit=5' \
  -H 'Authorization: Bearer <YOUR_API_KEY>'

# Continue a cursor page returned by the API
curl -s 'https://api.boringdataplatform.com/v1/changes?cursor=<nextCursor>&limit=5' \
  -H 'Authorization: Bearer <YOUR_API_KEY>'
Replay context

Fetch history when the user needs the timeline.

The feed is compact by design. Use the returned recordId to fetch opportunity history, snapshots, and source event context for a detail page, agent answer, or internal audit log.

bash
# Read the replay context for one changed opportunity
curl -s 'https://api.boringdataplatform.com/v1/opportunities/<recordId>/history' \
  -H 'Authorization: Bearer <YOUR_API_KEY>'
What to store

Event identity

Store eventId so repeat delivery or cursor retries do not create duplicate alerts.

Record identity

Store recordId and threadKey from the fetched record so future revisions stay attached.

Processing watermark

Store the latest changedAt or nextCursor you processed so the worker can resume deterministically.

Run this curl

Fetch the latest procurement changes.

Replace the API key and run this request from a shell. Use the returned record IDs to fetch current opportunity detail or history.

bash
curl -s 'https://api.boringdataplatform.com/v1/changes?limit=5' \
  -H 'Authorization: Bearer <YOUR_API_KEY>'