Ejemplos de uso

Ejemplos reales de peticiones y respuestas de la API EleccionesDB. Todos los ejemplos usan http://localhost:8000 como base URL.

Health check

GET /health
{
  "status": "ok",
  "environment": "development",
  "database": "ok"
}

Tipos de elección

Lista completa del catálogo (array simple, sin paginación).

GET /api/v1/tipos-eleccion
[
  {"codigo": "A", "descripcion": "Autómicas"},
  {"codigo": "E", "descripcion": "Europeas"},
  {"codigo": "G", "descripcion": "Congreso"},
  {"codigo": "L", "descripcion": "Locales"},
  {"codigo": "S", "descripcion": "Senado"}
]

Listado de elecciones (paginado)

GET /api/v1/elecciones?limit=3
{
  "total": 254,
  "skip": 0,
  "limit": 3,
  "data": [
    {
      "id": 1,
      "tipo_eleccion": "G",
      "year": "1977",
      "mes": "06",
      "dia": "15",
      "fecha": "1977-06-15",
      "descripcion": "Elecciones Generales 1977",
      "ambito": "Nacional",
      "slug": "elecciones-generales-1977"
    },
    {
      "id": 2,
      "tipo_eleccion": "G",
      "year": "1979",
      "mes": "03",
      "dia": "01",
      "fecha": "1979-03-01",
      "descripcion": "Elecciones Generales 1979",
      "ambito": "Nacional",
      "slug": "elecciones-generales-1979"
    },
    {
      "id": 3,
      "tipo_eleccion": "A",
      "year": "1979",
      "mes": "04",
      "dia": "03",
      "fecha": "1979-04-03",
      "descripcion": "Elecciones Autonómicas Navarra 1979",
      "ambito": "Autonómico",
      "slug": "elecciones-autonomicas-1979"
    }
  ]
}

Elecciones filtradas por tipo y año

Se pueden combinar varios filtros. Para múltiples valores del mismo filtro se repite el parámetro.

GET /api/v1/elecciones?tipo_eleccion=G&year=2019&limit=5
{
  "total": 2,
  "skip": 0,
  "limit": 5,
  "data": [
    {
      "id": 208,
      "tipo_eleccion": "G",
      "year": "2019",
      "mes": "04",
      "dia": "28",
      "fecha": "2019-04-28",
      "descripcion": "Elecciones Generales 2019",
      "ambito": "Nacional",
      "slug": "elecciones-generales-2019"
    },
    {
      "id": 226,
      "tipo_eleccion": "G",
      "year": "2019",
      "mes": "11",
      "dia": "10",
      "fecha": "2019-11-10",
      "descripcion": "Elecciones Generales 2019",
      "ambito": "Nacional",
      "slug": "elecciones-generales-2019"
    }
  ]
}

Detalle de una elección

Incluye el tipo de elección como objeto expandido.

GET /api/v1/elecciones/208
{
  "id": 208,
  "tipo_eleccion": "G",
  "year": "2019",
  "mes": "04",
  "dia": "28",
  "fecha": "2019-04-28",
  "codigo_ccaa": "99",
  "numero_vuelta": 1,
  "descripcion": "Elecciones Generales 2019",
  "ambito": "Nacional",
  "slug": "elecciones-generales-2019",
  "tipo": {
    "codigo": "G",
    "descripcion": "Congreso"
  }
}

Territorios por tipo

GET /api/v1/territorios?tipo=ccaa&limit=5
{
  "total": 19,
  "skip": 0,
  "limit": 5,
  "data": [
    {"id": 1, "tipo": "ccaa", "nombre": "Andalucía", "codigo_completo": "0199999999999", "codigo_ccaa": "01", "codigo_provincia": "99"},
    {"id": 2, "tipo": "ccaa", "nombre": "Aragón", "codigo_completo": "0299999999999", "codigo_ccaa": "02", "codigo_provincia": "99"},
    {"id": 3, "tipo": "ccaa", "nombre": "Asturias", "codigo_completo": "0399999999999", "codigo_ccaa": "03", "codigo_provincia": "99"},
    {"id": 4, "tipo": "ccaa", "nombre": "Baleares", "codigo_completo": "0499999999999", "codigo_ccaa": "04", "codigo_provincia": "99"},
    {"id": 5, "tipo": "ccaa", "nombre": "Canarias", "codigo_completo": "0599999999999", "codigo_ccaa": "05", "codigo_provincia": "99"}
  ]
}

Búsqueda de partidos por siglas

La búsqueda es parcial y case-insensitive.

GET /api/v1/partidos?siglas=psoe&limit=3
{
  "total": 345,
  "skip": 0,
  "limit": 3,
  "data": [
    {"id": 5082, "siglas": "IU-PSOE", "denominacion": "IU-PSOE", "partido_recode_id": 47},
    {"id": 8432, "siglas": "ADEIA,PSM,PSOE,IV", "denominacion": "AGRUPACIO DEIA,PSM,PSOE,IVERDS", "partido_recode_id": 80},
    {"id": 8486, "siglas": "CPC(PSM-EN, ENTESA, PSOE)", "denominacion": "CAMPOS PEL CANVI (PSM-EN, ENTESA, PSOE)", "partido_recode_id": 80}
  ]
}

Detalle de partido con agrupación (recode)

GET /api/v1/partidos/5082
{
  "id": 5082,
  "siglas": "IU-PSOE",
  "denominacion": "IU-PSOE",
  "partido_recode_id": 47,
  "recode": {
    "id": 47,
    "partido_recode": "IU",
    "agrupacion": "PCE/IU",
    "color": "#E51635"
  }
}

Un partido sin agrupación asignada devuelve recode: null:

