<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.wikiserpi.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jberna</id>
	<title>WikiSerpi - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="https://www.wikiserpi.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jberna"/>
	<link rel="alternate" type="text/html" href="https://www.wikiserpi.com/index.php/Especial:Contribuciones/Jberna"/>
	<updated>2026-08-21T20:12:30Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://www.wikiserpi.com/index.php?title=API_Modulo_Forms&amp;diff=1227</id>
		<title>API Modulo Forms</title>
		<link rel="alternate" type="text/html" href="https://www.wikiserpi.com/index.php?title=API_Modulo_Forms&amp;diff=1227"/>
		<updated>2026-08-21T14:09:58Z</updated>

		<summary type="html">&lt;p&gt;Jberna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ⚡ Referencia de Endpoints ==&lt;br /&gt;
&lt;br /&gt;
A continuación, los servicios expuestos organizados por método HTTP. Haz clic en cada bloque para expandir la documentación.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border: 1px solid #c8e6c9; background-color: #f1f8e9; padding: 10px; margin-bottom: 10px; border-radius: 4px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight: bold; font-size: 1.1em; color: #2e7d32;&amp;quot;&amp;gt;🟩 GET (Consultas y Lecturas)&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;background-color: #ffffff; padding: 15px; margin-top: 10px; border: 1px solid #c8e6c9;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/categories ===&lt;br /&gt;
Devuelve un listado completo de todas las categorías configuradas en el sistema para la empresa del usuario autenticado.&lt;br /&gt;
==== Respuesta Exitosa (200 OK) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;categoriaId&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;nombre&amp;quot;: &amp;quot;Encuestas de Satisfacción&amp;quot;,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;#3B82F6&amp;quot;,&lt;br /&gt;
    &amp;quot;roleIds&amp;quot;: [101, 102]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/folders ===&lt;br /&gt;
Retorna la estructura jerárquica completa de carpetas, subcarpetas y formularios, filtrada automáticamente por los roles del usuario.&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/stats ===&lt;br /&gt;
Calcula y devuelve los indicadores clave (KPIs) globales del Workspace para la empresa.&lt;br /&gt;
==== Respuesta Exitosa (200 OK) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;respuestasHoy&amp;quot;: 142,&lt;br /&gt;
  &amp;quot;respuestasTotal&amp;quot;: 12850,&lt;br /&gt;
  &amp;quot;formulariosActivos&amp;quot;: 18&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/public/{empresaid}/{uuid} ===&lt;br /&gt;
Devuelve el esquema y diseño público de un formulario para renderizarse en el frontend (No requiere JWT).&lt;br /&gt;
==== Parámetros ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro !! Tipo !! Obligatorio !! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| empresaid || Integer || Sí (Path) || ID de la empresa o 0 para resolver automáticamente.&lt;br /&gt;
|-&lt;br /&gt;
| uuid || String || Sí (Path) || UUID público del formulario.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border: 1px solid #bbdefb; background-color: #e3f2fd; padding: 10px; margin-bottom: 10px; border-radius: 4px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight: bold; font-size: 1.1em; color: #1565c0;&amp;quot;&amp;gt;🟦 POST (Creación y Procesos)&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;background-color: #ffffff; padding: 15px; margin-top: 10px; border: 1px solid #bbdefb;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/forms ===&lt;br /&gt;
Crea un nuevo formulario dinámico asociando su esquema JSON y retornando un UUID para la URL pública.&lt;br /&gt;
==== Parámetros ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro !! Tipo !! Obligatorio !! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| Body || Object || Sí || Datos requeridos para la plantilla de formulario.&lt;br /&gt;
|}&lt;br /&gt;
==== Respuesta Exitosa (201 Created) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formId&amp;quot;: 45,&lt;br /&gt;
  &amp;quot;uuid&amp;quot;: &amp;quot;d3b07384-d113-4f4a-a62e-336712345678&amp;quot;,&lt;br /&gt;
  &amp;quot;titulo&amp;quot;: &amp;quot;Encuesta de Satisfacción en Visita&amp;quot;,&lt;br /&gt;
  &amp;quot;urlPublica&amp;quot;: &amp;quot;/f/15/d3b07384-d113-4f4a-a62e-336712345678&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/forms/public/{empresaid}/{uuid}/responses ===&lt;br /&gt;
Endpoint público para registrar la respuesta diligenciada por un encuestado. Garantiza inmutabilidad y orquesta el cobro de folio SaaS.&lt;br /&gt;
==== Payload Esperado ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;respuestaJson&amp;quot;: &amp;quot;{\&amp;quot;idtercero\&amp;quot;:1502,\&amp;quot;idsucursal\&amp;quot;:1,\&amp;quot;respuestas\&amp;quot;:[{\&amp;quot;pregunta_id\&amp;quot;:\&amp;quot;q1\&amp;quot;,\&amp;quot;valor\&amp;quot;:\&amp;quot;Excelente\&amp;quot;}]}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/billing/process ===&lt;br /&gt;
Orquestación interna SaaS para debitar folios transaccionales (Zero-Trust). No utiliza JWT, sino el encabezado HTTP &amp;lt;code&amp;gt;X-Secret-Key&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border: 1px solid #ffe0b2; background-color: #fff3e0; padding: 10px; margin-bottom: 10px; border-radius: 4px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight: bold; font-size: 1.1em; color: #e65100;&amp;quot;&amp;gt;🟧 PUT (Actualizaciones)&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;background-color: #ffffff; padding: 15px; margin-top: 10px; border: 1px solid #ffe0b2;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/forms/{uuid} ===&lt;br /&gt;
Actualiza el título, descripción y estructura de preguntas (Esquema JSON) de un formulario existente.&lt;br /&gt;
==== Parámetros ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Parámetro !! Tipo !! Obligatorio !! Descripción&lt;br /&gt;
|-&lt;br /&gt;
| uuid || String || Sí (Path) || UUID del formulario a actualizar.&lt;br /&gt;
|-&lt;br /&gt;
| Body || Object || Sí || Datos actualizados del formulario.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/forms/{uuid}/toggle-status ===&lt;br /&gt;
Alterna el estado de un formulario entre Activo e Inactivo (bloquea la recepción de respuestas).&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/forms/{uuid}/move ===&lt;br /&gt;
Reubica un formulario en otra carpeta contenedora o en la raíz del Workspace enviando &amp;lt;code&amp;gt;?carpetaId=25&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border: 1px solid #ffcdd2; background-color: #ffebee; padding: 10px; margin-bottom: 10px; border-radius: 4px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-weight: bold; font-size: 1.1em; color: #c62828;&amp;quot;&amp;gt;🟥 DELETE (Eliminaciones)&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot; style=&amp;quot;background-color: #ffffff; padding: 15px; margin-top: 10px; border: 1px solid #ffcdd2;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DELETE /api/v1/categories/{id} ===&lt;br /&gt;
Elimina de forma física y permanente una categoría. Fallará si la categoría posee carpetas activas.&lt;br /&gt;
&lt;br /&gt;
=== DELETE /api/v1/folders/{id} ===&lt;br /&gt;
Realiza un borrado lógico en cascada de una carpeta y de todas sus subcarpetas y formularios dependientes.&lt;br /&gt;
&lt;br /&gt;
=== DELETE /api/v1/forms/{uuid} ===&lt;br /&gt;
Ejecuta un borrado lógico (Soft Delete) del formulario, desactivándolo y moviéndolo a la papelera sin perder respuestas históricas. Requiere estar apagado previamente.&lt;br /&gt;
==== Códigos de Error Posibles ====&lt;br /&gt;
* &amp;lt;code&amp;gt;400 Bad Request:&amp;lt;/code&amp;gt; El formulario está Activo. Debe desactivarse antes de eliminarse.&lt;br /&gt;
* &amp;lt;code&amp;gt;401 Unauthorized:&amp;lt;/code&amp;gt; No autenticado.&lt;br /&gt;
* &amp;lt;code&amp;gt;404 Not Found:&amp;lt;/code&amp;gt; Formulario inexistente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jberna</name></author>
	</entry>
	<entry>
		<id>https://www.wikiserpi.com/index.php?title=API_Modulo_Forms&amp;diff=1226</id>
		<title>API Modulo Forms</title>
		<link rel="alternate" type="text/html" href="https://www.wikiserpi.com/index.php?title=API_Modulo_Forms&amp;diff=1226"/>
		<updated>2026-08-21T14:00:47Z</updated>

		<summary type="html">&lt;p&gt;Jberna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= ✨ SERPI Forms Core API (v1) =&lt;br /&gt;
