Actualización masiva (bulk)
Permite actualizar múltiples obligaciones de publicidad activa en una sola petición. La operación es transaccional: si un solo ítem falla la validación, no se modifica ninguno.
Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
iddeclaracion |
int | ID de la declaración |
Body de la petición
{
"items": [
{
"obligacionId": 7001,
"enlaces": [
{
"url": "https://portal.entidad.es/transparencia/presupuestos",
"valida": true,
"orden": 0
}
],
"aclaraciones": "",
"opcionPublicacion": 0,
"noCumple": false,
"autoevaluacion": []
},
{
"obligacionId": 7002,
"enlaces": [
{
"url": "https://portal.entidad.es/transparencia/normativa",
"valida": true,
"orden": 0
}
],
"aclaraciones": "Normativa publicada en sección específica",
"opcionPublicacion": 0,
"noCumple": false,
"autoevaluacion": []
},
{
"obligacionId": 7003,
"enlaces": [],
"aclaraciones": "No aplica a nuestra tipología de entidad",
"opcionPublicacion": 1,
"noCumple": false,
"autoevaluacion": []
}
]
}
Campos del body
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
items |
array | Sí | Lista de obligaciones a actualizar (1-500) |
Cada ítem dentro de items tiene la misma estructura que el body del PUT individual. Consulte esa página para el detalle de cada campo.
Ejemplo completo de flujo
# 1. Obtener el árbol PA para conocer los IDs
ARBOL=$(curl -s "https://apientidades-pro.transparenciacanarias.org/apientidades/v1/declaraciones/5001/pa" \
-H "Authorization: Bearer $TOKEN")
# 2. Enviar actualización masiva
curl -s -X PUT \
"https://apientidades-pro.transparenciacanarias.org/apientidades/v1/declaraciones/5001/pa" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"obligacionId": 7001,
"enlaces": [{"url": "https://portal.es/presupuestos", "valida": true, "orden": 0}],
"aclaraciones": "",
"opcionPublicacion": 0,
"noCumple": false,
"autoevaluacion": []
},
{
"obligacionId": 7002,
"enlaces": [{"url": "https://portal.es/normativa", "valida": true, "orden": 0}],
"aclaraciones": "",
"opcionPublicacion": 0,
"noCumple": false,
"autoevaluacion": []
}
]
}' | jq .
import requests
BASE_URL = "https://apientidades-pro.transparenciacanarias.org/apientidades/v1"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# 1. Obtener árbol PA
arbol = requests.get(
f"{BASE_URL}/declaraciones/5001/pa",
headers=headers
).json()
# 2. Construir la lista de ítems a actualizar
items = []
for tipo in arbol:
for cat in tipo.get("categorias", []):
for ob in cat.get("obligaciones", []):
items.append({
"obligacionId": ob["id"],
"enlaces": [{"url": "https://portal.es/datos", "valida": True, "orden": 0}],
"aclaraciones": "",
"opcionPublicacion": 0,
"noCumple": False,
"autoevaluacion": []
})
# 3. Enviar en lotes de 500
for i in range(0, len(items), 500):
lote = items[i:i+500]
response = requests.put(
f"{BASE_URL}/declaraciones/5001/pa",
headers=headers,
json={"items": lote}
)
print(f"Lote {i//500 + 1}: {response.json()}")
// Construir la lista de ítems
var items = new List<object>();
foreach (var tipo in arbol)
{
foreach (var cat in tipo.Categorias)
{
foreach (var ob in cat.Obligaciones)
{
items.Add(new
{
obligacionId = ob.Id,
enlaces = new[] { new { url = "https://portal.es/datos", valida = true, orden = 0 } },
aclaraciones = "",
opcionPublicacion = 0,
noCumple = false,
autoevaluacion = Array.Empty<object>()
});
}
}
}
// Enviar en lotes de 500
foreach (var lote in items.Chunk(500))
{
var content = new StringContent(
JsonConvert.SerializeObject(new { items = lote }),
Encoding.UTF8, "application/json");
var response = await client.PutAsync(
$"{baseUrl}/declaraciones/5001/pa", content);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
Respuesta exitosa (200)
| Campo | Tipo | Descripción |
|---|---|---|
message |
string | Mensaje descriptivo |
count |
int | Número de obligaciones actualizadas |
Comportamiento transaccional
flowchart LR
A[Recibir ítems] --> B{Validar TODOS}
B -->|Todos válidos| C[Guardar datos]
B -->|Alguno inválido| D[Rechazar TODO]
C --> E[200 OK]
D --> F[400 con errores]
Todo o nada
La operación bulk es transaccional. Si un solo ítem tiene un error de validación (URL malformada, obligación inexistente, etc.), no se modifica ninguno y se devuelve un error 400 con el detalle de los errores encontrados (hasta los 10 primeros).
Límites
| Límite | Valor |
|---|---|
| Ítems por petición | 1 - 500 |
| Enlaces por obligación | Max 10 |
| Longitud URL | Max 2.048 caracteres |
| Longitud aclaraciones | Max 5.000 caracteres |
| Criterios autoevaluación | Max 10 por obligación |
Lotes grandes
Si tiene más de 500 obligaciones que actualizar, divida la lista en lotes de 500 y envíe cada lote como una petición separada.
Errores posibles
| Código | Descripción |
|---|---|
400 |
Validación fallida en uno o más ítems, o lista vacía/excede 500 |
401 |
Token ausente, expirado o inválido |
404 |
La declaración no existe o no pertenece a la entidad |
Estado de la declaración
Solo funciona cuando la declaración está en estado NoPresentada (1) o AlegacionesAbiertas (4).