curl --request POST \
--url https://api.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"comiteeType": "RISK",
"email": "ana.perez@example.com",
"decision": "APPROVED",
"roleId": 1,
"message": "Aprobado por API"
}
'import requests
url = "https://api.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}"
payload = {
"comiteeType": "RISK",
"email": "ana.perez@example.com",
"decision": "APPROVED",
"roleId": 1,
"message": "Aprobado por API"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
comiteeType: 'RISK',
email: 'ana.perez@example.com',
decision: 'APPROVED',
roleId: 1,
message: 'Aprobado por API'
})
};
fetch('https://api.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}', 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.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}",
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([
'comiteeType' => 'RISK',
'email' => 'ana.perez@example.com',
'decision' => 'APPROVED',
'roleId' => 1,
'message' => 'Aprobado por API'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}"
payload := strings.NewReader("{\n \"comiteeType\": \"RISK\",\n \"email\": \"ana.perez@example.com\",\n \"decision\": \"APPROVED\",\n \"roleId\": 1,\n \"message\": \"Aprobado por API\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"comiteeType\": \"RISK\",\n \"email\": \"ana.perez@example.com\",\n \"decision\": \"APPROVED\",\n \"roleId\": 1,\n \"message\": \"Aprobado por API\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"comiteeType\": \"RISK\",\n \"email\": \"ana.perez@example.com\",\n \"decision\": \"APPROVED\",\n \"roleId\": 1,\n \"message\": \"Aprobado por API\"\n}"
response = http.request(request)
puts response.read_body{
"id": 61,
"status": "APPROVED",
"reason": "Aprobado por API",
"type": "FactoringRequest",
"comiteeType": "RISK",
"roleId": 1,
"requestId": 1,
"createdAt": "2026-01-07T20:34:27.457Z",
"updatedAt": "2026-01-07T20:34:27.457Z",
"deletedAt": null
}Aprobar o rechazar una solicitud
Registra la firma de un usuario en el comité de una solicitud, con la decisión APPROVED o REJECTED, el rol con el que firma y una observación. La firma queda a nombre del usuario indicado en email, que debe ser un usuario activo de tu empresa. Envía en decision solo APPROVED o REJECTED, y envía siempre message con un texto.
Antes de registrar, se valida que la solicitud no esté ya aprobada ni rechazada, que el rol sea uno de los que exige el comité, que el usuario tenga ese rol y que no haya firmado antes con él. Usa GET /approvals/missing para consultarlo.
Efectos de la firma:
- Si con esta firma todos los roles reúnen las firmas que exigen, la solicitud pasa al siguiente estado de su flujo.
- Si la decisión es
REJECTED, la solicitud queda rechazada en ese comité (no aplica aResellNominee, que solo admiteAPPROVED). - La observación (
message) queda registrada en el historial de la solicitud. EnFactoringRequesttambién se copia al chat si tu cuenta tiene activada esa opción. - Se envía el evento de webhook de aprobaciones a los destinos configurados en tu cuenta.
PaymentRequestPassive solo admite el comité RISK y ResellNominee solo admite OPERATIONS. CreditLineRequest y FactoringResell se firman solo en el comité RISK. ResellNominee solo admite APPROVED: el rechazo de una nómina no está disponible por esta API todavía. Una devolución de pasivos que ya tiene giros ejecutados no se puede rechazar.
Para FactoringRequest, requestId es el id de la solicitud de factoring (el mismo factoringRequestId que recibes al crearla).
curl --request POST \
--url https://api.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId} \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"comiteeType": "RISK",
"email": "ana.perez@example.com",
"decision": "APPROVED",
"roleId": 1,
"message": "Aprobado por API"
}
'import requests
url = "https://api.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}"
payload = {
"comiteeType": "RISK",
"email": "ana.perez@example.com",
"decision": "APPROVED",
"roleId": 1,
"message": "Aprobado por API"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
comiteeType: 'RISK',
email: 'ana.perez@example.com',
decision: 'APPROVED',
roleId: 1,
message: 'Aprobado por API'
})
};
fetch('https://api.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}', 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.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}",
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([
'comiteeType' => 'RISK',
'email' => 'ana.perez@example.com',
'decision' => 'APPROVED',
'roleId' => 1,
'message' => 'Aprobado por API'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}"
payload := strings.NewReader("{\n \"comiteeType\": \"RISK\",\n \"email\": \"ana.perez@example.com\",\n \"decision\": \"APPROVED\",\n \"roleId\": 1,\n \"message\": \"Aprobado por API\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"comiteeType\": \"RISK\",\n \"email\": \"ana.perez@example.com\",\n \"decision\": \"APPROVED\",\n \"roleId\": 1,\n \"message\": \"Aprobado por API\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.pruff.com/api/clients/approvals/submitApproval/{requestType}/{requestId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"comiteeType\": \"RISK\",\n \"email\": \"ana.perez@example.com\",\n \"decision\": \"APPROVED\",\n \"roleId\": 1,\n \"message\": \"Aprobado por API\"\n}"
response = http.request(request)
puts response.read_body{
"id": 61,
"status": "APPROVED",
"reason": "Aprobado por API",
"type": "FactoringRequest",
"comiteeType": "RISK",
"roleId": 1,
"requestId": 1,
"createdAt": "2026-01-07T20:34:27.457Z",
"updatedAt": "2026-01-07T20:34:27.457Z",
"deletedAt": null
}Parámetros de ruta
Tipo de solicitud sobre la que se consultan o registran las aprobaciones.
CreditLineRequest: solicitud de línea de crédito.FactoringRequest: solicitud de factoring.ConfirmingRequest: solicitud de confirming.FactoringResell: venta de documentos a fondos.CreditRequest: solicitud de crédito.FactoringExtension: prórroga de factoring.SGRWarrantyRequest: solicitud de garantía SGR.PaymentRequestPassive: devolución de pasivos.ResellNominee: nómina de venta a fondo.LeasingRequest: solicitud de leasing. Tipo de solicitud que se aprueba en un comité.
CreditLineRequest, FactoringRequest, ConfirmingRequest, FactoringResell, CreditRequest, FactoringExtension, SGRWarrantyRequest, PaymentRequestPassive, ResellNominee, LeasingRequest Cuerpo
Respuesta
Firma registrada.