&lt;br /&gt;
== Descripción ==&lt;br /&gt;
El microservicio &#039;&#039;&#039;SERPI Forms&#039;&#039;&#039; proporciona almacenamiento, renderizado y análisis histórico de respuestas para formularios dinámicos. Opera bajo una arquitectura multi-tenant y se integra de forma nativa con el ERP SERPI, permitiendo a las empresas gestionar encuestas, auditorías y captura de datos en terreno.&lt;br /&gt;
&lt;br /&gt;
== Autorización ==&lt;br /&gt;
La API utiliza un esquema de seguridad basado en tokens JWT (Bearer Token). Para acceder a los endpoints protegidos, debes incluir el token en las cabeceras HTTP de tu petición:&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&amp;gt; &#039;&#039;&#039;Nota de Desarrollo:&#039;&#039;&#039; Si el bypass de desarrollo local está habilitado, se puede utilizar el encabezado `X-Empresa-Id: &amp;lt;ID&amp;gt;` en lugar del JWT.&lt;br /&gt;
&lt;br /&gt;
== Beneficio ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Trazabilidad y Auditoría:&#039;&#039;&#039; Inmutabilidad de respuestas en el histórico y captura automática de la IP de origen (`ip_origen`).&lt;br /&gt;
* &#039;&#039;&#039;Aislamiento de Datos (Multi-Tenant):&#039;&#039;&#039; Despliegue de bases de datos dedicadas por cliente para máxima seguridad.&lt;br /&gt;
* &#039;&#039;&#039;Flexibilidad Estructural:&#039;&#039;&#039; Modelo híbrido Relacional/JSON que ofrece compatibilidad instantánea con motores de Inteligencia de Negocios (BI).&lt;br /&gt;
&lt;br /&gt;
== Tipos de peticiones ==&lt;br /&gt;
El API sigue los estándares RESTful utilizando los siguientes métodos HTTP:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GET:&#039;&#039;&#039; Recuperar información (ej. listar formularios, consultar carpetas o métricas).&lt;br /&gt;
* &#039;&#039;&#039;POST:&#039;&#039;&#039; Crear nuevos recursos en el sistema o enviar respuestas públicas.&lt;br /&gt;
* &#039;&#039;&#039;PUT:&#039;&#039;&#039; Actualizar recursos existentes, reubicar carpetas o cambiar estados (activo/inactivo).&lt;br /&gt;
* &#039;&#039;&#039;DELETE:&#039;&#039;&#039; Ejecutar eliminaciones lógicas (soft-delete) o físicas de recursos protegidos.&lt;br /&gt;
&lt;br /&gt;
== ¿Cómo funciona? ==&lt;br /&gt;
El ciclo de vida transaccional en SERPI Forms consta de los siguientes pasos:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Configuración y Organización:&#039;&#039;&#039; Se crean &#039;&#039;Categorías&#039;&#039; (con reglas de roles) y &#039;&#039;Carpetas&#039;&#039; para organizar el entorno (Workspace).&lt;br /&gt;
# &#039;&#039;&#039;Diseño del Formulario:&#039;&#039;&#039; Se registra el esquema dinámico JSON que define las preguntas y lógicas del formulario.&lt;br /&gt;
# &#039;&#039;&#039;Distribución:&#039;&#039;&#039; Se generan URLs públicas o se habilitan para consultas en tiempo real durante visitas comerciales (aplicando reglas de frecuencia).&lt;br /&gt;
# &#039;&#039;&#039;Recolección:&#039;&#039;&#039; El encuestado diligencia los datos, impactando el endpoint público que registra la respuesta y orquesta el cobro SaaS (folios).&lt;br /&gt;
# &#039;&#039;&#039;Análisis:&#039;&#039;&#039; Se consultan los indicadores globales y el histórico de respuestas a través de los endpoints de gestión.&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== ⚡ Referencia de Endpoints ==&lt;br /&gt;
&amp;lt;tabber&amp;gt; Categorías y Roles=&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/categories ===&lt;br /&gt;
Devuelve un listado completo de todas las categorías configuradas en el sistema para la empresa del usuario autenticado. Las categorías permiten organizar formularios y establecer políticas de acceso basado en roles (RBAC).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ruta y Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;GET /api/v1/categories&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Respuesta Exitosa (200 OK) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;categoriaId&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;nombre&amp;quot;: &amp;quot;Encuestas de Satisfacción&amp;quot;,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;#3B82F6&amp;quot;,&lt;br /&gt;
    &amp;quot;roleIds&amp;quot;: [101, 102]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Errores posibles:&#039;&#039;&#039; &amp;lt;code&amp;gt;401 Unauthorized&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;403 Forbidden&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/categories ===&lt;br /&gt;
Registra una nueva categoría en el sistema.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ruta y Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;POST /api/v1/categories&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parámetros ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|Body&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Objeto JSON con nombre, color hexadecimal y roleIds.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Payload y Respuesta (201 Created) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;nombre&amp;quot;: &amp;quot;Control de Calidad&amp;quot;,&lt;br /&gt;
  &amp;quot;color&amp;quot;: &amp;quot;#F59E0B&amp;quot;,&lt;br /&gt;
  &amp;quot;roleIds&amp;quot;: [105, 108]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== PUT y DELETE /api/v1/categories/{id} ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PUT:&#039;&#039;&#039; Actualiza las propiedades de una categoría existente. Retorna &amp;lt;code&amp;gt;204 No Content&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;DELETE:&#039;&#039;&#039; Elimina de forma física una categoría (falla si posee carpetas activas). Retorna &amp;lt;code&amp;gt;204 No Content&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/categories/roles ===&lt;br /&gt;
Recupera todos los roles y perfiles configurados en la base de datos maestra del ERP (MvcSERPI) para la empresa actual.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ruta y Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;GET /api/v1/categories/roles&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-| Carpetas y Workspace=&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/folders ===&lt;br /&gt;
Retorna la estructura jerárquica completa de carpetas, subcarpetas y formularios, filtrada automáticamente por los roles del usuario.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ruta y Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;GET /api/v1/folders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Respuesta Exitosa (200 OK) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;folder_10&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;Comercial 2026&amp;quot;,&lt;br /&gt;
    &amp;quot;parentId&amp;quot;: null,&lt;br /&gt;
    &amp;quot;categoriaId&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;#3B82F6&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: [],&lt;br /&gt;
    &amp;quot;forms&amp;quot;: []&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/folders ===&lt;br /&gt;
