curl --request GET \
--url https://api.vaquill.ai/api/v1/boards \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/api/v1/boards"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.vaquill.ai/api/v1/boards', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/api/v1/boards"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"data": {
"boards": [
{
"corpusType": "state",
"state": "wa",
"label": "Washington statutes",
"cadence": "weekly",
"lastRetrievedAt": "2026-08-16T19:35:23.038075+00:00",
"retrievalStatus": "current",
"publishesSourceChangedOn": false,
"changeSignal": "continuous"
},
{
"corpusType": "federal_register",
"label": "Federal Register",
"cadence": "daily",
"lastRetrievedAt": "2026-08-17T06:10:09.637043+00:00",
"retrievalStatus": "current",
"publishesSourceChangedOn": false,
"changeSignal": "continuous"
}
],
"total": 216,
"hasMore": false
},
"meta": {
"processingTimeMs": 12.4,
"creditsConsumed": 0
}
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"detail": "Insufficient API credits."
}List watchable boards
List every board (a tracked corpus source, identified by corpusType + state) available to watch. A board’s refresh cadence is fixed by what we already track; watching it does not change how often it refreshes.
Narrow with corpusType and/or state when you already know what you want to watch, rather than paging the whole registry: ?corpusType=state_regulation&state=tx is one board, and ?state=federal is every federal one. corpusType is matched case-insensitively, and state=federal selects the boards that have no state.
total is the number of boards matching your filters BEFORE paging, and hasMore is true when another page exists, matching the paging contract on /us/statutes/search and the change feeds.
lastRetrievedAt says when we last pulled that source from its publisher, and retrievalStatus says whether we are still polling it. Read them together with cadence before treating silence on a watch as ‘nothing changed’.
publishesSourceChangedOn says whether this board’s change events can carry the publisher’s own date for a change. It is false on most boards, and there it means the date is never present rather than sometimes missing, so check it before writing code that waits for sourceChangedOn to appear. True today on cfr only.
Free. Requires an API key and is rate-limited, but costs no credits.
curl --request GET \
--url https://api.vaquill.ai/api/v1/boards \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/api/v1/boards"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.vaquill.ai/api/v1/boards', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/api/v1/boards"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"data": {
"boards": [
{
"corpusType": "state",
"state": "wa",
"label": "Washington statutes",
"cadence": "weekly",
"lastRetrievedAt": "2026-08-16T19:35:23.038075+00:00",
"retrievalStatus": "current",
"publishesSourceChangedOn": false,
"changeSignal": "continuous"
},
{
"corpusType": "federal_register",
"label": "Federal Register",
"cadence": "daily",
"lastRetrievedAt": "2026-08-17T06:10:09.637043+00:00",
"retrievalStatus": "current",
"publishesSourceChangedOn": false,
"changeSignal": "continuous"
}
],
"total": 216,
"hasMore": false
},
"meta": {
"processingTimeMs": 12.4,
"creditsConsumed": 0
}
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"detail": "Insufficient API credits."
}Authorizations
API key issued from the developer dashboard. Pass as Authorization: Bearer vq_key_...
Query Parameters
Only boards for this corpus type, matched case-insensitively so the uppercase spelling used by the statutes endpoints (CFR) finds the board (cfr). An unknown value is an empty page with total: 0, not an error.
"state_regulation"
Only boards for this jurisdiction. Pass federal for the boards that have no state (USC, eCFR, the Federal Register). Omit for no jurisdiction filter -- which is NOT the same as federal.
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 "tx"
Max boards to return. The default covers the whole registry today; check total rather than assuming it always will.
1 <= x <= 500Number of boards to skip, for paging.
x >= 0Response
The list of watchable boards.
Was this page helpful?

