{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/alfil-co/json-schema/alfil-co-electoral-censo-schema.json",
  "title": "ElectoralCenso",
  "x-generated": "2026-11-01",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/alfil-co-openapi.json#/components/schemas/ElectoralCenso",
  "type": "object",
  "properties": {
    "eleccion": {
      "type": "object",
      "properties": {
        "codigo": {
          "type": "string"
        },
        "nombre": {
          "type": "string"
        }
      },
      "required": [
        "codigo",
        "nombre"
      ],
      "additionalProperties": false
    },
    "fecha": {
      "type": "string",
      "description": "Fecha de corte del censo (fecha de la elección), ISO 8601"
    },
    "total": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "por_sexo": {
      "type": "object",
      "properties": {
        "mujeres": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "hombres": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "mujeres",
        "hombres"
      ],
      "additionalProperties": false
    },
    "por_edad": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/CensoEdad"
          }
        },
        {
          "type": "null"
        }
      ],
      "description": "null cuando la fuente solo trae la partición por sexo (DIVIPOL)"
    },
    "filas": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/CensoFila"
      }
    },
    "truncado": {
      "type": "boolean",
      "description": "true cuando esta página no trae el resto del desglose crudo (equivalente a pagina.has_more); total/por_sexo/por_edad siempre reflejan TODAS las filas del censo, nunca solo la página devuelta"
    },
    "pagina": {
      "$ref": "#/$defs/Page"
    },
    "fuente": {
      "$ref": "#/$defs/CensoFuente"
    }
  },
  "required": [
    "eleccion",
    "fecha",
    "total",
    "por_sexo",
    "por_edad",
    "filas",
    "truncado",
    "pagina",
    "fuente"
  ],
  "additionalProperties": false,
  "$defs": {
    "CensoEdad": {
      "type": "object",
      "properties": {
        "rango": {
          "type": "string",
          "description": "Rango etario (p. ej. 18-20, 60+)"
        },
        "mujeres": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "hombres": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "rango",
        "mujeres",
        "hombres"
      ],
      "additionalProperties": false
    },
    "CensoFila": {
      "type": "object",
      "properties": {
        "codigo": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Código DIVIPOLA de la fila (null a nivel nación)"
        },
        "rango": {
          "type": "string",
          "description": "Rango etario, o 'total' cuando la fuente solo trae sexo"
        },
        "sexo": {
          "type": "string",
          "enum": [
            "F",
            "M"
          ]
        },
        "habilitados": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "codigo",
        "rango",
        "sexo",
        "habilitados"
      ],
      "additionalProperties": false
    },
    "CensoFuente": {
      "type": "object",
      "properties": {
        "tipo": {
          "type": "string",
          "enum": [
            "rnec_potencial_etario",
            "divipol"
          ]
        },
        "referencia": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Radicado de la solicitud Ley 1712 cuando la fuente es rnec_potencial_etario; null para divipol"
        }
      },
      "required": [
        "tipo",
        "referencia"
      ],
      "additionalProperties": false
    },
    "Page": {
      "type": "object",
      "properties": {
        "cursor": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Cursor opaco de la siguiente página; null si no hay más"
        },
        "has_more": {
          "type": "boolean",
          "description": "Indica si existen más resultados"
        }
      },
      "required": [
        "cursor",
        "has_more"
      ],
      "additionalProperties": false,
      "description": "Paginación por cursor opaco (no offset)"
    }
  }
}