curl --request POST \
--url https://api.croma.run/bo/tcp-bo/rulings-search/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "debido proceso",
"type": "sentencia",
"proceeding_type": "Acción de amparo"
}
'import requests
url = "https://api.croma.run/bo/tcp-bo/rulings-search/v1"
payload = {
"query": "debido proceso",
"type": "sentencia",
"proceeding_type": "Acción de amparo"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'debido proceso',
type: 'sentencia',
proceeding_type: 'Acción de amparo'
})
};
fetch('https://api.croma.run/bo/tcp-bo/rulings-search/v1', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.croma.run/bo/tcp-bo/rulings-search/v1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'debido proceso',
'type' => 'sentencia',
'proceeding_type' => 'Acción de amparo'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.croma.run/bo/tcp-bo/rulings-search/v1"
payload := strings.NewReader("{\n \"query\": \"debido proceso\",\n \"type\": \"sentencia\",\n \"proceeding_type\": \"Acción de amparo\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.croma.run/bo/tcp-bo/rulings-search/v1")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"debido proceso\",\n \"type\": \"sentencia\",\n \"proceeding_type\": \"Acción de amparo\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.croma.run/bo/tcp-bo/rulings-search/v1")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"debido proceso\",\n \"type\": \"sentencia\",\n \"proceeding_type\": \"Acción de amparo\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"as_of": "<string>",
"query": "<string>",
"type": "<string>",
"chamber": "<string>",
"proceeding_type": "<string>",
"registration_number": "<string>",
"case_number": "<string>",
"reporting_judge": "<string>",
"department": "<string>",
"year": 123,
"from_date": "<string>",
"to_date": "<string>",
"total": 123,
"total_is_exact": true,
"page": 123,
"per_page": 123,
"total_pages": 123,
"count": 123,
"results": [
{
"id": "<string>",
"registration_number": "<string>",
"type": "sentencia",
"type_label": "<string>",
"ruling_date": "<string>",
"year": 123,
"chamber": "<string>",
"proceeding_type": "<string>",
"reporting_judge": "<string>",
"department": "<string>",
"case_numbers": [
"<string>"
],
"text_status": "ok",
"official_url": "<string>",
"document_url": "<string>",
"source_document_url": "<string>"
}
]
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}Tribunal Constitucional Plurinacional de Bolivia Rulings Search
Search the jurisprudencia of Bolivia’s Tribunal Constitucional Plurinacional and its predecessor: every sentencia, auto, declaración and vote since 1999. Free text matches the resolution number, the case numbers, the chamber, the action and the full text. Filter by type, chamber, proceeding_type (the constitutional action), reporting_judge, department, registration_number (the resolution number), case_number, year and the ruling date (from_date/to_date). Each result carries the original document, kept by Croma, and a link to the resolution’s page at the court. Served by Croma (as_of says how current the data is).
Dataset endpoint: answers from the whole source in milliseconds and carries as_of.
curl --request POST \
--url https://api.croma.run/bo/tcp-bo/rulings-search/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "debido proceso",
"type": "sentencia",
"proceeding_type": "Acción de amparo"
}
'import requests
url = "https://api.croma.run/bo/tcp-bo/rulings-search/v1"
payload = {
"query": "debido proceso",
"type": "sentencia",
"proceeding_type": "Acción de amparo"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'debido proceso',
type: 'sentencia',
proceeding_type: 'Acción de amparo'
})
};
fetch('https://api.croma.run/bo/tcp-bo/rulings-search/v1', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.croma.run/bo/tcp-bo/rulings-search/v1",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'debido proceso',
'type' => 'sentencia',
'proceeding_type' => 'Acción de amparo'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.croma.run/bo/tcp-bo/rulings-search/v1"
payload := strings.NewReader("{\n \"query\": \"debido proceso\",\n \"type\": \"sentencia\",\n \"proceeding_type\": \"Acción de amparo\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.croma.run/bo/tcp-bo/rulings-search/v1")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"debido proceso\",\n \"type\": \"sentencia\",\n \"proceeding_type\": \"Acción de amparo\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.croma.run/bo/tcp-bo/rulings-search/v1")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"debido proceso\",\n \"type\": \"sentencia\",\n \"proceeding_type\": \"Acción de amparo\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"as_of": "<string>",
"query": "<string>",
"type": "<string>",
"chamber": "<string>",
"proceeding_type": "<string>",
"registration_number": "<string>",
"case_number": "<string>",
"reporting_judge": "<string>",
"department": "<string>",
"year": 123,
"from_date": "<string>",
"to_date": "<string>",
"total": 123,
"total_is_exact": true,
"page": 123,
"per_page": 123,
"total_pages": 123,
"count": 123,
"results": [
{
"id": "<string>",
"registration_number": "<string>",
"type": "sentencia",
"type_label": "<string>",
"ruling_date": "<string>",
"year": 123,
"chamber": "<string>",
"proceeding_type": "<string>",
"reporting_judge": "<string>",
"department": "<string>",
"case_numbers": [
"<string>"
],
"text_status": "ok",
"official_url": "<string>",
"document_url": "<string>",
"source_document_url": "<string>"
}
]
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"details": {}
}
}Authorizations
Use Authorization: Bearer YOUR_API_KEY
Headers
Optional client-chosen key for this request (any string up to 255 characters, e.g. a UUID). Every Croma operation is an idempotent lookup: repeating a request with the same body returns the same result and creates nothing, so retrying after a timeout or network failure is always safe. The key is echoed back in the Idempotency-Key response header so you can correlate a retry with its first attempt. Each attempt that reaches the API counts against the rate limit.
255"0f8e9a42-6b7c-4d1e-9a3f-2c5d7e8f9a0b"
Body
Optional search terms matched against the resolution number, the case number, the chamber, the action and the full text.
300Optional kind of resolution: sentencia (SC, SCP), auto (AC, ACP, RCA, ECA...), declaracion (DCP), voto_disidente, voto_aclaratorio or decreto.
, sentencia, auto, declaracion, voto_disidente, voto_aclaratorio, decreto Optional chamber as chamber names it, e.g. Sala Primera, Sala Plena or Comisión de Admisión, matched from the start. Case and accents are ignored.
120Optional constitutional action as proceeding_type names it, e.g. Acción de amparo constitucional, Acción de libertad, Acción de inconstitucionalidad concreta, matched from the start. Case and accents are ignored.
160Optional resolution number as the court prints it, e.g. 0050/2024-S2 or 0437/2013. Returns every resolution of that number, including the votes attached to it. Case, spaces and punctuation are ignored.
80Optional case file number (expediente) as the court prints it, e.g. 60836-2024-122-AL. Case, spaces and punctuation are ignored.
80Optional reporting justice (magistrado relator) as reporting_judge names them, matched from the start of the name. Case and accents are ignored.
160Optional department the case came from, e.g. La Paz, Santa Cruz, Cochabamba, matched from the start. Case and accents are ignored.
60Optional year of the resolution. 0 searches every year.
0 <= x <= 2100Optional date filter in yyyy-mm-dd format.
Optional date filter in yyyy-mm-dd format.
1-based page number for paginated results.
1 <= x <= 1000Results per page (1-50).
1 <= x <= 50Response
Successful response
Show child attributes
Show child attributes