Qué se frena antes de enviar
Elige si un comprobante que SUNAT aceptaría con reparos sale o se frena aquí.
Autenticación: token Bearer de cuenta (empresas:manage).
Consideraciones
- Antes de firmar corremos las mismas reglas que SUNAT. Lo que no pasa no se firma ni se envía, así que no consume plan.
- SUNAT separa dos cosas: un error (código menor que 4000) lo rechaza; una observación (4000 o mayor) la acepta con reparos. Los errores se frenan siempre — el comprobante no iba a pasar—; lo que eliges aquí es qué hacer con las observaciones.
- Por defecto es
errors: se emite y la observación llega enwarningsde POST /v1/cpe, para corregir el origen sin frenar la facturación. - Con
stricttampoco sale lo observado. Útil para quien prefiere no tener ningún comprobante con reparos. - Vale para todas las empresas de la cuenta. Una concreta puede llevar la contraria con
PATCH /v1/companies/{ruc}/validation, ypolicy: nullborra esa excepción. - Se aplica por igual emitas por
/v1, por la superficie compat o por la recepción SOAP.
Cada empresa dice en GET /v1/companies/{ruc} qué política le aplica y de dónde
le viene:
"validation": { "policy": "errors", "source": "account" }
source es account cuando la hereda, company cuando tiene la suya, y
default cuando nadie ha elegido nada.
Cuándo frena cada una
errors |
strict |
|
|---|---|---|
| Error de SUNAT | No sale | No sale |
| Observación de SUNAT | Sale, y avisa en warnings |
No sale |
Un comprobante frenado responde 422 con el código y el texto de cada regla, y
no gasta firma ni envío.
Headers
| Name | Type | Description |
|---|---|---|
| Accept | string | application/json |
| Content-Type | string | application/json |
| Authorization | string | Bearer <token>. Genéralo desde tu panel, en Tokens de API. |
Body
| Name | Type | Description |
|---|---|---|
| policy* | string | errors (por defecto) · strict. |
Ejemplo de solicitud
Copiar
curl -X PATCH https://api.xmlperu.dev/v1/account/validation \
-H "Authorization: Bearer $TOKEN_CUENTA" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"policy": "strict"
}'Copiar
<?php
$token_cuenta = 'pega-aqui-tu-token';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.xmlperu.dev/v1/account/validation');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token_cuenta,
'Accept: application/json',
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
"policy": "strict"
}
JSON);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);Copiar
const TOKEN_CUENTA = 'pega-aqui-tu-token';
const res = await fetch('https://api.xmlperu.dev/v1/account/validation', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${TOKEN_CUENTA}`,
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
"policy": "strict"
}),
});
const data = await res.json();Copiar
import requests
TOKEN_CUENTA = "pega-aqui-tu-token"
headers = {
"Authorization": f"Bearer {TOKEN_CUENTA}",
"Accept": "application/json",
}
payload = {
"policy": "strict"
}
res = requests.patch("https://api.xmlperu.dev/v1/account/validation", json=payload, headers=headers)
data = res.json()Respuesta
200 Actualizadoapplication/json
{
"success": true,
"message": "Validación de la cuenta actualizada.",
"data": {
"account": {
"validation": {
"policy": "strict",
"is_default": false
}
}
}
}422 Política desconocidaapplication/json
{
"success": false,
"message": "The selected policy is invalid."
}