Crea una nueva carpeta en la raíz o como subcarpeta.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ruta y Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;POST /api/v1/folders&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parámetros ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|Body&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Datos de la carpeta (name, parentId, categoriaId).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PUT y DELETE /api/v1/folders/{id} ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PUT:&#039;&#039;&#039; Renombra o mueve una carpeta existente. Retorna &amp;lt;code&amp;gt;204 No Content&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;DELETE:&#039;&#039;&#039; Borrado lógico en cascada de una carpeta y sus dependencias. Retorna &amp;lt;code&amp;gt;204 No Content&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/folders/{id}/history ===&lt;br /&gt;
Obtiene la bitácora de auditoría histórica de eventos sobre la carpeta (creación, renombramiento, etc).&lt;br /&gt;
&lt;br /&gt;
|-| Formularios Dinámicos=&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/forms ===&lt;br /&gt;
Crea un nuevo formulario dinámico asociando su esquema JSON y retornando un UUID no secuencial para la URL pública.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ruta y Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;POST /api/v1/forms&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parámetros ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|Body&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Payload con nombre, título, descripción, carpetaId y esquemaJson.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Respuesta Exitosa (201 Created) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formId&amp;quot;: 45,&lt;br /&gt;
  &amp;quot;uuid&amp;quot;: &amp;quot;d3b07384-d113-4f4a-a62e-336712345678&amp;quot;,&lt;br /&gt;
  &amp;quot;titulo&amp;quot;: &amp;quot;Encuesta de Satisfacción en Visita&amp;quot;,&lt;br /&gt;
  &amp;quot;urlPublica&amp;quot;: &amp;quot;/f/15/d3b07384-d113-4f4a-a62e-336712345678&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Endpoints de Gestión de Formularios ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PUT /api/v1/forms/{uuid}:&#039;&#039;&#039; Actualiza esquema JSON y detalles.&lt;br /&gt;
* &#039;&#039;&#039;DELETE /api/v1/forms/{uuid}:&#039;&#039;&#039; Borrado lógico (Soft Delete) hacia la papelera.&lt;br /&gt;
* &#039;&#039;&#039;PUT /api/v1/forms/{uuid}/toggle-status:&#039;&#039;&#039; Activa o desactiva el formulario.&lt;br /&gt;
* &#039;&#039;&#039;PUT /api/v1/forms/{uuid}/move?carpetaId={id}:&#039;&#039;&#039; Reubica el formulario en otra carpeta.&lt;br /&gt;
* &#039;&#039;&#039;GET /api/v1/forms/{uuid}/history:&#039;&#039;&#039; Auditoría cronológica de modificaciones.&lt;br /&gt;
* &#039;&#039;&#039;PUT /api/v1/forms/{uuid}/restore:&#039;&#039;&#039; Restaura un formulario desde la papelera.&lt;br /&gt;
&lt;br /&gt;
=== Endpoints de Respuestas y Métricas ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GET /api/v1/forms/stats:&#039;&#039;&#039; Devuelve KPIs globales (respuestasHoy, respuestasTotal, formulariosActivos).&lt;br /&gt;
* &#039;&#039;&#039;GET /api/v1/forms/{formId}/responses:&#039;&#039;&#039; Listado detallado de respuestas (soporta startDate y endDate).&lt;br /&gt;
* &#039;&#039;&#039;GET /api/v1/forms/{formId}/responses/count:&#039;&#039;&#039; Conteo numérico total de respuestas.&lt;br /&gt;
&lt;br /&gt;
=== Disponibilidad y Terceros ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GET /api/v1/forms/surveys/available:&#039;&#039;&#039; Evalúa encuestas disponibles para un tercero, aplicando reglas anti-spam.&lt;br /&gt;
* &#039;&#039;&#039;POST /api/v1/forms/terceros/verificar:&#039;&#039;&#039; Valida registros activos en &amp;lt;code&amp;gt;gdttercero&amp;lt;/code&amp;gt; enviando un arreglo de NITs.&lt;br /&gt;
&lt;br /&gt;
|-| Público, SaaS y Empresa=&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/public/{empresaid}/{uuid} ===&lt;br /&gt;
Devuelve el esquema y diseño público de un formulario para renderizarse en el frontend. (No requiere JWT).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ruta y Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;GET /api/v1/forms/public/{empresaid}/{uuid}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parámetros ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|empresaid&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID de la empresa o 0 para autocompletar.&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID público del formulario.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/forms/public/{empresaid}/{uuid}/responses ===&lt;br /&gt;
Endpoint público para registrar la respuesta de un encuestado. Garantiza inmutabilidad y orquesta el cobro de folio SaaS.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Ruta y Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;POST /api/v1/forms/public/{empresaid}/{uuid}/responses&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Payload Esperado ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;respuestaJson&amp;quot;: &amp;quot;{\&amp;quot;idtercero\&amp;quot;:1502,\&amp;quot;idsucursal\&amp;quot;:1,\&amp;quot;respuestas\&amp;quot;:[{\&amp;quot;pregunta_id\&amp;quot;:\&amp;quot;q1\&amp;quot;,\&amp;quot;valor\&amp;quot;:\&amp;quot;Excelente\&amp;quot;}]}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/billing/process ===&lt;br /&gt;
Orquestación interna SaaS para debitar folios transaccionales (Zero-Trust).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Autenticación:&#039;&#039;&#039; Utiliza el encabezado HTTP &amp;lt;code&amp;gt;X-Secret-Key&amp;lt;/code&amp;gt; en lugar de JWT.&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/companies/logo ===&lt;br /&gt;
Obtiene el logotipo corporativo configurado en la base de datos maestra (retorna Base64 o URL). &amp;lt;/tabber&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jberna</name></author>
	</entry>
	<entry>
		<id>https://www.wikiserpi.com/index.php?title=MediaWiki:Sidebar&amp;diff=1225</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://www.wikiserpi.com/index.php?title=MediaWiki:Sidebar&amp;diff=1225"/>
		<updated>2026-08-21T12:21:36Z</updated>

		<summary type="html">&lt;p&gt;Jberna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** página_principal|Home&lt;br /&gt;
&lt;br /&gt;
*APIs | Integraciones&lt;br /&gt;
&lt;br /&gt;
** API_Modulo_Terceros | Terceros&lt;br /&gt;
** API_Modulo_Articulos_Productos | Artículos / Productos&lt;br /&gt;
** API_Modulo_Inventarios | Inventarios&lt;br /&gt;
** API_Modulo_Documentos_Contables | Documentos Contables&lt;br /&gt;
** API_Modulo_Ventas | Ventas&lt;br /&gt;
** API_Devoluciones_de_Venta | Devoluciones de Venta&lt;br /&gt;
** API_Modulo_Compras | Compras&lt;br /&gt;
** API_Devoluciones_de_Compra| Devolución de Compras &lt;br /&gt;
** API_Modulo_Ensambles_Desensambles | Ensambles - Producción&lt;br /&gt;
** API_BI | BI&lt;br /&gt;
** https://apis.serpi.com.co/index.html | Test de APIs (SWAGGER)&lt;br /&gt;
** API_Modulo_Forms | SERPI-Forms&lt;br /&gt;
&lt;br /&gt;
* Capacitación&lt;br /&gt;
** Configuracion | Configuración&lt;br /&gt;
** Terceros | Terceros &lt;br /&gt;
** Contabilidad | Contabilidad&lt;br /&gt;
** Tesoreria | Tesorería &lt;br /&gt;
** Inventarios | Inventarios&lt;br /&gt;
** Facturacion | Facturación&lt;br /&gt;
** POS | POS&lt;br /&gt;
** Nomina | Nómina&lt;br /&gt;
** Turnos | Turnos&lt;br /&gt;
** Activos-Fijos| Activos Fijos&lt;br /&gt;
** Produccion | Producción &lt;br /&gt;
** SerpiSales| Serpi Sales&lt;br /&gt;
** Portal-Empleados | Portal de Empleados&lt;br /&gt;
** API | API&lt;br /&gt;
&lt;br /&gt;
* Novedades&lt;br /&gt;
** Tickets | Aprende sobre el módulo de Tickets &lt;br /&gt;
** Versiones | Conoce las novedades de la última versión&lt;br /&gt;
** Facturacion_Electronica_Sector_Salud | Facturación Electrónica Sector Salud&lt;/div&gt;</summary>
		<author><name>Jberna</name></author>
	</entry>
	<entry>
		<id>https://www.wikiserpi.com/index.php?title=API_Modulo_Forms&amp;diff=1224</id>
		<title>API Modulo Forms</title>
		<link rel="alternate" type="text/html" href="https://www.wikiserpi.com/index.php?title=API_Modulo_Forms&amp;diff=1224"/>
		<updated>2026-08-21T12:19:51Z</updated>

		<summary type="html">&lt;p&gt;Jberna: v1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= SERPI Forms Core API (v1) =&lt;br /&gt;