GET /api/v1/partidos/11911
{
  "id": 11911,
  "siglas": "PACMA",
  "denominacion": "PARTIDO ANIMALISTA CONTRA EL MALTRATO ANIMAL",
  "partido_recode_id": null,
  "recode": null
}

Totales territorio

Resúmenes de participación filtrados por elección, tipo de territorio y CCAA.

GET /api/v1/resultados/totales-territorio?eleccion_id=208&tipo_territorio=provincia&codigo_ccaa=01&limit=2
{
  "total": 8,
  "skip": 0,
  "limit": 2,
  "data": [
    {
      "id": 408788,
      "eleccion_id": 208,
      "territorio_id": 20,
      "censo_ine": 500556,
      "participacion_1": 182762,
      "participacion_2": 259071,
      "participacion_3": null,
      "votos_validos": 328097,
      "abstenciones": 169541,
      "votos_blancos": 2283,
      "votos_nulos": 2918,
      "nrepresentantes": 6
    },
    {
      "id": 408789,
      "eleccion_id": 208,
      "territorio_id": 21,
      "censo_ine": 1000032,
      "participacion_1": 361498,
      "participacion_2": 535223,
      "participacion_3": null,
      "votos_validos": 667562,
      "abstenciones": 324120,
      "votos_blancos": 8206,
      "votos_nulos": 8350,
      "nrepresentantes": 9
    }
  ]
}

Votos por partido

GET /api/v1/resultados/votos-partido?eleccion_id=208&territorio_id=20&limit=3
{
  "total": 10,
  "skip": 0,
  "limit": 3,
  "data": [
    {"id": 5732188, "eleccion_id": 208, "territorio_id": 20, "partido_id": 1831, "votos": 56268, "representantes": 1},
    {"id": 5732189, "eleccion_id": 208, "territorio_id": 20, "partido_id": 8180, "votos": 73952, "representantes": 2},
    {"id": 5732190, "eleccion_id": 208, "territorio_id": 20, "partido_id": 9451, "votos": 98924, "representantes": 2}
  ]
}

Resultado completo de una elección + territorio

Combina totales territorio con el desglose de votos por partido (incluyendo datos del partido expandidos).

GET /api/v1/elecciones/208/totales-territorio/20
{
  "totales_territorio": {
    "id": 408788,
    "eleccion_id": 208,
    "territorio_id": 20,
    "censo_ine": 500556,
    "participacion_1": 182762,
    "participacion_2": 259071,
    "participacion_3": null,
    "votos_validos": 328097,
    "abstenciones": 169541,
    "votos_blancos": 2283,
    "votos_nulos": 2918,
    "nrepresentantes": 6
  },
  "votos_partido": [
    {
      "id": 5732190,
      "eleccion_id": 208,
      "territorio_id": 20,
      "partido_id": 9451,
      "votos": 98924,
      "representantes": 2,
      "partido": {"id": 9451, "siglas": "PSOE", "denominacion": "PARTIDO SOCIALISTA OBRERO ESPAÑOL", "partido_recode_id": 80}
    },
    {
      "id": 5732189,
      "eleccion_id": 208,
      "territorio_id": 20,
      "partido_id": 8180,
      "votos": 73952,
      "representantes": 2,
      "partido": {"id": 8180, "siglas": "PP", "denominacion": "PARTIDO POPULAR", "partido_recode_id": 73}
    },
    {
      "id": 5732192,
      "eleccion_id": 208,
      "territorio_id": 20,
      "partido_id": 11895,
      "votos": 62648,
      "representantes": 1,
      "partido": {"id": 11895, "siglas": "VOX", "denominacion": "VOX", "partido_recode_id": 102}
    }
  ]
}

Resultados combinados

Endpoint más completo: cada voto incluye partido (con agrupación), territorio y elección expandidos. Ideal para análisis cruzado.

GET /api/v1/resultados/combinados?eleccion_id=208&tipo_territorio=provincia&codigo_ccaa=01&limit=2
{
  "total": 91,
  "skip": 0,
  "limit": 2,
  "data": [
    {
      "id": 5732188,
      "eleccion_id": 208,
      "territorio_id": 20,
      "partido_id": 1831,
      "votos": 56268,
      "representantes": 1,
      "partido": {
        "id": 1831,
        "siglas": "CS",
        "denominacion": "CIUDADANOS-PARTIDO DE LA CIUDADANÍA",
        "partido_recode_id": 29,
        "recode": {
          "id": 29,
          "partido_recode": "Cs",
          "agrupacion": "Cs",
          "color": "#ED6C00"
        }
      },
      "territorio": {
        "id": 20,
        "tipo": "provincia",
        "nombre": "Almería",
        "codigo_completo": "0104999999999",
        "codigo_ccaa": "01",
        "codigo_provincia": "04"
      },
      "eleccion": {
        "id": 208,
        "tipo_eleccion": "G",
        "year": "2019",
        "mes": "04",
        "dia": "28",
        "fecha": "2019-04-28",
        "descripcion": "Elecciones Generales 2019",
        "ambito": "Nacional",
        "slug": "elecciones-generales-2019"
      }
    }
  ]
}

Resultado vacío

Cuando los filtros no coinciden con ningún registro, la respuesta es HTTP 200 con total=0 y data=[].

GET /api/v1/elecciones?tipo_eleccion=G&year=1800
{
  "total": 0,
  "skip": 0,
  "limit": 50,
  "data": []
}

Errores

404 — Recurso no encontrado

GET /api/v1/elecciones/99999
{
  "detail": "Elección no encontrada"
}

422 — Error de validación

GET /api/v1/elecciones?limit=-5
{
  "detail": [
    {
      "type": "greater_than_equal",
      "loc": ["query", "limit"],
      "msg": "Input should be greater than or equal to 1",
      "input": "-5",
      "ctx": {"ge": 1}
    }
  ]
}