Skip to main content
POST
Create a board watch

Authorizations

Authorization
string
header
required

API key issued from the developer dashboard. Pass as Authorization: Bearer vq_key_...

Body

application/json
corpusType
string
required

Board's corpus_type (e.g. state, state_regulation, federal_register, agency_guidance). Matched case-insensitively, so the uppercase spelling the statutes endpoints use for the same body of law (USC, CFR) works here too. Call GET /boards for the authoritative, current list -- corpus_type is a growing set as new corpora are added, not a fixed enum, and not every corpus we serve is a watchable board.

Example:

"state"

state
enum<string>

Board's state (2-letter, case-insensitive). For a federal board (USC, eCFR, the Federal Register) pass federal or omit this entirely; the two are equivalent. Must otherwise match the state GET /boards returned for this corpusType -- GET /boards?corpusType=<type> lists exactly those.

Available options:
federal,
al,
ak,
az,
ar,
ca,
co,
ct,
de,
dc,
fl,
ga,
hi,
id,
il,
in,
ia,
ks,
ky,
la,
me,
md,
ma,
mi,
mn,
ms,
mo,
mt,
ne,
nv,
nh,
nj,
nm,
ny,
nc,
nd,
oh,
ok,
or,
pa,
pr,
ri,
sc,
sd,
tn,
tx,
ut,
vt,
va,
wa,
wv,
wi,
wy
Example:

"wa"

channel
enum<string>
default:webhook
Available options:
webhook,
email,
both
webhookUrl
string | null

Required when channel is webhook or both.

webhookSecret
string | null

Optional signing secret, stored encrypted and never returned. When set, every delivery carries an X-Vaquill-Signature: sha256=<hex> header: HMAC-SHA256 of the raw request body bytes, keyed with this secret. To verify, compute the same HMAC over the raw body you received (before parsing JSON) and compare it, constant-time, to the hex digest after sha256=.

emailAddress
string | null

Required when channel is email or both.

scope
Scope · object | null

Optional narrowing so this alert covers one citation instead of an entire source. Three mutually exclusive forms.

Hierarchy prefix -- keys title, chapter, part, section, e.g. {"title": "21", "part": "314"} for 21 CFR part 314. Every level you set must match, so each one narrows further. title is required whenever any narrower level is set, and section also needs chapter or part: a bare part number matches across unrelated titles. Only sources whose documents carry a title/chapter/part hierarchy accept this form; the rest return 400.

Exact section -- {"actId": "CFR_T21_P314_S314_50"}, using the actId returned by search results and change events. Case-sensitive, and validated at create time against the corpus: an act_id we do not hold, or one belonging to a different source, is a 400 rather than a watch that could never fire. This form works on EVERY source, including flat ones with no hierarchy, so it is the only way to follow a single Federal Register document.

Omit entirely to watch the whole source, which is the default and the pre-existing behavior.

Named source -- {"source": "fdic_fil"}, for the corpora that fold several independent bodies of law behind one corpusType. agency_guidance alone carries 30 named sources across 16 agencies, so an unscoped watch on it delivers FDIC letters, IRS notices, USPTO examining procedure and DOE appliance standards together. The vocabulary is exactly the source filter published on POST /us/statutes/search. Accepted on agency_guidance, agency_manuals and cfr (where it selects FAR or DFARS, which share every hierarchy field and are distinguishable only by source); anything else returns 400.

Example:
webhookAuth
WebhookAuthRequest · object | null

Optional outbound credential sent on every delivery, so your gateway can authenticate us with the header it already reads. Independent of webhookSecret: set neither, either, or both. Only valid on a webhook or both channel watch.

Response

The created watch.

Last modified on September 7, 2026