Saltar a contenido

Actualización masiva (bulk)

PUT /apientidades/v1/declaraciones/{iddeclaracion}/pa

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 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)

{
  "message": "2 obligaciones actualizadas.",
  "count": 2
}
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).