Formularios — Endpoints de consulta

Forms — Query Endpoints

Los endpoints de formularios permiten consultar datos almacenados en los formularios dinámicos del sistema. La mayoría son públicos (AllowAny), pero el formulario debe tener habilitado el flag for_can_api=True para ser consultable externamente.

Prerequisito: Para que un formulario sea accesible via API pública, el administrador debe activar el flag for_can_api en el panel de Django Admin. Los formularios sin este flag retornan 403 Forbidden.

GET getInformacion — Última acción de un ente

Retorna la última acción registrada (FormularioAccion) de una entidad específica dentro de un formulario. Requiere autenticación JWT.

PropiedadValor
MétodoPOST
Ruta/home/api/getInformacion
AutenticaciónJWT requerido
Campo (body)TipoDescripción
FormulariostringCódigo del formulario (for_codigo)
Llavestring (UUID)Valor de la llave primaria del ente
POST /home/api/getInformacion
Authorization: Bearer <access_token>
Content-Type: application/json

{
  "Formulario": "CARACT_01",
  "Llave": "12345678"
}
headers = {"Authorization": f"Bearer {access_token}"}
resp = requests.post(
    "https://TU-DOMINIO/home/api/getInformacion",
    headers=headers,
    json={"Formulario": "CARACT_01", "Llave": "12345678"}
)
data = resp.json()
const response = await axios.post(
  'https://TU-DOMINIO/home/api/getInformacion',
  { Formulario: 'CARACT_01', Llave: '12345678' },
  { headers: { 'Authorization': `Bearer ${accessToken}` } }
);
client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", accessToken);
var body = new StringContent(
    JsonSerializer.Serialize(new { Formulario = "CARACT_01", Llave = "12345678" }),
    Encoding.UTF8, "application/json"
);
var response = await client.PostAsync(
    "https://TU-DOMINIO/home/api/getInformacion", body);
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://TU-DOMINIO/home/api/getInformacion"))
    .header("Authorization", "Bearer " + accessToken)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(
        "{\"Formulario\":\"CARACT_01\",\"Llave\":\"12345678\"}"
    ))
    .build();

Response 200:

{
  "msg": "Petición exitosa",
  "datos": { "campo_1": "valor_1", "campo_2": "valor_2" }
}

Response 404: {"msg": "No existe una entidad con el filtro asociado"}


GET getInformacionFormulario — Todos los entes (actual)

Retorna todos los entes registrados en un formulario con sus datos más recientes. Los campos de selección se serializan mostrando el texto legible (no el código interno).

PropiedadValor
MétodoGET
Ruta/home/api/getInformacionFormulario/<codigo>
AutenticaciónNo requerida
Requierefor_can_api=True en el formulario
GET /home/api/getInformacionFormulario/CARACT_01
import requests

resp = requests.get("https://TU-DOMINIO/home/api/getInformacionFormulario/CARACT_01")
data = resp.json()
const { data } = await axios.get(
  'https://TU-DOMINIO/home/api/getInformacionFormulario/CARACT_01'
);
var response = await client.GetAsync(
    "https://TU-DOMINIO/home/api/getInformacionFormulario/CARACT_01");
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://TU-DOMINIO/home/api/getInformacionFormulario/CARACT_01"))
    .GET()
    .build();

Response 200:

{
  "msg": "Petición exitosa",
  "formulario": "Caracterización 2024",
  "datos": [
    {
      "id": 1,
      "fecha_registro": "2024-03-15T10:30:00Z",
      "PRE_NOMBRE": {"pregunta": "Nombre completo", "respuesta": "Juan Pérez"},
      "PRE_BARRIO": {"pregunta": "Barrio", "respuesta": "El Centro"}
    }
  ]
}

Response 403: {"msg": "El formulario no tiene habilitada la consulta por API"}


GET getInformacionFormularioHistoria — Historia de acciones

Retorna todas las acciones registradas sobre un formulario, en orden cronológico. Cada registro incluye el estado de los campos en el momento de la acción. Útil para auditoría.

PropiedadValor
MétodoGET
Ruta/home/api/getInformacionFormularioHistoria/<codigo>
AutenticaciónNo requerida
Requierefor_can_api=True en el formulario
GET /home/api/getInformacionFormularioHistoria/CARACT_01
import requests

resp = requests.get(
    "https://TU-DOMINIO/home/api/getInformacionFormularioHistoria/CARACT_01"
)
data = resp.json()
const { data } = await axios.get(
  'https://TU-DOMINIO/home/api/getInformacionFormularioHistoria/CARACT_01'
);
var response = await client.GetAsync(
    "https://TU-DOMINIO/home/api/getInformacionFormularioHistoria/CARACT_01");
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(
        "https://TU-DOMINIO/home/api/getInformacionFormularioHistoria/CARACT_01"))
    .GET()
    .build();

Response 200:

{
  "msg": "Petición exitosa",
  "formulario": "Caracterización 2024",
  "datos": [
    {
      "id": 42,
      "ente_llave": {"campo_llave": "12345678"},
      "fecha_registro": "2024-03-15T10:30:00Z",
      "PRE_NOMBRE": {"pregunta": "Nombre completo", "respuesta": "Juan Pérez"},
      "PRE_ESTADO": {"pregunta": "Estado", "respuesta": "Activo"}
    }
  ]
}