&lt;br /&gt;
== Categorías y Roles ==&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/categories ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/categories HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Devuelve un listado completo de todas las categorías configuradas en el sistema para la empresa del usuario autenticado. Las categorías permiten organizar formularios y establecer políticas de aislamiento y acceso basado en roles (RBAC).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Ninguno&#039;&#039;&lt;br /&gt;
|N/A&lt;br /&gt;
|No&lt;br /&gt;
|Este endpoint no requiere parámetros de consulta (Query) ni de ruta (Path).&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;categoriaId&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;nombre&amp;quot;: &amp;quot;Encuestas de Satisfacción&amp;quot;,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;#3B82F6&amp;quot;,&lt;br /&gt;
    &amp;quot;roleIds&amp;quot;: [101, 102]&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;categoriaId&amp;quot;: 2,&lt;br /&gt;
    &amp;quot;nombre&amp;quot;: &amp;quot;Auditorías de Visitas&amp;quot;,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;#10B981&amp;quot;,&lt;br /&gt;
    &amp;quot;roleIds&amp;quot;: []&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Token JWT ausente, expirado o inválido.&lt;br /&gt;
* &#039;&#039;&#039;403 Forbidden&#039;&#039;&#039;: El rol del usuario no tiene permisos para consultar categorías.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/categories/{id} ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/categories/1 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Busca y devuelve los detalles de una categoría específica utilizando su identificador único numérico.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|Identificador único numérico de la categoría a consultar.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;categoriaId&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;nombre&amp;quot;: &amp;quot;Encuestas de Satisfacción&amp;quot;,&lt;br /&gt;
  &amp;quot;color&amp;quot;: &amp;quot;#3B82F6&amp;quot;,&lt;br /&gt;
  &amp;quot;roleIds&amp;quot;: [101, 102]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;403 Forbidden&#039;&#039;&#039;: Permisos insuficientes.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: El ID especificado no corresponde a ninguna categoría activa.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/categories ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/v1/categories HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Registra una nueva categoría en el sistema especificando su nombre, color representativo en formato hexadecimal y de forma opcional los roles permitidos.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Objeto JSON con los datos de creación de la categoría.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;nombre&amp;quot;: &amp;quot;Control de Calidad&amp;quot;,&lt;br /&gt;
  &amp;quot;color&amp;quot;: &amp;quot;#F59E0B&amp;quot;,&lt;br /&gt;
  &amp;quot;roleIds&amp;quot;: [105, 108]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 201 Created):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;categoriaId&amp;quot;: 3,&lt;br /&gt;
  &amp;quot;nombre&amp;quot;: &amp;quot;Control de Calidad&amp;quot;,&lt;br /&gt;
  &amp;quot;color&amp;quot;: &amp;quot;#F59E0B&amp;quot;,&lt;br /&gt;
  &amp;quot;roleIds&amp;quot;: [105, 108]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Error de validación en el payload (nombre vacío o color hexadecimal inválido).&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;403 Forbidden&#039;&#039;&#039;: El perfil del usuario no permite crear categorías.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/categories/{id} ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/v1/categories/3 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Actualiza las propiedades de una categoría existente (nombre, color representativo o lista de roles autorizados).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID numérico de la categoría a actualizar.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Objeto JSON con los nuevos valores de la categoría.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;nombre&amp;quot;: &amp;quot;Control de Calidad y Procesos&amp;quot;,&lt;br /&gt;
  &amp;quot;color&amp;quot;: &amp;quot;#EF4444&amp;quot;,&lt;br /&gt;
  &amp;quot;roleIds&amp;quot;: [105, 108, 110]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Datos de entrada no cumplen los criterios de validación.&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;403 Forbidden&#039;&#039;&#039;: Permisos insuficientes.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Categoría no encontrada.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== DELETE /api/v1/categories/{id} ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /api/v1/categories/3 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Elimina de forma física y permanente una categoría. La operación fallará si la categoría posee carpetas activas para proteger la integridad estructural.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID numérico de la categoría a eliminar.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;403 Forbidden&#039;&#039;&#039;: Permisos insuficientes.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: La categoría no existe o ya fue eliminada.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/categories/roles ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/categories/roles HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Recupera todos los roles y perfiles configurados en la base de datos maestra del ERP (MvcSERPI) para la empresa actual, facilitando la asignación granular de permisos.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Ninguno&#039;&#039;&lt;br /&gt;
|N/A&lt;br /&gt;
|No&lt;br /&gt;
|No requiere parámetros.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;rolId&amp;quot;: 101,&lt;br /&gt;
    &amp;quot;nombre&amp;quot;: &amp;quot;Administrador de Ventas&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;rolId&amp;quot;: 102,&lt;br /&gt;
    &amp;quot;nombre&amp;quot;: &amp;quot;Asesor Comercial&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;403 Forbidden&#039;&#039;&#039;: Sin acceso a configuraciones de seguridad.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Carpetas y Workspace ==&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/folders ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/folders HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Retorna la estructura jerárquica completa de carpetas, subcarpetas y formularios contenidos dentro del Workspace, filtrada de forma automática por los roles del usuario.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Ninguno&#039;&#039;&lt;br /&gt;
