curl --request POST \
--url https://api.croma.run/pe/servir-tsc/resolutions-search/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "régimen disciplinario",
"chamber": "primera_sala"
}
'import requests
url = "https://api.croma.run/pe/servir-tsc/resolutions-search/v1"
payload = {
"query": "régimen disciplinario",
"chamber": "primera_sala"
}
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: 'régimen disciplinario', chamber: 'primera_sala'})
};
fetch('https://api.croma.run/pe/servir-tsc/resolutions-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/pe/servir-tsc/resolutions-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' => 'régimen disciplinario',
'chamber' => 'primera_sala'
]),
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/pe/servir-tsc/resolutions-search/v1"
payload := strings.NewReader("{\n \"query\": \"régimen disciplinario\",\n \"chamber\": \"primera_sala\"\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/pe/servir-tsc/resolutions-search/v1")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"régimen disciplinario\",\n \"chamber\": \"primera_sala\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.croma.run/pe/servir-tsc/resolutions-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\": \"régimen disciplinario\",\n \"chamber\": \"primera_sala\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"as_of": "<string>",
"query": "<string>",
"chamber": "<string>",
"resolution_number": 123,
"year": 123,
"from_date": "<string>",
"to_date": "<string>",
"total": 123,
"page": 123,
"per_page": 123,
"total_pages": 123,
"count": 123,
"results": [
{
"id": "<string>",
"resolution_number": 123,
"resolution_year": 123,
"chamber": "primera_sala",
"resolution_key": "<string>",
"title": "<string>",
"resolution_date": "<string>",
"entity": "<string>",
"expediente": "<string>",
"regime": "<string>",
"subject": "<string>",
"summary": "<string>",
"text_status": "ok",
"document_url": "<string>",
"page_url": "<string>",
"uploaded_at": "<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 del Servicio Civil Resolutions Search
Search every resolution Peru’s Tribunal del Servicio Civil (SERVIR) has issued since 2010, across both chambers. Free text matches the resolution number, the entity, the tribunal’s summary and the full text. Filter by chamber (primera_sala or segunda_sala), resolution_number, year and the session date (from_date/to_date). Each result links to the document as published. 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/pe/servir-tsc/resolutions-search/v1 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "régimen disciplinario",
"chamber": "primera_sala"
}
'import requests
url = "https://api.croma.run/pe/servir-tsc/resolutions-search/v1"
payload = {
"query": "régimen disciplinario",
"chamber": "primera_sala"
}
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: 'régimen disciplinario', chamber: 'primera_sala'})
};
fetch('https://api.croma.run/pe/servir-tsc/resolutions-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/pe/servir-tsc/resolutions-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' => 'régimen disciplinario',
'chamber' => 'primera_sala'
]),
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/pe/servir-tsc/resolutions-search/v1"
payload := strings.NewReader("{\n \"query\": \"régimen disciplinario\",\n \"chamber\": \"primera_sala\"\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/pe/servir-tsc/resolutions-search/v1")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"régimen disciplinario\",\n \"chamber\": \"primera_sala\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.croma.run/pe/servir-tsc/resolutions-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\": \"régimen disciplinario\",\n \"chamber\": \"primera_sala\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"as_of": "<string>",
"query": "<string>",
"chamber": "<string>",
"resolution_number": 123,
"year": 123,
"from_date": "<string>",
"to_date": "<string>",
"total": 123,
"page": 123,
"per_page": 123,
"total_pages": 123,
"count": 123,
"results": [
{
"id": "<string>",
"resolution_number": 123,
"resolution_year": 123,
"chamber": "primera_sala",
"resolution_key": "<string>",
"title": "<string>",
"resolution_date": "<string>",
"entity": "<string>",
"expediente": "<string>",
"regime": "<string>",
"subject": "<string>",
"summary": "<string>",
"text_status": "ok",
"document_url": "<string>",
"page_url": "<string>",
"uploaded_at": "<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 entity, the summary and the full text.
300Optional chamber: primera_sala or segunda_sala.
20Optional resolution number, with or without its year, e.g. 05763-2025 or 5763. Leading zeros are ignored.
20Optional 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