GET v2/getInformacionFormularioHistoria — Historia V2 (optimizada)

Versión optimizada del endpoint de historia. Pre-carga los valores de maestros una sola vez antes del loop principal, reduciendo queries N+1 en formularios con preguntas de tipo selección maestro. Recomendada para grandes volúmenes.

PropiedadValor
MétodoGET
Ruta/home/api/v2/getInformacionFormularioHistoria/<codigo>
AutenticaciónNo requerida
Requierefor_can_api=True en el formulario
Diferencia con V1: En V2 las claves del objeto de respuesta son el texto de la pregunta (no el código), y los maestros se pre-cargan con un dict O(1). Usa iterator(chunk_size=500) para datasets grandes.
GET /home/api/v2/getInformacionFormularioHistoria/CARACT_01
import requests

resp = requests.get(
    "https://TU-DOMINIO/home/api/v2/getInformacionFormularioHistoria/CARACT_01"
)
data = resp.json()
const { data } = await axios.get(
  'https://TU-DOMINIO/home/api/v2/getInformacionFormularioHistoria/CARACT_01'
);
var response = await client.GetAsync(
    "https://TU-DOMINIO/home/api/v2/getInformacionFormularioHistoria/CARACT_01");
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(
        "https://TU-DOMINIO/home/api/v2/getInformacionFormularioHistoria/CARACT_01"))
    .GET()
    .build();

Response 200 — misma forma que v1 pero claves son el texto de la pregunta:

{
  "msg": "Petición exitosa",
  "formulario": "Caracterización 2024",
  "datos": [
    {
      "id": 42,
      "ente_llave": {"campo_llave": "12345678"},
      "fecha_registro": "2024-03-15T10:30:00Z",
      "Nombre completo": "Juan Pérez",
      "Barrio de residencia": "El Centro"
    }
  ]
}

GET getInformacionNotSerialized — Historia sin serializar

Retorna la historia de acciones con los datos crudos tal como están almacenados en la BD, sin resolver códigos de selección ni aplicar serialización de tipos. Útil para exportaciones o depuración.

PropiedadValor
MétodoGET
Ruta/home/api/getInformacionNotSerialized/<codigo>
AutenticaciónNo requerida
Requierefor_can_api=True en el formulario
GET /home/api/getInformacionNotSerialized/CARACT_01
import requests

resp = requests.get(
    "https://TU-DOMINIO/home/api/getInformacionNotSerialized/CARACT_01"
)
data = resp.json()
const { data } = await axios.get(
  'https://TU-DOMINIO/home/api/getInformacionNotSerialized/CARACT_01'
);
var response = await client.GetAsync(
    "https://TU-DOMINIO/home/api/getInformacionNotSerialized/CARACT_01");
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(
        "https://TU-DOMINIO/home/api/getInformacionNotSerialized/CARACT_01"))
    .GET()
    .build();

Response 200:

{
  "msg": "Petición exitosa",
  "formulario": "Caracterización 2024",
  "datos": [
    {
      "id": 42,
      "ente_llave": {"PRE_DOC": "12345678"},
      "fecha_registro": "2024-03-15T10:30:00Z",
      "data": {"PRE_NOMBRE": "Juan Pérez", "PRE_BARRIO": "001"},
      "data_form": {"CARACT_01": {"PRE_NOMBRE": "Juan Pérez"}}
    }
  ]
}

GET getInformacionTramite — Registros de un trámite

Retorna todos los registros (TramiteEntidad) asociados a un trámite, con sus campos serializados. Si el trámite tiene tra_isDenuncia=True, incluye campos de tipo denuncia (comentarios, reasignaciones, estado).

PropiedadValor
MétodoGET
Ruta/home/api/getInformacionTramite/<codigo>
AutenticaciónNo requerida
Campo respuestaDescripción
idID del registro TramiteEntidad
fecha_registroFecha de creación
fecha_radicadoFecha de radicación (si aplica)
verificadoBoolean — si el trámite fue verificado
estado_denunciaverificada / finalizada / pendiente
comentarios_tramiteArray de comentarios (si existen)
reasignacionArray de reasignaciones (si existen)
tipo_denuncia_realNombre del tipo de denuncia asignado
<texto_pregunta>Valor serializado de cada campo del formulario
GET /home/api/getInformacionTramite/TRAMITE_PQRS
import requests

resp = requests.get(
    "https://TU-DOMINIO/home/api/getInformacionTramite/TRAMITE_PQRS"
)
registros = resp.json()  # lista de TramiteEntidad
const { data } = await axios.get(
  'https://TU-DOMINIO/home/api/getInformacionTramite/TRAMITE_PQRS'
);
var response = await client.GetAsync(
    "https://TU-DOMINIO/home/api/getInformacionTramite/TRAMITE_PQRS");
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(
        "https://TU-DOMINIO/home/api/getInformacionTramite/TRAMITE_PQRS"))
    .GET()
    .build();

Response 200 — array de registros:

[
  {
    "id": 15,
    "fecha_registro": "2024-03-10T08:00:00Z",
    "fecha_radicado": null,
    "verificado": false,
    "estado_denuncia": "pendiente",
    "Nombre del solicitante": "María García",
    "Tipo de solicitud": "Petición"
  }
]