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.
| Propiedad | Valor |
|---|---|
| Método | POST |
| Ruta | /home/api/tramite/<codigo> |
| Autenticación | No requerida |
| Content-Type | multipart/form-data (si hay archivos) o application/json |
| Campo (body) | Tipo | Descripción |
|---|---|---|
| <pre_codigo> | string | Valor de cada pregunta del formulario del trámite. El código corresponde a pre_codigo de la pregunta. |
| <pre_codigo_archivo> | file | Archivo 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"}
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.
| Propiedad | Valor |
|---|---|
| Método | GET |
| Ruta | /home/api/tramite/estado/<codigo> |
| Autenticación | No requerida |
| Parámetro | Ubicación | Descripción |
|---|---|---|
| <campo>=<valor> | Query | Un único par campo-valor. El campo debe ser el pre_codigo de la pregunta. Ej: ?PRE_DOC=12345678 |
* (comodín) | Path | Usar 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.
| Propiedad | Valor |
|---|---|
| Método | POST |
| Ruta | /home/api/tramite/info/<codigo> |
| Autenticación | No 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.
| Propiedad | Valor |
|---|---|
| Método | GET |
| Ruta | /home/api/tramite/estado_all/<codigo> |
| Autenticación | No 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
| Propiedad | Valor |
|---|---|
| Método | GET |
| Ruta | /home/api/validar/ |
| Autenticación | No 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
| Propiedad | Valor |
|---|---|
| Método | POST |
| Ruta | /home/api/validar/ |
| Autenticación | No requerida |
Response 200:
{"EsCorrecto": true, "mensaje": "Validación exitosa"}
// o
{"EsCorrecto": false, "mensaje": "Validación fallida"}
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.
| Propiedad | Valor |
|---|---|
| Método | POST |
| Ruta | /home/api/listacertificados/?codigo=<cert_codigo> |
| Autenticación | JWT requerido |
| Parámetro | Ubicación | Descripción |
|---|---|---|
codigo | Query | Código del certificado (cert_codigo) |
| <pre_codigo> | Body | Campos 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.
| Propiedad | Valor |
|---|---|
| Método | POST |
| Ruta | /home/api/ejecutar/<codigo> |
| Autenticación | JWT requerido |
| Campo | Descripció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"}
estado (boolean). Si estado=true, debe incluir el campo respuesta. Si estado=false, debe incluir el campo mensaje con el error.
This group of endpoints allows creating records in procedures, checking their status, executing stored procedures, and managing user validation. Also includes the certificates endpoint.
POST tramite — Create a procedure record
Creates a new TramiteEntidad with the data from the form associated with the procedure. If the procedure is complaint-type (tra_isDenuncia=True), it also validates the complaint type field.
| Property | Value |
|---|---|
| Method | POST |
| Path | /home/api/tramite/<codigo> |
| Authentication | Not required |
| Content-Type | multipart/form-data (with files) or application/json |
POST /home/api/tramite/TRAMITE_PQRS
Content-Type: application/json
{
"PRE_NOMBRE": "Juan García",
"PRE_EMAIL": "juan@example.com",
"PRE_DESCRIPCION": "Information request"
}
import requests
resp = requests.post(
"https://YOUR-DOMAIN/home/api/tramite/TRAMITE_PQRS",
json={
"PRE_NOMBRE": "Juan García",
"PRE_EMAIL": "juan@example.com",
"PRE_DESCRIPCION": "Information request"
}
)
data = resp.json()
const { data } = await axios.post(
'https://YOUR-DOMAIN/home/api/tramite/TRAMITE_PQRS',
{
PRE_NOMBRE: 'Juan García',
PRE_EMAIL: 'juan@example.com',
PRE_DESCRIPCION: 'Information request'
}
);
var body = new StringContent(
JsonSerializer.Serialize(new {
PRE_NOMBRE = "Juan García",
PRE_EMAIL = "juan@example.com",
PRE_DESCRIPCION = "Information request"
}),
Encoding.UTF8, "application/json"
);
var response = await client.PostAsync(
"https://YOUR-DOMAIN/home/api/tramite/TRAMITE_PQRS", body);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://YOUR-DOMAIN/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"
}
GET tramite/estado — Find record by field
Finds the first TramiteEntidad of a specific procedure whose tent_informacion contains the field-value pair sent as a query param.
| Property | Value |
|---|---|
| Method | GET |
| Path | /home/api/tramite/estado/<codigo> |
| Authentication | Not required |
GET /home/api/tramite/estado/TRAMITE_PQRS?PRE_EMAIL=juan@example.com
import requests
resp = requests.get(
"https://YOUR-DOMAIN/home/api/tramite/estado/TRAMITE_PQRS",
params={"PRE_EMAIL": "juan@example.com"}
)
data = resp.json()
const { data } = await axios.get(
'https://YOUR-DOMAIN/home/api/tramite/estado/TRAMITE_PQRS',
{ params: { PRE_EMAIL: 'juan@example.com' } }
);
var response = await client.GetAsync(
"https://YOUR-DOMAIN/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://YOUR-DOMAIN/home/api/tramite/estado/TRAMITE_PQRS?PRE_EMAIL=juan@example.com"))
.GET()
.build();
POST tramite/info — Form questions
Returns the question structure of the form associated with the procedure. Useful for building forms dynamically on the client side before the creation POST.
| Property | Value |
|---|---|
| Method | POST |
| Path | /home/api/tramite/info/<codigo> |
| Authentication | Not required |
POST /home/api/tramite/info/TRAMITE_PQRS
import requests
resp = requests.post(
"https://YOUR-DOMAIN/home/api/tramite/info/TRAMITE_PQRS"
)
data = resp.json()
const { data } = await axios.post(
'https://YOUR-DOMAIN/home/api/tramite/info/TRAMITE_PQRS'
);
var response = await client.PostAsync(
"https://YOUR-DOMAIN/home/api/tramite/info/TRAMITE_PQRS", null);
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://YOUR-DOMAIN/home/api/tramite/info/TRAMITE_PQRS"))
.POST(HttpRequest.BodyPublishers.noBody())
.build();
GET tramite/estado_all — Search all procedures
Same as tramite/estado but without filtering by a specific procedure. Searches all TramiteEntidad records.
| Property | Value |
|---|---|
| Method | GET |
| Path | /home/api/tramite/estado_all/<codigo> |
| Authentication | Not required |
GET /home/api/tramite/estado_all/*?PRE_DOC=12345678
import requests
resp = requests.get(
"https://YOUR-DOMAIN/home/api/tramite/estado_all/*",
params={"PRE_DOC": "12345678"}
)
data = resp.json()
const { data } = await axios.get(
'https://YOUR-DOMAIN/home/api/tramite/estado_all/*',
{ params: { PRE_DOC: '12345678' } }
);
var response = await client.GetAsync(
"https://YOUR-DOMAIN/home/api/tramite/estado_all/*?PRE_DOC=12345678");
var json = await response.Content.ReadAsStringAsync();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(
"https://YOUR-DOMAIN/home/api/tramite/estado_all/*?PRE_DOC=12345678"))
.GET()
.build();
GET / POST validar — User validation
Dual-function endpoint: GET initiates the validation process by sending a code via email. POST verifies the received code.
sol_fechaFin = now + timedelta(minutes=10)).
GET Response 200:
{"EsCorrecto": true, "mensaje": "Se envio un correo electronico a jua****ez@gma****il.com..."}
POST Response 200:
{"EsCorrecto": true, "mensaje": "Validación exitosa"}
// or
{"EsCorrecto": false, "mensaje": "Validación fallida"}
POST listacertificados — Register a certificate
Registers certificate form data and executes the stored procedure linked to the certificate (cert_TablaBusqueda). Requires JWT authentication.
| Property | Value |
|---|---|
| Method | POST |
| Path | /home/api/listacertificados/?codigo=<cert_codigo> |
| Authentication | JWT required |
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://YOUR-DOMAIN/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://YOUR-DOMAIN/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://YOUR-DOMAIN/home/api/listacertificados/?codigo=CERT_RESIDENCIA", body);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(
"https://YOUR-DOMAIN/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"
}
}
POST ejecutar — Execute stored procedure
Executes a stored procedure registered in the system (Procedimientos), passing the request body as JSON via the @jsondata parameter. Requires JWT authentication.
| Property | Value |
|---|---|
| Method | POST |
| Path | /home/api/ejecutar/<codigo> |
| Authentication | JWT required |
POST /home/api/ejecutar/SEARCH_PERSON
Authorization: Bearer <access_token>
Content-Type: application/json
{"identificacion": "12345678", "tipo_doc": "CC"}
headers = {"Authorization": f"Bearer {access_token}"}
resp = requests.post(
"https://YOUR-DOMAIN/home/api/ejecutar/SEARCH_PERSON",
headers=headers,
json={"identificacion": "12345678", "tipo_doc": "CC"}
)
data = resp.json()
const { data } = await axios.post(
'https://YOUR-DOMAIN/home/api/ejecutar/SEARCH_PERSON',
{ 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://YOUR-DOMAIN/home/api/ejecutar/SEARCH_PERSON", body);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://YOUR-DOMAIN/home/api/ejecutar/SEARCH_PERSON"))
.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"
}
}
Response — procedure not found: {"EsCorrecto": false, "mensaje": "No existe una acción con ese código asociado"}
estado field (boolean). If estado=true, it must include respuesta. If estado=false, it must include mensaje with the error.