|N/A&lt;br /&gt;
|No&lt;br /&gt;
|No requiere parámetros.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;folder_10&amp;quot;,&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;Comercial 2026&amp;quot;,&lt;br /&gt;
    &amp;quot;parentId&amp;quot;: null,&lt;br /&gt;
    &amp;quot;categoriaId&amp;quot;: 1,&lt;br /&gt;
    &amp;quot;color&amp;quot;: &amp;quot;#3B82F6&amp;quot;,&lt;br /&gt;
    &amp;quot;children&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;folder_12&amp;quot;,&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Zonales&amp;quot;,&lt;br /&gt;
        &amp;quot;parentId&amp;quot;: &amp;quot;folder_10&amp;quot;,&lt;br /&gt;
        &amp;quot;categoriaId&amp;quot;: 1,&lt;br /&gt;
        &amp;quot;color&amp;quot;: &amp;quot;#3B82F6&amp;quot;&lt;br /&gt;
      }&lt;br /&gt;
    ],&lt;br /&gt;
    &amp;quot;forms&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;uuid&amp;quot;: &amp;quot;8f3b2a1c-9e4d-4c8a-b5f6-7d8e9f0a1b2c&amp;quot;,&lt;br /&gt;
        &amp;quot;titulo&amp;quot;: &amp;quot;Evaluación de Servicio en Tienda&amp;quot;,&lt;br /&gt;
        &amp;quot;activo&amp;quot;: true&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Se requiere sesión activa.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/folders ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/v1/folders HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Crea una nueva carpeta en la raíz del entorno o como subcarpeta (indicando &amp;lt;code&amp;gt;parentId&amp;lt;/code&amp;gt;). Requiere estar vinculada a una categoría existente.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Datos para la creación de la carpeta.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;Encuestas Region Andina&amp;quot;,&lt;br /&gt;
  &amp;quot;parentId&amp;quot;: &amp;quot;folder_10&amp;quot;,&lt;br /&gt;
  &amp;quot;categoriaId&amp;quot;: 1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 201 Created):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;folder_25&amp;quot;,&lt;br /&gt;
  &amp;quot;name&amp;quot;: &amp;quot;Encuestas Region Andina&amp;quot;,&lt;br /&gt;
  &amp;quot;parentId&amp;quot;: &amp;quot;folder_10&amp;quot;,&lt;br /&gt;
  &amp;quot;categoriaId&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;color&amp;quot;: &amp;quot;#3B82F6&amp;quot;,&lt;br /&gt;
  &amp;quot;children&amp;quot;: [],&lt;br /&gt;
  &amp;quot;forms&amp;quot;: []&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Nombre inválido o categoría inexistente.&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/folders/{id} ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/v1/folders/25 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Renombra o mueve una carpeta existente dentro del árbol del Workspace.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID numérico de la carpeta a modificar.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Datos actualizados de la carpeta.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;nombre&amp;quot;: &amp;quot;Encuestas Región Andina y Centro&amp;quot;,&lt;br /&gt;
  &amp;quot;parentId&amp;quot;: null&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Intento de mover una carpeta dentro de sí misma o nombre nulo.&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Sin sesión activa.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Carpeta no encontrada.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/folders/{id}/history ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/folders/25/history HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Obtiene la bitácora de auditoría histórica de eventos sobre la carpeta especificada (creación, cambio de nombre, movimientos).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID numérico de la carpeta a consultar.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;auditoriaId&amp;quot;: 501,&lt;br /&gt;
    &amp;quot;entidad&amp;quot;: &amp;quot;carpeta&amp;quot;,&lt;br /&gt;
    &amp;quot;entidadId&amp;quot;: &amp;quot;25&amp;quot;,&lt;br /&gt;
    &amp;quot;accion&amp;quot;: &amp;quot;crear&amp;quot;,&lt;br /&gt;
    &amp;quot;detalle&amp;quot;: &amp;quot;Carpeta creada con nombre &#039;Encuestas Region Andina&#039;&amp;quot;,&lt;br /&gt;
    &amp;quot;usuarioId&amp;quot;: 12,&lt;br /&gt;
    &amp;quot;fecha&amp;quot;: &amp;quot;2026-08-21T07:00:00Z&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;auditoriaId&amp;quot;: 508,&lt;br /&gt;
    &amp;quot;entidad&amp;quot;: &amp;quot;carpeta&amp;quot;,&lt;br /&gt;
    &amp;quot;entidadId&amp;quot;: &amp;quot;25&amp;quot;,&lt;br /&gt;
    &amp;quot;accion&amp;quot;: &amp;quot;renombrar&amp;quot;,&lt;br /&gt;
    &amp;quot;detalle&amp;quot;: &amp;quot;Carpeta renombrada a &#039;Encuestas Región Andina y Centro&#039;&amp;quot;,&lt;br /&gt;
    &amp;quot;usuarioId&amp;quot;: 12,&lt;br /&gt;
    &amp;quot;fecha&amp;quot;: &amp;quot;2026-08-21T07:10:00Z&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autorizado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== DELETE /api/v1/folders/{id} ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /api/v1/folders/25 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Realiza un borrado lógico en cascada de una carpeta y de todas sus subcarpetas y formularios dependientes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID de la carpeta a eliminar.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Error en el proceso de eliminación lógica.&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autorizado.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Carpeta no encontrada.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Formularios Dinámicos ==&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/forms ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/v1/forms HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Crea un nuevo formulario dinámico asociando su esquema JSON y retornando un UUID no secuencial para la URL pública.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Datos requeridos para la plantilla de formulario.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;nombre&amp;quot;: &amp;quot;Encuesta Visita Cliente&amp;quot;,&lt;br /&gt;
  &amp;quot;titulo&amp;quot;: &amp;quot;Encuesta de Satisfacción en Visita&amp;quot;,&lt;br /&gt;
  &amp;quot;descripcion&amp;quot;: &amp;quot;Formulario diligenciado en visitas comerciales.&amp;quot;,&lt;br /&gt;
  &amp;quot;carpetaId&amp;quot;: 25,&lt;br /&gt;
  &amp;quot;esquemaJson&amp;quot;: &amp;quot;{\&amp;quot;settings\&amp;quot;:{\&amp;quot;contexto\&amp;quot;:\&amp;quot;Cliente\&amp;quot;,\&amp;quot;repeatFrequency\&amp;quot;:\&amp;quot;1w\&amp;quot;},\&amp;quot;components\&amp;quot;:[]}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 201 Created):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;formId&amp;quot;: 45,&lt;br /&gt;
  &amp;quot;uuid&amp;quot;: &amp;quot;d3b07384-d113-4f4a-a62e-336712345678&amp;quot;,&lt;br /&gt;
  &amp;quot;titulo&amp;quot;: &amp;quot;Encuesta de Satisfacción en Visita&amp;quot;,&lt;br /&gt;
  &amp;quot;urlPublica&amp;quot;: &amp;quot;/f/15/d3b07384-d113-4f4a-a62e-336712345678&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Esquema JSON o campos obligatorios faltantes/mal formateados.&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/forms/{uuid} ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/v1/forms/d3b07384-d113-4f4a-a62e-336712345678 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Actualiza el título, descripción y estructura de preguntas (Esquema JSON) de un formulario existente.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID del formulario a actualizar.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Datos actualizados del formulario.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;nombre&amp;quot;: &amp;quot;Encuesta Visita Cliente v2&amp;quot;,&lt;br /&gt;
  &amp;quot;titulo&amp;quot;: &amp;quot;Encuesta de Satisfacción Comercial v2&amp;quot;,&lt;br /&gt;
  &amp;quot;descripcion&amp;quot;: &amp;quot;Formulario actualizado para atención a clientes.&amp;quot;,&lt;br /&gt;
  &amp;quot;esquemaJson&amp;quot;: &amp;quot;{\&amp;quot;settings\&amp;quot;:{\&amp;quot;contexto\&amp;quot;:\&amp;quot;Cliente\&amp;quot;,\&amp;quot;repeatFrequency\&amp;quot;:\&amp;quot;1d\&amp;quot;},\&amp;quot;components\&amp;quot;:[]}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Errores estructurales en el JSON enviado.&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Formulario no encontrado por el UUID.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== DELETE /api/v1/forms/{uuid} ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
