Trámites, Certificados y Acciones

Procedures, Certificates & Actions

Este grupo de endpoints permite crear registros en trámites, consultar su estado, ejecutar procedimientos almacenados y gestionar la validación de usuarios. También incluye el endpoint de certificados.

POST tramite — Crear registro en un trámite

Crea un nuevo TramiteEntidad con los datos del formulario asociado al trámite. Si el trámite es de tipo denuncia (tra_isDenuncia=True), valida además el campo de tipo de denuncia.

PropiedadValor
MétodoPOST
Ruta/home/api/tramite/<codigo>
AutenticaciónNo requerida
Content-Typemultipart/form-data (si hay archivos) o application/json
Campo (body)TipoDescripción
<pre_codigo>stringValor de cada pregunta del formulario del trámite. El código corresponde a pre_codigo de la pregunta.
<pre_codigo_archivo>fileArchivo adjunto para preguntas de tipo ARCHIVO. Se sube a S3.
POST /home/api/tramite/TRAMITE_PQRS
Content-Type: application/json

{
  "PRE_NOMBRE": "Juan García",
  "PRE_EMAIL": "juan@example.com",
  "PRE_DESCRIPCION": "Solicitud de información"
}
import requests

resp = requests.post(
    "https://TU-DOMINIO/home/api/tramite/TRAMITE_PQRS",
    json={
        "PRE_NOMBRE": "Juan García",
        "PRE_EMAIL": "juan@example.com",
        "PRE_DESCRIPCION": "Solicitud de información"
    }
)
data = resp.json()
const { data } = await axios.post(
  'https://TU-DOMINIO/home/api/tramite/TRAMITE_PQRS',
  {
    PRE_NOMBRE: 'Juan García',
    PRE_EMAIL: 'juan@example.com',
    PRE_DESCRIPCION: 'Solicitud de información'
  }
);
var body = new StringContent(
    JsonSerializer.Serialize(new {
        PRE_NOMBRE = "Juan García",
        PRE_EMAIL = "juan@example.com",
        PRE_DESCRIPCION = "Solicitud de información"
    }),
    Encoding.UTF8, "application/json"
);
var response = await client.PostAsync(
    "https://TU-DOMINIO/home/api/tramite/TRAMITE_PQRS", body);
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://TU-DOMINIO/home/api/tramite/TRAMITE_PQRS"))
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(
        "{\"PRE_NOMBRE\":\"Juan García\",\"PRE_EMAIL\":\"juan@example.com\"}"
    ))
    .build();

Response 200:

{
  "msg": "Petición exitosa",
  "datos": 42,
  "key": "key_550e8400-e29b-41d4-a716-446655440000"
}

Response 400: {"msg": "Faltan datos obligatorios - PRE_NOMBRE/Nombre del solicitante"}

Response 404: {"msg": "No existe un tramite con ese código asociado"}

Campos de respuesta: datos es el ID de la TramiteEntidad creada. key es la llave UUID generada para identificar el registro.

GET tramite/estado — Buscar registro por campo

Busca el primer TramiteEntidad de un trámite específico cuyo tent_informacion contenga el par campo-valor enviado como query param.

