Enviar archivo de Staff
curl --request POST \
--url https://api.dev.impactu.colav.co/submit/staff \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.dev.impactu.colav.co/submit/staff"
payload = {}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.dev.impactu.colav.co/submit/staff', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.dev.impactu.colav.co/submit/staff",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.dev.impactu.colav.co/submit/staff"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.dev.impactu.colav.co/submit/staff")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.impactu.colav.co/submit/staff")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{ "success": true, "errors": 0, "warnings": 3, "duplicates": 0, "pdf_base64": "JVBERi0xLjQKJ..." }
{ "success": false, "msg": "Archivo requerido" }
{ "success": false, "errors": 2, "warnings": 1, "duplicates": 1, "pdf_base64": "JVBERi0xLjQKJ..." }
{"msg": "Token inválido o expirado", "success": false}
{
"success": false,
"errors": 1,
"duplicates": 0,
"msg": "El archivo enviado no cumple con el formato requerido de columnas",
"pdf_base64": "JVBERi0xLjQKJ..."
}
Submit
Enviar archivo de Staff
Sube un Excel de talento humano (.xlsx), lo valida contra las reglas de negocio y devuelve un reporte de calidad en PDF.
POST
/
submit
/
staff
Enviar archivo de Staff
curl --request POST \
--url https://api.dev.impactu.colav.co/submit/staff \
--header 'Content-Type: application/json' \
--data '{}'import requests
url = "https://api.dev.impactu.colav.co/submit/staff"
payload = {}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.dev.impactu.colav.co/submit/staff', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.dev.impactu.colav.co/submit/staff",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.dev.impactu.colav.co/submit/staff"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.dev.impactu.colav.co/submit/staff")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.dev.impactu.colav.co/submit/staff")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{ "success": true, "errors": 0, "warnings": 3, "duplicates": 0, "pdf_base64": "JVBERi0xLjQKJ..." }
{ "success": false, "msg": "Archivo requerido" }
{ "success": false, "errors": 2, "warnings": 1, "duplicates": 1, "pdf_base64": "JVBERi0xLjQKJ..." }
{"msg": "Token inválido o expirado", "success": false}
{
"success": false,
"errors": 1,
"duplicates": 0,
"msg": "El archivo enviado no cumple con el formato requerido de columnas",
"pdf_base64": "JVBERi0xLjQKJ..."
}
Requiere sesión activa. El JWT se lee desde la cookie
access_token_cookie.
La solicitud debe enviarse como multipart/form-data.Cuerpo de la solicitud
file
required
Archivo Excel
.xlsx con los datos de talento humano. Debe contener una fila
por persona vinculada.Formato del archivo
El archivo debe tener exactamente las siguientes columnas (en minúscula con guion bajo):| Columna | Obligatoria | Descripción |
|---|---|---|
tipo_documento | ✅ | Tipo de documento de identidad. |
identificacion | ✅ | Número de documento. |
primer_apellido | ✅* | Primer apellido. Requerido si no se envía nombre_completo. |
segundo_apellido | — | Segundo apellido. Puede estar vacío sin penalización. |
nombres | ✅* | Nombres. Requerido si no se envía nombre_completo. |
nombre_completo | — | Nombre completo. Si está presente, reemplaza primer_apellido, segundo_apellido y nombres. No puede contener números. |
fecha_nacimiento | — | Fecha en formato DD/MM/YYYY. |
sexo | — | Valor de catálogo. Fuera de catálogo → normalizado a desconocido. |
nivel_academico | — | Valor de catálogo. Fuera de catálogo → normalizado a desconocido. |
tipo_contrato | — | Valor de catálogo. Fuera de catálogo → normalizado a desconocido. |
jornada_laboral | — | Valor de catálogo. Fuera de catálogo → normalizado a desconocido. |
categoria_laboral | — | Valor de catálogo. Fuera de catálogo → normalizado a desconocido. |
fecha_inicial_vinculacion | — | Fecha en formato DD/MM/YYYY. |
fecha_final_vinculacion | — | Fecha en formato DD/MM/YYYY. |
codigo_unidad_academica | ✅ | Código único de la unidad académica. |
unidad_academica | ✅ | Nombre de la unidad académica. |
codigo_subunidad_academica | — | Puede estar vacío sin penalización. |
subunidad_academica | — | Puede estar vacío sin penalización. |
Los campos de catálogo (
sexo, nivel_academico, etc.) no generan error si
su valor no pertenece al catálogo, pero se normalizan a desconocido y se
reportan como advertencia. Las fechas con alias de “sin información” (n/a,
no aplica, etc.) también se normalizan a desconocido.Respuesta
boolean
true si el archivo no tiene errores. Con errores, la respuesta es 400 con
el mismo reporte.integer
Número de errores encontrados en el archivo.
integer
Número de advertencias.
integer
Número de registros duplicados detectados.
string
Reporte de calidad en formato PDF codificado en Base64. Incluye el resumen
de errores, advertencias y normalizaciones aplicadas.
string
Solo en los errores: motivo del rechazo.
{ "success": true, "errors": 0, "warnings": 3, "duplicates": 0, "pdf_base64": "JVBERi0xLjQKJ..." }
{ "success": false, "msg": "Archivo requerido" }
{ "success": false, "errors": 2, "warnings": 1, "duplicates": 1, "pdf_base64": "JVBERi0xLjQKJ..." }
{"msg": "Token inválido o expirado", "success": false}
{
"success": false,
"errors": 1,
"duplicates": 0,
"msg": "El archivo enviado no cumple con el formato requerido de columnas",
"pdf_base64": "JVBERi0xLjQKJ..."
}