DELETE /api/v1/forms/d3b07384-d113-4f4a-a62e-336712345678 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Ejecuta un borrado lógico (Soft Delete) del formulario, desactivándolo y moviéndolo a la papelera sin perder respuestas históricas. Requiere estar apagado previamente.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID del formulario a enviar a la papelera.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: El formulario está Activo. Debe desactivarse antes de eliminarse.&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Formulario inexistente.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/forms/{uuid}/toggle-status ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/v1/forms/d3b07384-d113-4f4a-a62e-336712345678/toggle-status HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Alterna el estado de un formulario entre Activo (disponible públicamente) e Inactivo (bloquea la recepción de respuestas).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID del formulario a modificar.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Indicador de estado (&amp;lt;code&amp;gt;activo&amp;lt;/code&amp;gt;: true/false).&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;activo&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Sin autorización.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Formulario no encontrado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/forms/{uuid}/move ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/v1/forms/d3b07384-d113-4f4a-a62e-336712345678/move?carpetaId=25 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Reubica un formulario en otra carpeta contenedora o en la raíz del Workspace (si se omite el parámetro &amp;lt;code&amp;gt;carpetaId&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID del formulario a mover.&lt;br /&gt;
|-&lt;br /&gt;
|carpetaId&lt;br /&gt;
|Integer&lt;br /&gt;
|No (Query)&lt;br /&gt;
|ID de la carpeta destino (omitir para mover a la raíz).&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Formulario o carpeta destino no encontrados.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/{uuid}/history ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/forms/d3b07384-d113-4f4a-a62e-336712345678/history HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Retorna el historial cronológico de auditoría con todas las modificaciones realizadas sobre el formulario.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID del formulario.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;auditoriaId&amp;quot;: 801,&lt;br /&gt;
    &amp;quot;entidad&amp;quot;: &amp;quot;formulario&amp;quot;,&lt;br /&gt;
    &amp;quot;entidadId&amp;quot;: &amp;quot;d3b07384-d113-4f4a-a62e-336712345678&amp;quot;,&lt;br /&gt;
    &amp;quot;accion&amp;quot;: &amp;quot;crear&amp;quot;,&lt;br /&gt;
    &amp;quot;detalle&amp;quot;: &amp;quot;Formulario creado con título &#039;Encuesta de Satisfacción en Visita&#039;&amp;quot;,&lt;br /&gt;
    &amp;quot;usuarioId&amp;quot;: 5,&lt;br /&gt;
    &amp;quot;fecha&amp;quot;: &amp;quot;2026-08-21T06:30:00Z&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Token inválido.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/stats ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/forms/stats HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Calcula y devuelve los indicadores clave (KPIs) globales del Workspace para la empresa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Ninguno&#039;&#039;&lt;br /&gt;
|N/A&lt;br /&gt;
|No&lt;br /&gt;
|No requiere parámetros.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;respuestasHoy&amp;quot;: 142,&lt;br /&gt;
  &amp;quot;respuestasTotal&amp;quot;: 12850,&lt;br /&gt;
  &amp;quot;formulariosActivos&amp;quot;: 18&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/{formId}/responses ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/forms/45/responses?startDate=2026-08-01T00:00:00Z&amp;amp;endDate=2026-08-21T23:59:59Z HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Recupera el listado detallado de respuestas capturadas para un formulario específico dentro de un rango de fechas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|formId&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID numérico interno del formulario.&lt;br /&gt;
|-&lt;br /&gt;
|startDate&lt;br /&gt;
|DateTime&lt;br /&gt;
|No (Query)&lt;br /&gt;
|Fecha inicial para filtrar respuestas.&lt;br /&gt;
|-&lt;br /&gt;
|endDate&lt;br /&gt;
|DateTime&lt;br /&gt;
|No (Query)&lt;br /&gt;
|Fecha final para filtrar respuestas.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;respuestaId&amp;quot;: 1024,&lt;br /&gt;
    &amp;quot;formId&amp;quot;: 45,&lt;br /&gt;
    &amp;quot;fechaEnvio&amp;quot;: &amp;quot;2026-08-21T07:05:00Z&amp;quot;,&lt;br /&gt;
    &amp;quot;ipOrigen&amp;quot;: &amp;quot;190.150.10.5&amp;quot;,&lt;br /&gt;
    &amp;quot;payloadJson&amp;quot;: &amp;quot;{\&amp;quot;idtercero\&amp;quot;:1502,\&amp;quot;idsucursal\&amp;quot;:1,\&amp;quot;respuestas\&amp;quot;:[{\&amp;quot;pregunta_id\&amp;quot;:\&amp;quot;q1\&amp;quot;,\&amp;quot;valor\&amp;quot;:\&amp;quot;Excelente\&amp;quot;}]}&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autorizado.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Formulario no encontrado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/{formId}/responses/count ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/forms/45/responses/count HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Retorna el conteo total numérico de respuestas acumuladas por un formulario.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|formId&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID numérico interno del formulario.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
1024&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autorizado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/trash ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/forms/trash HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Devuelve el listado de formularios que se encuentran actualmente desactivados en la papelera de reciclaje.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Ninguno&#039;&#039;&lt;br /&gt;
|N/A&lt;br /&gt;
|No&lt;br /&gt;
|No requiere parámetros.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;formId&amp;quot;: 32,&lt;br /&gt;
    &amp;quot;uuid&amp;quot;: &amp;quot;a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d&amp;quot;,&lt;br /&gt;
    &amp;quot;nombre&amp;quot;: &amp;quot;Encuesta Prueba Papelera&amp;quot;,&lt;br /&gt;
    &amp;quot;titulo&amp;quot;: &amp;quot;Prueba de Concepto Antigua&amp;quot;,&lt;br /&gt;
    &amp;quot;activo&amp;quot;: false,&lt;br /&gt;
    &amp;quot;fechaEliminacion&amp;quot;: &amp;quot;2026-08-15T10:00:00Z&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== PUT /api/v1/forms/{uuid}/restore ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
PUT /api/v1/forms/a1b2c3d4-e5f6-7a8b-9c0d-1e2f3a4b5c6d/restore HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Restaura un formulario de la papelera, reintegrándolo a la lista activa y reactivando la recepción de respuestas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID del formulario a restaurar.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 204 No Content):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
HTTP/1.1 204 No Content&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: No autenticado.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: El formulario no existe en la papelera.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/surveys/available ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/forms/surveys/available?contextos=Cliente,Proveedor&amp;amp;nittercero=900123456&amp;amp;usuarioid=10 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Evalúa la disponibilidad de encuestas para un tercero o usuario en tiempo real en el ERP durante una visita comercial, aplicando reglas anti-spam y ventanas de frecuencia (&amp;lt;code&amp;gt;repeatFrequency&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;repeatDays&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|contextos&lt;br /&gt;
|String&lt;br /&gt;
|No (Query)&lt;br /&gt;
|Lista de contextos separados por coma (ej. &#039;Cliente,Proveedor,Visita&#039;).&lt;br /&gt;
|-&lt;br /&gt;
|nittercero&lt;br /&gt;
|String&lt;br /&gt;
|No (Query)&lt;br /&gt;
|NIT o cédula del tercero visitado para evaluar ventanas de tiempo.&lt;br /&gt;
|-&lt;br /&gt;
|usuarioid&lt;br /&gt;
|Integer&lt;br /&gt;
|No (Query)&lt;br /&gt;
|ID del usuario o asesor que realiza la atención.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;formId&amp;quot;: 45,&lt;br /&gt;
    &amp;quot;uuid&amp;quot;: &amp;quot;d3b07384-d113-4f4a-a62e-336712345678&amp;quot;,&lt;br /&gt;
    &amp;quot;nombre&amp;quot;: &amp;quot;Encuesta Visita Cliente&amp;quot;,&lt;br /&gt;
    &amp;quot;titulo&amp;quot;: &amp;quot;Encuesta de Satisfacción en Visita&amp;quot;,&lt;br /&gt;
    &amp;quot;contexto&amp;quot;: &amp;quot;Cliente&amp;quot;,&lt;br /&gt;
    &amp;quot;repeatFrequency&amp;quot;: &amp;quot;1w&amp;quot;,&lt;br /&gt;
    &amp;quot;repeatDays&amp;quot;: 7,&lt;br /&gt;
    &amp;quot;ultimaRespuestaFecha&amp;quot;: &amp;quot;2026-08-10T14:20:00Z&amp;quot;,&lt;br /&gt;
    &amp;quot;permiteResponder&amp;quot;: true,&lt;br /&gt;
    &amp;quot;publicUrl&amp;quot;: &amp;quot;/f/15/d3b07384-d113-4f4a-a62e-336712345678&amp;quot;,&lt;br /&gt;
    &amp;quot;encuestaDeVisita&amp;quot;: true&lt;br /&gt;
  }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Sin autenticación válida de la empresa.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/forms/terceros/verificar ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/v1/forms/terceros/verificar?empresaid=15 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Recibe una lista de NITs o cédulas y valida cuáles de ellos tienen registros activos en la tabla &amp;lt;code&amp;gt;gdttercero&amp;lt;/code&amp;gt; de la empresa.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|empresaid&lt;br /&gt;
|Integer&lt;br /&gt;
|No (Query)&lt;br /&gt;
|ID de la empresa (si se omite, se usa el del token JWT).&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Array&lt;br /&gt;
|Sí&lt;br /&gt;
|Arreglo de strings con los NITs a consultar.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
  &amp;quot;900123456&amp;quot;,&lt;br /&gt;
  &amp;quot;800987654&amp;quot;,&lt;br /&gt;
  &amp;quot;1098765432&amp;quot;&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;900123456&amp;quot;: 1502,&lt;br /&gt;
  &amp;quot;800987654&amp;quot;: 1509&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Sin sesión activa.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/forms/public/{empresaid}/{uuid} ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/forms/public/15/d3b07384-d113-4f4a-a62e-336712345678 HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Devuelve el esquema y diseño público de un formulario para renderizarse en el frontend. Endpoint de acceso público sin requerir token JWT.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|empresaid&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID de la empresa o 0 para resolver automáticamente por UUID.&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID público del formulario a consultar.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;titulo&amp;quot;: &amp;quot;Encuesta de Satisfacción en Visita&amp;quot;,&lt;br /&gt;
  &amp;quot;descripcion&amp;quot;: &amp;quot;Por favor responda las siguientes preguntas&amp;quot;,&lt;br /&gt;
  &amp;quot;esquemaJson&amp;quot;: &amp;quot;{\&amp;quot;branding\&amp;quot;:{\&amp;quot;theme\&amp;quot;:\&amp;quot;light\&amp;quot;},\&amp;quot;components\&amp;quot;:[{\&amp;quot;id\&amp;quot;:\&amp;quot;q1\&amp;quot;,\&amp;quot;type\&amp;quot;:\&amp;quot;radio\&amp;quot;,\&amp;quot;label\&amp;quot;:\&amp;quot;¿Cómo fue la atención?\&amp;quot;}]}&amp;quot;,&lt;br /&gt;
  &amp;quot;requiereSesionOnline&amp;quot;: false,&lt;br /&gt;
  &amp;quot;sesionValida&amp;quot;: false,&lt;br /&gt;
  &amp;quot;usuarioIdentificador&amp;quot;: null,&lt;br /&gt;
  &amp;quot;defaultCompanyLogo&amp;quot;: &amp;quot;https://cdn.serpi.com.co/logos/empresa15.png&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Formulario inactivo o UUID inexistente.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/forms/public/{empresaid}/{uuid}/responses ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/v1/forms/public/15/d3b07384-d113-4f4a-a62e-336712345678/responses HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Endpoint público para registrar la respuesta diligenciada por un encuestado. Garantiza inmutabilidad, captura la IP de origen y efectúa el cobro de folio SaaS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|empresaid&lt;br /&gt;
|Integer&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|ID de la empresa receptora.&lt;br /&gt;
|-&lt;br /&gt;
|uuid&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Path)&lt;br /&gt;
|UUID del formulario a responder.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Payload JSON con la estructura de respuestas en arreglo plano.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;respuestaJson&amp;quot;: &amp;quot;{\&amp;quot;idtercero\&amp;quot;:1502,\&amp;quot;idsucursal\&amp;quot;:1,\&amp;quot;respuestas\&amp;quot;:[{\&amp;quot;pregunta_id\&amp;quot;:\&amp;quot;q1\&amp;quot;,\&amp;quot;tipo\&amp;quot;:\&amp;quot;radio\&amp;quot;,\&amp;quot;valor\&amp;quot;:\&amp;quot;Excelente\&amp;quot;}]}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;respId&amp;quot;: 2048,&lt;br /&gt;
  &amp;quot;billing_error&amp;quot;: null&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Formato JSON inválido o estructura no cumple con el esquema plano &amp;lt;code&amp;gt;respuestas&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;404 Not Found&#039;&#039;&#039;: Formulario inactivo o no encontrado.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== SaaS Billing ==&lt;br /&gt;
