curl --request GET \
--url https://api.vaquill.ai/api/v1/in/acts/filters \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/api/v1/in/acts/filters"
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/in/acts/filters', 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/in/acts/filters"
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": {
"categories": [
{
"value": "state",
"count": 1219846
},
{
"value": "central",
"count": 686388
}
],
"states": [
{
"value": "central",
"count": 703310
},
{
"value": "chhattisgarh",
"count": 93069
}
],
"departments": [
{
"value": "sebi",
"count": 130384
},
{
"value": "moefcc",
"count": 120426
}
],
"truncated": [
"department"
]
},
"meta": {
"processingTimeMs": 1282.1,
"creditsConsumed": 0
}
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}Discover valid filter values
List every value accepted by the category, state, and department filters
on POST /acts/search, with the number of sections behind each.
Authentication: API key via Authorization: Bearer vq_key_...
Cost: free.
Values are lowercase and hyphenated (madhya-pradesh, law-commission).
POST /acts/search rejects anything not listed here with HTTP 422, so read
this rather than guessing. Counts are read from the corpus and refresh as
ingest runs land, so treat the list as live rather than caching it in your app.
The remaining filters are small enough to publish in full, so their values are
listed in this document rather than here: actStatus, provisionType,
sectionType and legalSubject each carry their own enum. Those are
enforced the same way, and an unrecognised value is a 422 that costs no
credits, never an empty page you are charged for.
curl --request GET \
--url https://api.vaquill.ai/api/v1/in/acts/filters \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/api/v1/in/acts/filters"
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/in/acts/filters', 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/in/acts/filters"
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": {
"categories": [
{
"value": "state",
"count": 1219846
},
{
"value": "central",
"count": 686388
}
],
"states": [
{
"value": "central",
"count": 703310
},
{
"value": "chhattisgarh",
"count": 93069
}
],
"departments": [
{
"value": "sebi",
"count": 130384
},
{
"value": "moefcc",
"count": 120426
}
],
"truncated": [
"department"
]
},
"meta": {
"processingTimeMs": 1282.1,
"creditsConsumed": 0
}
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}{
"detail": "Insufficient API credits."
}Authorizations
API key issued from the developer dashboard. Pass as Authorization: Bearer vq_key_...
Response
Successful Response
Show child attributes
Show child attributes
What this call cost and how long it took.
🔴 Added 2026-09-06. Five of the six original routes returned NO statement
of what they billed: /text (3 credits), /amendments (5), /list (1),
/filters (0) and /corresponding-provisions (1). The house rule on the
US surface is that creditsConsumed is the CONTRACT and the list price is
not, and it matters most exactly where refunds happen -- /text refunds on
a missing act, /corresponding-provisions refunds when a mapping does not
exist yet. Without this field a caller cannot tell a refunded call from a
charged one, and has to reconcile against the ledger to find out.
Show child attributes
Show child attributes
Was this page helpful?

