---
title: "Law change alert"
method: POST
path: "board.updated"
tags: ["Board Watches"]
---

# Law change alert

`POST board.updated` (webhook)

Sent to a watch's `webhookUrl` when its board refreshes with real changes, naming the sections that changed. Headers: `Content-Type: application/json`, `X-Vaquill-Event: board.updated`.

**Verification.** Present only when the watch has a `webhookSecret`. Prefer the Standard Webhooks headers: `webhook-id`, `webhook-timestamp` (Unix seconds) and `webhook-signature` (`v1,<base64>`, several space separated while a secret rotates), an HMAC-SHA256 over `{webhook-id}.{webhook-timestamp}.{raw body}`. The HMAC key is the base64 decoding of the secret after `whsec_` when it has that prefix, otherwise the secret's UTF-8 bytes. Verify against the raw bytes before parsing, and reject a timestamp more than 5 minutes old. `webhook-id` is stable across retries of one delivery. The legacy `X-Vaquill-Signature: sha256=<hex>` header (HMAC-SHA256 of the raw body) is also sent, is deprecated, and remains for at least 12 months. Respond with any 2xx to acknowledge; redirects are not followed.

## Payload

- BoardUpdatedWebhookPayload: Body of a `board.updated` delivery: a watched board refreshed with real changes.
  - `event` 'board.updated', required
  - `firedAt` string, required: ISO 8601 time the delivery was built.
  - `corpusType` string, required
  - `state` string, nullable: Null for a federal board.
  - `boardLabel` string, required
  - `scope` object, nullable: The watch's scope, echoed so section counts can be read against it.
  - `rowsAdded` integer, required: Stored rows (chunks), not sections.
  - `rowsUpdated` integer, required: Stored rows (chunks), not sections.
  - `rowsDeleted` integer, required: Stored rows (chunks), not sections.
  - `refreshLogId` integer, nullable
  - `changes` BoardWebhookChange[], required: Up to 10 changed sections. See `changesOverflowCount` for the rest.
    - `id` integer, required: Change id. Pass it as `sinceId` or to the change diff route.
    - `changeKind` 'added' | 'amended' | 'removed', required
    - `actId` string, required
    - `citation` string, nullable
    - `title` string, nullable
    - `detectedAt` string, nullable: When our refresh observed the change, not the date the law changed.
    - `lifecycleStage` string, nullable: Set only for a pending amendment to a Federal Rule that moved a stage (for example `adopted_by_supreme_court`). The rule's own text has not changed, so this item is not counted in `sectionsAmended`. Absent for every ordinary change.
    - `relatedActId` string, nullable: Set with `lifecycleStage`: the `actId` of the proposed amendment. Fetch it for the proposed text. Absent for every ordinary change.
  - `changesOverflowCount` integer, required: Changed sections beyond the ones in `changes`; page `GET /watches/{watchId}/changes` for them.
  - `sectionsAdded` integer, nullable: Sections added. Absent when not counted.
  - `sectionsAmended` integer, nullable
  - `sectionsRemoved` integer, nullable

## Acknowledgement `204`

Acknowledge with any 2xx status.

---

[API](https://skmtc.dev/vaquill/apis/vaquill-developer-api.md) - [All operations](https://skmtc.dev/vaquill/apis/vaquill-developer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/vaquill/apis/vaquill-developer-api/revisions/340c0d24d0b6?raw)