&lt;br /&gt;
=== POST /api/v1/billing/process ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
POST /api/v1/billing/process HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
X-Secret-Key: Serpi-Dev-SaaS-Key-2026!&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Endpoint de orquestación interna SaaS para debitar folios transaccionales (Zero-Trust). No utiliza JWT, sino el encabezado HTTP &amp;lt;code&amp;gt;X-Secret-Key&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|X-Secret-Key&lt;br /&gt;
|String&lt;br /&gt;
|Sí (Header)&lt;br /&gt;
|Clave secreta enviada en la cabecera HTTP.&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Body&#039;&#039;&lt;br /&gt;
|Object&lt;br /&gt;
|Sí&lt;br /&gt;
|Datos del consumo de folio SaaS.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Payload / Body:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;empresaId&amp;quot;: 15,&lt;br /&gt;
  &amp;quot;gdtProductoFolioId&amp;quot;: 8,&lt;br /&gt;
  &amp;quot;referencia&amp;quot;: &amp;quot;2048&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;message&amp;quot;: &amp;quot;Cobro de folio registrado correctamente.&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;400 Bad Request&#039;&#039;&#039;: Configuración de pricing no encontrada o inactiva para la empresa.&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Header &amp;lt;code&amp;gt;X-Secret-Key&amp;lt;/code&amp;gt; ausente o incorrecto.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Empresa ==&lt;br /&gt;