PropiedadValor
MétodoGET
Ruta/home/api/tramite/estado/<codigo>
AutenticaciónNo requerida
ParámetroUbicaciónDescripción
<campo>=<valor>QueryUn único par campo-valor. El campo debe ser el pre_codigo de la pregunta. Ej: ?PRE_DOC=12345678
* (comodín)PathUsar estado/* para buscar en todos los trámites (equivalente a estado_all)
GET /home/api/tramite/estado/TRAMITE_PQRS?PRE_EMAIL=juan@example.com
import requests

resp = requests.get(
    "https://TU-DOMINIO/home/api/tramite/estado/TRAMITE_PQRS",
    params={"PRE_EMAIL": "juan@example.com"}
)
data = resp.json()
const { data } = await axios.get(
  'https://TU-DOMINIO/home/api/tramite/estado/TRAMITE_PQRS',
  { params: { PRE_EMAIL: 'juan@example.com' } }
);
var response = await client.GetAsync(
    "https://TU-DOMINIO/home/api/tramite/estado/TRAMITE_PQRS?PRE_EMAIL=juan@example.com");
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(
        "https://TU-DOMINIO/home/api/tramite/estado/TRAMITE_PQRS?PRE_EMAIL=juan@example.com"))
    .GET()
    .build();

Response 200:

{
  "msg": "Petición exitosa",
  "datos": {
    "PRE_NOMBRE": "Juan García",
    "PRE_EMAIL": "juan@example.com",
    "PRE_DESCRIPCION": "Solicitud de información"
  }
}

Response 404: {"msg": "No se encontró información para el tramite"}


POST tramite/info — Preguntas del formulario

Retorna la estructura de preguntas del formulario asociado al trámite. Útil para construir formularios dinámicamente en el cliente antes de hacer el POST de creación.

PropiedadValor
MétodoPOST
Ruta/home/api/tramite/info/<codigo>
AutenticaciónNo requerida
POST /home/api/tramite/info/TRAMITE_PQRS
import requests

resp = requests.post(
    "https://TU-DOMINIO/home/api/tramite/info/TRAMITE_PQRS"
)
data = resp.json()
const { data } = await axios.post(
  'https://TU-DOMINIO/home/api/tramite/info/TRAMITE_PQRS'
);
var response = await client.PostAsync(
    "https://TU-DOMINIO/home/api/tramite/info/TRAMITE_PQRS",
    null);
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://TU-DOMINIO/home/api/tramite/info/TRAMITE_PQRS"))
    .POST(HttpRequest.BodyPublishers.noBody())
    .build();

Response 200:

{
  "msg": "Petición exitosa",
  "datos": [
    {
      "pre_codigo": "PRE_NOMBRE",
      "pre_texto": "Nombre del solicitante",
      "pre_tipo": "TEXTO",
      "pre_obligatorio": true
    },
    {
      "pre_codigo": "PRE_EMAIL",
      "pre_texto": "Correo electrónico",
      "pre_tipo": "TEXTO",
      "pre_obligatorio": true
    }
  ]
}

GET tramite/estado_all — Buscar en todos los trámites

Igual que tramite/estado pero sin filtrar por trámite específico. Busca en todos los TramiteEntidad cuyo tent_informacion contenga el par campo-valor.

PropiedadValor
MétodoGET
Ruta/home/api/tramite/estado_all/<codigo>
AutenticaciónNo requerida
GET /home/api/tramite/estado_all/*?PRE_DOC=12345678
import requests

resp = requests.get(
    "https://TU-DOMINIO/home/api/tramite/estado_all/*",
    params={"PRE_DOC": "12345678"}
)
data = resp.json()
const { data } = await axios.get(
  'https://TU-DOMINIO/home/api/tramite/estado_all/*',
  { params: { PRE_DOC: '12345678' } }
);
var response = await client.GetAsync(
    "https://TU-DOMINIO/home/api/tramite/estado_all/*?PRE_DOC=12345678");
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(
        "https://TU-DOMINIO/home/api/tramite/estado_all/*?PRE_DOC=12345678"))
    .GET()
    .build();

GET / POST validar — Validación de usuario

Endpoint de doble función: GET inicia el proceso de validación enviando un código por email al usuario. POST verifica el código recibido.

GET — Iniciar validación

PropiedadValor
MétodoGET
Ruta/home/api/validar/
AutenticaciónNo requerida

Los parámetros requeridos dependen de la configuración de la plantilla de validación. El sistema busca la identificación del usuario, obtiene su correo de la BD y envía un código de 5 caracteres via Brevo (SendinBlue). El correo se muestra parcialmente enmascarado en la respuesta.

Response 200 — código enviado:

{
  "EsCorrecto": true,
  "mensaje": "Se envio un correo electronico a jua****ez@gma****il.com..."
}

Response — ya existe solicitud pendiente:

{
  "EsCorrecto": true,
  "mensaje": "Ya existe una solicitud pendiente de validación para el correo jua****ez@gma****il.com..."
}

Response — error al enviar email:

{"EsCorrecto": false, "mensaje": "Error al enviar el correo electrónico de validación"}

POST — Verificar código

PropiedadValor
MétodoPOST
Ruta/home/api/validar/
AutenticaciónNo requerida

Response 200:

{"EsCorrecto": true, "mensaje": "Validación exitosa"}
// o
{"EsCorrecto": false, "mensaje": "Validación fallida"}
Expiración: Los códigos de validación tienen vigencia de 10 minutos (sol_fechaFin = now + timedelta(minutes=10)). Pasado ese tiempo, la solicitud expira.

POST listacertificados — Registrar un certificado

Registra los datos de un formulario de certificado y ejecuta el stored procedure asociado al certificado (cert_TablaBusqueda). Requiere autenticación JWT.

PropiedadValor
MétodoPOST
Ruta/home/api/listacertificados/?codigo=<cert_codigo>
AutenticaciónJWT requerido
ParámetroUbicaciónDescripción
codigoQueryCódigo del certificado (cert_codigo)
<pre_codigo>BodyCampos del formulario del certificado
POST /home/api/listacertificados/?codigo=CERT_RESIDENCIA
Authorization: Bearer <access_token>
Content-Type: application/json

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

Response 200:

{
  "EsCorrecto": true,
  "resultado": {
    "nombre": "Juan García",
    "fecha_expedicion": "2024-03-15",
    "numero_certificado": "CERT-2024-001"
  }
}

Response — error en stored procedure: {"EsCorrecto": false, "mensaje": "No se encontró información para el documento"}


POST ejecutar — Ejecutar stored procedure

Ejecuta un stored procedure registrado en el sistema (Procedimientos) enviando el cuerpo de la petición como JSON. El procedimiento debe estar registrado con su nombre en BD y un código identificador. Requiere autenticación JWT.

PropiedadValor
MétodoPOST
Ruta/home/api/ejecutar/<codigo>
AutenticaciónJWT requerido
CampoDescripción
codigo (path)Código del procedimiento (pro_codigo)
Body (JSON)Parámetros para el stored procedure. Se serializa y pasa como @jsondata.
POST /home/api/ejecutar/BUSCAR_PERSONA
Authorization: Bearer <access_token>
Content-Type: application/json

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

Response 200:

{
  "EsCorrecto": true,
  "resultado": {
    "nombre": "Juan García",
    "fecha_nacimiento": "1990-05-15",
    "direccion": "Calle 30 # 10-25"
  }
}

Response — procedimiento retornó error: {"EsCorrecto": false, "mensaje": "No se encontró registro para la identificación proporcionada"}

Response — código no existe: {"EsCorrecto": false, "mensaje": "No existe una acción con ese código asociado"}

Contrato del stored procedure: El SP debe retornar un JSON con al menos el campo estado (boolean). Si estado=true, debe incluir el campo respuesta. Si estado=false, debe incluir el campo mensaje con el error.