&lt;br /&gt;
=== GET /api/v1/companies/logo ===&lt;br /&gt;
&#039;&#039;&#039;Ruta y Método HTTP:&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
GET /api/v1/companies/logo HTTP/1.1&lt;br /&gt;
Host: api.serpi.com.co&lt;br /&gt;
Authorization: Bearer &amp;lt;TOKEN_JWT&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Descripción:&#039;&#039;&#039; Obtiene el logotipo corporativo configurado en la base de datos maestra para la empresa del usuario autenticado (retornado en Base64 o URL).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parámetros esperados:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Nombre del Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;Ninguno&#039;&#039;&lt;br /&gt;
|N/A&lt;br /&gt;
|No&lt;br /&gt;
|No requiere parámetros.&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&#039;Ejemplo de Respuesta Exitosa (Código 200 OK):&#039;&#039;&#039;&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;logo&amp;quot;: &amp;quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&#039;&#039;&#039;Códigos de Error Posibles:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;401 Unauthorized&#039;&#039;&#039;: Requiere sesión activa.&lt;/div&gt;</summary>
		<author><name>Jberna</name></author>
	</entry>
	<entry>
		<id>https://www.wikiserpi.com/index.php?title=API_Modulo_Forms&amp;diff=1223</id>
		<title>API Modulo Forms</title>
		<link rel="alternate" type="text/html" href="https://www.wikiserpi.com/index.php?title=API_Modulo_Forms&amp;diff=1223"/>
		<updated>2026-08-21T12:09:39Z</updated>

		<summary type="html">&lt;p&gt;Jberna: Página creada con « = API Módulo Forms =  == Introducción == El API del Módulo Forms permite la consulta, creación y gestión de los formularios dentro del sistema.  * &amp;#039;&amp;#039;&amp;#039;URL Base:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;https://api.tudominio.com/v1/&amp;lt;/code&amp;gt; * &amp;#039;&amp;#039;&amp;#039;Formato de respuesta:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt;  == Autenticación == Todas las peticiones a los endpoints protegidos deben incluir un token JWT en las cabeceras (headers) de la petición.&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;  Authorization: Bearer TU_TOKEN_AQUI  &amp;lt;/source&amp;gt;---…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
= API Módulo Forms =&lt;br /&gt;
&lt;br /&gt;
== Introducción ==&lt;br /&gt;
El API del Módulo Forms permite la consulta, creación y gestión de los formularios dentro del sistema.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;URL Base:&#039;&#039;&#039; &amp;lt;code&amp;gt;https://api.tudominio.com/v1/&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Formato de respuesta:&#039;&#039;&#039; &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Autenticación ==&lt;br /&gt;
Todas las peticiones a los endpoints protegidos deben incluir un token JWT en las cabeceras (headers) de la petición.&amp;lt;source lang=&amp;quot;http&amp;quot;&amp;gt;&lt;br /&gt;
Authorization: Bearer TU_TOKEN_AQUI&lt;br /&gt;
&amp;lt;/source&amp;gt;---&lt;br /&gt;
&lt;br /&gt;
== Endpoints ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Obtener lista de formularios ===&lt;br /&gt;
Retorna una lista paginada de los formularios disponibles.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Endpoint:&#039;&#039;&#039; &amp;lt;code&amp;gt;/forms&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;GET&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parámetros de Consulta (Query Params) ====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Parámetro&lt;br /&gt;
!Tipo&lt;br /&gt;
!Obligatorio&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|limit&lt;br /&gt;
|Integer&lt;br /&gt;
|No&lt;br /&gt;
|Cantidad máxima de registros a devolver (por defecto: 20).&lt;br /&gt;
|-&lt;br /&gt;
|status&lt;br /&gt;
|String&lt;br /&gt;
|No&lt;br /&gt;
|Filtra por estado (ej. &amp;lt;code&amp;gt;active&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;archived&amp;lt;/code&amp;gt;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Respuesta Exitosa ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Código:&#039;&#039;&#039; &amp;lt;code&amp;gt;200 OK&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cuerpo:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;success&amp;quot;: true,&lt;br /&gt;
  &amp;quot;data&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;_id&amp;quot;: &amp;quot;60d5ecb8b392d7&amp;quot;,&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;Inspección de Calidad&amp;quot;,&lt;br /&gt;
      &amp;quot;createdAt&amp;quot;: &amp;quot;2026-08-21T10:00:00Z&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Crear un nuevo formulario ===&lt;br /&gt;
Permite registrar la estructura de un nuevo formulario.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Endpoint:&#039;&#039;&#039; &amp;lt;code&amp;gt;/forms&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Método:&#039;&#039;&#039; &amp;lt;code&amp;gt;POST&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cuerpo de la Petición (Payload) ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;title&amp;quot;: &amp;quot;Formulario de Novedades&amp;quot;,&lt;br /&gt;
  &amp;quot;fields&amp;quot;: [&amp;quot;empleado_id&amp;quot;, &amp;quot;fecha&amp;quot;, &amp;quot;descripcion&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Respuesta Exitosa ====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Código:&#039;&#039;&#039; &amp;lt;code&amp;gt;201 Created&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Códigos de Error Frecuentes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Código HTTP&lt;br /&gt;
!Mensaje&lt;br /&gt;
!Descripción&lt;br /&gt;
|-&lt;br /&gt;
|400&lt;br /&gt;
|Bad Request&lt;br /&gt;
|La petición está mal formada o faltan campos obligatorios.&lt;br /&gt;
|-&lt;br /&gt;
|401&lt;br /&gt;
|Unauthorized&lt;br /&gt;
|El token de acceso es inválido o ha expirado.&lt;br /&gt;
|-&lt;br /&gt;
|500&lt;br /&gt;
|Internal Server Error&lt;br /&gt;
|Error interno en el servidor de la aplicación.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jberna</name></author>
	</entry>
	<entry>
		<id>https://www.wikiserpi.com/index.php?title=MediaWiki:Sidebar&amp;diff=1222</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://www.wikiserpi.com/index.php?title=MediaWiki:Sidebar&amp;diff=1222"/>
		<updated>2026-08-21T12:04:55Z</updated>

		<summary type="html">&lt;p&gt;Jberna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** página_principal|Home&lt;br /&gt;
&lt;br /&gt;
*APIs | Integraciones&lt;br /&gt;
&lt;br /&gt;
** API_Modulo_Terceros | Terceros&lt;br /&gt;
** API_Modulo_Articulos_Productos | Artículos / Productos&lt;br /&gt;
** API_Modulo_Inventarios | Inventarios&lt;br /&gt;
** API_Modulo_Documentos_Contables | Documentos Contables&lt;br /&gt;
** API_Modulo_Ventas | Ventas&lt;br /&gt;
** API_Devoluciones_de_Venta | Devoluciones de Venta&lt;br /&gt;
** API_Modulo_Compras | Compras&lt;br /&gt;
** API_Devoluciones_de_Compra| Devolución de Compras &lt;br /&gt;
** API_Modulo_Ensambles_Desensambles | Ensambles - Producción&lt;br /&gt;
** API_BI | BI&lt;br /&gt;
** https://apis.serpi.com.co/swagger/index.html | Test de APIs (SWAGGER)&lt;br /&gt;
** API_Modulo_Forms | SERPI-Forms&lt;br /&gt;
&lt;br /&gt;
* Capacitación&lt;br /&gt;
** Configuracion | Configuración&lt;br /&gt;
** Terceros | Terceros &lt;br /&gt;
** Contabilidad | Contabilidad&lt;br /&gt;
** Tesoreria | Tesorería &lt;br /&gt;
** Inventarios | Inventarios&lt;br /&gt;
** Facturacion | Facturación&lt;br /&gt;
** POS | POS&lt;br /&gt;
** Nomina | Nómina&lt;br /&gt;
** Turnos | Turnos&lt;br /&gt;
** Activos-Fijos| Activos Fijos&lt;br /&gt;
** Produccion | Producción &lt;br /&gt;
** SerpiSales| Serpi Sales&lt;br /&gt;
** Portal-Empleados | Portal de Empleados&lt;br /&gt;
** API | API&lt;br /&gt;
&lt;br /&gt;
* Novedades&lt;br /&gt;
** Tickets | Aprende sobre el módulo de Tickets &lt;br /&gt;
** Versiones | Conoce las novedades de la última versión&lt;br /&gt;
** Facturacion_Electronica_Sector_Salud | Facturación Electrónica Sector Salud&lt;/div&gt;</summary>
		<author><name>Jberna</name></author>
	</entry>
</feed>