{"openapi":"3.1.0","info":{"title":"API de herramientas de excelempowers","description":"Herramientas para archivos Excel y CSV, invocables por HTTP y por MCP. Los archivos se procesan en memoria y no se guardan.","version":"1.0.0","x-documentation":"https://excelempowers.com/es/api"},"servers":[{"url":"https://excelempowers.com"}],"security":[{},{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","description":"Clave de API opcional. Sin ella se aplica el l\u00EDmite an\u00F3nimo."}},"schemas":{"RunResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"tool":{"type":"string"},"files":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"contentType":{"type":"string"},"size":{"type":"integer"},"contentBase64":{"type":"string","contentEncoding":"base64"}}}},"preview":{"type":["object","null"],"description":"Muestra del resultado en forma de tabla. Permite comprobar la transformaci\u00F3n sin decodificar el archivo."},"textPreview":{"type":["string","null"]},"messages":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string"},"text":{"type":"string"}}}}}},"Error":{"type":"object","properties":{"ok":{"type":"boolean"},"error":{"type":"string","description":"C\u00F3digo estable del error. Es lo que debe mirar un cliente; el mensaje est\u00E1 traducido y puede cambiar."},"message":{"type":"string"},"option":{"type":["string","null"]}}}}},"paths":{"/api/v1/tools":{"get":{"operationId":"list_tools","summary":"Cat\u00E1logo de herramientas con el esquema de opciones de cada una.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["es","en"],"default":"es"},"description":"Idioma de los mensajes y de los nombres de archivo generados."}],"responses":{"200":{"description":"Cat\u00E1logo de herramientas con el esquema de opciones de cada una.","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}}}},"/api/v1/tools/merge-stack/run":{"post":{"operationId":"run_merge_stack","summary":"Combinar Excel apilando filas","description":"Junta varios archivos Excel o CSV en uno solo, poniendo las filas de cada uno debajo de las anteriores. Sube entre 2 y 20 archivos con la misma estructura y descarga una \u00FAnica tabla con todas sus filas, una debajo de otra.","tags":["Combinar y dividir"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false},"minItems":2,"maxItems":20,"description":"Archivos de entrada, hasta 20. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Tiene que cumplirse en todos los archivos que subas.","default":true},"match-by-name":{"type":"boolean","description":"Emparejar las columnas por su nombre. Recomendado: cada columna cae en su sitio aunque los archivos las tengan en distinto orden. Si lo desactivas se combina por posici\u00F3n, y un archivo desordenado mezclar\u00EDa datos de columnas distintas.","default":true},"add-source-column":{"type":"boolean","description":"A\u00F1adir una columna con el archivo de origen. Es lo que permite saber de qu\u00E9 archivo sali\u00F3 cada fila una vez combinado todo.","default":true},"source-column-name":{"type":"string","description":"T\u00EDtulo de esa columna. Si lo dejas vac\u00EDo se usa \u00ABArchivo de origen\u00BB."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files"],"description":"Junta varios archivos Excel o CSV en uno solo, poniendo las filas de cada uno debajo de las anteriores. Sube entre 2 y 20 archivos con la misma estructura y descarga una \u00FAnica tabla con todas sus filas, una debajo de otra."}},"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"description":"Archivos de entrada, hasta 20. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Tiene que cumplirse en todos los archivos que subas.","default":true},"match-by-name":{"type":"boolean","description":"Emparejar las columnas por su nombre. Recomendado: cada columna cae en su sitio aunque los archivos las tengan en distinto orden. Si lo desactivas se combina por posici\u00F3n, y un archivo desordenado mezclar\u00EDa datos de columnas distintas.","default":true},"add-source-column":{"type":"boolean","description":"A\u00F1adir una columna con el archivo de origen. Es lo que permite saber de qu\u00E9 archivo sali\u00F3 cada fila una vez combinado todo.","default":true},"source-column-name":{"type":"string","description":"T\u00EDtulo de esa columna. Si lo dejas vac\u00EDo se usa \u00ABArchivo de origen\u00BB."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files"],"description":"Junta varios archivos Excel o CSV en uno solo, poniendo las filas de cada uno debajo de las anteriores. Sube entre 2 y 20 archivos con la misma estructura y descarga una \u00FAnica tabla con todas sus filas, una debajo de otra."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/merge-sheets/run":{"post":{"operationId":"run_merge_sheets","summary":"Combinar Excel por hojas","description":"Junta varios archivos en un solo libro, dejando cada archivo original como una hoja distinta. Sube entre 2 y 20 archivos y descarga un solo libro en el que cada archivo es una pesta\u00F1a distinta.","tags":["Combinar y dividir"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false},"minItems":2,"maxItems":20,"description":"Archivos de entrada, hasta 20. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"keep-original-sheet-names":{"type":"boolean","description":"Conservar los nombres de hoja originales. Por defecto cada hoja toma el nombre de su archivo, que identifica el origen mucho mejor que \u00ABHoja1\u00BB.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files"],"description":"Junta varios archivos en un solo libro, dejando cada archivo original como una hoja distinta. Sube entre 2 y 20 archivos y descarga un solo libro en el que cada archivo es una pesta\u00F1a distinta."}},"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"description":"Archivos de entrada, hasta 20. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"keep-original-sheet-names":{"type":"boolean","description":"Conservar los nombres de hoja originales. Por defecto cada hoja toma el nombre de su archivo, que identifica el origen mucho mejor que \u00ABHoja1\u00BB.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files"],"description":"Junta varios archivos en un solo libro, dejando cada archivo original como una hoja distinta. Sube entre 2 y 20 archivos y descarga un solo libro en el que cada archivo es una pesta\u00F1a distinta."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/flatten-sheets/run":{"post":{"operationId":"run_flatten_sheets","summary":"Unir todas las hojas de un Excel","description":"Combina todas las hojas de un libro en una sola tabla continua. Sube un libro con varias pesta\u00F1as y desc\u00E1rgalo convertido en una \u00FAnica tabla, con todas las filas seguidas.","tags":["Combinar y dividir"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls."},"has-header":{"type":"boolean","description":"La primera fila de cada hoja son los t\u00EDtulos.","default":true},"add-sheet-column":{"type":"boolean","description":"A\u00F1adir una columna con el nombre de la hoja. Recomendado: sin ella se pierde de qu\u00E9 pesta\u00F1a ven\u00EDa cada fila, que suele ser el mes o la sucursal.","default":true},"sheet-column-name":{"type":"string","description":"T\u00EDtulo de esa columna. Si lo dejas vac\u00EDo se usa \u00ABHoja\u00BB."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Combina todas las hojas de un libro en una sola tabla continua. Sube un libro con varias pesta\u00F1as y desc\u00E1rgalo convertido en una \u00FAnica tabla, con todas las filas seguidas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls."},"has-header":{"type":"boolean","description":"La primera fila de cada hoja son los t\u00EDtulos.","default":true},"add-sheet-column":{"type":"boolean","description":"A\u00F1adir una columna con el nombre de la hoja. Recomendado: sin ella se pierde de qu\u00E9 pesta\u00F1a ven\u00EDa cada fila, que suele ser el mes o la sucursal.","default":true},"sheet-column-name":{"type":"string","description":"T\u00EDtulo de esa columna. Si lo dejas vac\u00EDo se usa \u00ABHoja\u00BB."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Combina todas las hojas de un libro en una sola tabla continua. Sube un libro con varias pesta\u00F1as y desc\u00E1rgalo convertido en una \u00FAnica tabla, con todas las filas seguidas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/split-sheets/run":{"post":{"operationId":"run_split_sheets","summary":"Dividir un Excel por hojas","description":"Convierte un libro de varias hojas en un archivo independiente por cada hoja. Sube un libro con varias hojas y descarga un archivo independiente por cada una, empaquetados en un ZIP.","tags":["Combinar y dividir"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"format":{"type":"string","description":"Formato de los archivos. Como sale m\u00E1s de un archivo, la descarga viene en un ZIP.","enum":["xlsx","csv"],"default":"xlsx"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un libro de varias hojas en un archivo independiente por cada hoja. Sube un libro con varias hojas y descarga un archivo independiente por cada una, empaquetados en un ZIP."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"format":{"type":"string","description":"Formato de los archivos. Como sale m\u00E1s de un archivo, la descarga viene en un ZIP.","enum":["xlsx","csv"],"default":"xlsx"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un libro de varias hojas en un archivo independiente por cada hoja. Sube un libro con varias hojas y descarga un archivo independiente por cada una, empaquetados en un ZIP."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/split-rows/run":{"post":{"operationId":"run_split_rows","summary":"Dividir un Excel por cantidad de filas","description":"Parte una planilla grande en varios archivos de N filas cada uno. Indica cu\u00E1ntas filas quieres en cada archivo y descarga la tabla partida en trozos, con la cabecera repetida en todos.","tags":["Combinar y dividir"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"rows-per-file":{"type":"integer","description":"Filas por archivo. Sin contar los t\u00EDtulos. El \u00FAltimo archivo lleva las que sobren.","minimum":1,"maximum":1000000,"default":1000},"repeat-header":{"type":"boolean","description":"Repetir los t\u00EDtulos en cada archivo. Recomendado: sin ellos, todos los archivos menos el primero llegan sin nombres de columna y no sirven para nada.","default":true},"format":{"type":"string","description":"Formato de los archivos. Como sale m\u00E1s de un archivo, la descarga viene en un ZIP.","enum":["xlsx","csv"],"default":"xlsx"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","rows-per-file"],"description":"Parte una planilla grande en varios archivos de N filas cada uno. Indica cu\u00E1ntas filas quieres en cada archivo y descarga la tabla partida en trozos, con la cabecera repetida en todos."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"rows-per-file":{"type":"integer","description":"Filas por archivo. Sin contar los t\u00EDtulos. El \u00FAltimo archivo lleva las que sobren.","minimum":1,"maximum":1000000,"default":1000},"repeat-header":{"type":"boolean","description":"Repetir los t\u00EDtulos en cada archivo. Recomendado: sin ellos, todos los archivos menos el primero llegan sin nombres de columna y no sirven para nada.","default":true},"format":{"type":"string","description":"Formato de los archivos. Como sale m\u00E1s de un archivo, la descarga viene en un ZIP.","enum":["xlsx","csv"],"default":"xlsx"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","rows-per-file"],"description":"Parte una planilla grande en varios archivos de N filas cada uno. Indica cu\u00E1ntas filas quieres en cada archivo y descarga la tabla partida en trozos, con la cabecera repetida en todos."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/split-by-column/run":{"post":{"operationId":"run_split_by_column","summary":"Dividir un Excel por el valor de una columna","description":"Genera un archivo por cada valor distinto de una columna: uno por regi\u00F3n, por vendedor o por mes. Elige una columna y descarga un archivo por cada valor distinto, ya filtrado y con el nombre del grupo. La primera fila del archivo debe contener los nombres de las columnas.","tags":["Combinar y dividir"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"column":{"type":"string","description":"Columna por la que se divide. Se genera un archivo por cada valor distinto: una regi\u00F3n, un vendedor, un mes. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"format":{"type":"string","description":"Formato de los archivos. Como sale m\u00E1s de un archivo, la descarga viene en un ZIP.","enum":["xlsx","csv"],"default":"xlsx"},"include-column-in-name":{"type":"boolean","description":"Poner el nombre de la columna en cada archivo. Con esto los archivos se llaman \u00ABRegion-Norte.xlsx\u00BB en vez de \u00ABNorte.xlsx\u00BB.","default":false},"keep-column":{"type":"boolean","description":"Conservar la columna en el resultado. Dentro de cada archivo su valor es el mismo en todas las filas, as\u00ED que puedes quitarla sin perder informaci\u00F3n.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","column"],"description":"Genera un archivo por cada valor distinto de una columna: uno por regi\u00F3n, por vendedor o por mes. Elige una columna y descarga un archivo por cada valor distinto, ya filtrado y con el nombre del grupo. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"column":{"type":"string","description":"Columna por la que se divide. Se genera un archivo por cada valor distinto: una regi\u00F3n, un vendedor, un mes. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"format":{"type":"string","description":"Formato de los archivos. Como sale m\u00E1s de un archivo, la descarga viene en un ZIP.","enum":["xlsx","csv"],"default":"xlsx"},"include-column-in-name":{"type":"boolean","description":"Poner el nombre de la columna en cada archivo. Con esto los archivos se llaman \u00ABRegion-Norte.xlsx\u00BB en vez de \u00ABNorte.xlsx\u00BB.","default":false},"keep-column":{"type":"boolean","description":"Conservar la columna en el resultado. Dentro de cada archivo su valor es el mismo en todas las filas, as\u00ED que puedes quitarla sin perder informaci\u00F3n.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","column"],"description":"Genera un archivo por cada valor distinto de una columna: uno por regi\u00F3n, por vendedor o por mes. Elige una columna y descarga un archivo por cada valor distinto, ya filtrado y con el nombre del grupo. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/excel-to-csv/run":{"post":{"operationId":"run_excel_to_csv","summary":"Convertir Excel a CSV","description":"Convierte un archivo Excel a CSV eligiendo el separador y la codificaci\u00F3n, para que se abra bien en cualquier programa. Sube tu archivo .xlsx o .xls y descarga un CSV con el separador que necesite el sistema de destino.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos de las columnas. Desm\u00E1rcalo si tu archivo empieza directamente con datos.","default":true},"delimiter":{"type":"string","description":"Separador de campos. En Espa\u00F1a y Latinoam\u00E9rica, Excel suele esperar punto y coma. Admite comma, semicolon, tab, pipe y space, o el car\u00E1cter suelto.","enum":["comma","semicolon","tab","pipe","space"],"default":"comma"},"include-header":{"type":"boolean","description":"Incluir la fila de t\u00EDtulos en el CSV. Desm\u00E1rcalo si solo quieres los datos.","default":true},"bom":{"type":"boolean","description":"Compatible con Excel (marca UTF-8). Recomendado: sin esta marca, Excel en Windows abre el archivo con la codificaci\u00F3n del sistema y los acentos aparecen como s\u00EDmbolos raros.","default":true},"all-sheets":{"type":"boolean","description":"Convertir todas las hojas. Genera un CSV por hoja y los entrega en un ZIP. Si no, solo se convierte la primera.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un archivo Excel a CSV eligiendo el separador y la codificaci\u00F3n, para que se abra bien en cualquier programa. Sube tu archivo .xlsx o .xls y descarga un CSV con el separador que necesite el sistema de destino."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos de las columnas. Desm\u00E1rcalo si tu archivo empieza directamente con datos.","default":true},"delimiter":{"type":"string","description":"Separador de campos. En Espa\u00F1a y Latinoam\u00E9rica, Excel suele esperar punto y coma. Admite comma, semicolon, tab, pipe y space, o el car\u00E1cter suelto.","enum":["comma","semicolon","tab","pipe","space"],"default":"comma"},"include-header":{"type":"boolean","description":"Incluir la fila de t\u00EDtulos en el CSV. Desm\u00E1rcalo si solo quieres los datos.","default":true},"bom":{"type":"boolean","description":"Compatible con Excel (marca UTF-8). Recomendado: sin esta marca, Excel en Windows abre el archivo con la codificaci\u00F3n del sistema y los acentos aparecen como s\u00EDmbolos raros.","default":true},"all-sheets":{"type":"boolean","description":"Convertir todas las hojas. Genera un CSV por hoja y los entrega en un ZIP. Si no, solo se convierte la primera.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un archivo Excel a CSV eligiendo el separador y la codificaci\u00F3n, para que se abra bien en cualquier programa. Sube tu archivo .xlsx o .xls y descarga un CSV con el separador que necesite el sistema de destino."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/csv-to-excel/run":{"post":{"operationId":"run_csv_to_excel","summary":"Convertir CSV a Excel","description":"Convierte un CSV en un archivo .xlsx detectando el separador y la codificaci\u00F3n autom\u00E1ticamente. Sube tu archivo .csv y desc\u00E1rgalo como .xlsx con las columnas ya separadas y los n\u00FAmeros y las fechas reconocidos.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"delimiter":{"type":"string","description":"Separador. \u00ABAutom\u00E1tico\u00BB lo detecta a partir del propio archivo y acierta en la pr\u00E1ctica totalidad de los casos.","enum":["auto","comma","semicolon","tab","pipe"],"default":"auto"},"detect-types":{"type":"boolean","description":"Detectar n\u00FAmeros y fechas. Recomendado: sin esto, Excel recibe todo como texto y no puede sumar, ordenar ni filtrar por fecha.","default":true},"sheet-name":{"type":"string","description":"Nombre de la hoja. Si lo dejas vac\u00EDo se usa el nombre del archivo."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un CSV en un archivo .xlsx detectando el separador y la codificaci\u00F3n autom\u00E1ticamente. Sube tu archivo .csv y desc\u00E1rgalo como .xlsx con las columnas ya separadas y los n\u00FAmeros y las fechas reconocidos."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"delimiter":{"type":"string","description":"Separador. \u00ABAutom\u00E1tico\u00BB lo detecta a partir del propio archivo y acierta en la pr\u00E1ctica totalidad de los casos.","enum":["auto","comma","semicolon","tab","pipe"],"default":"auto"},"detect-types":{"type":"boolean","description":"Detectar n\u00FAmeros y fechas. Recomendado: sin esto, Excel recibe todo como texto y no puede sumar, ordenar ni filtrar por fecha.","default":true},"sheet-name":{"type":"string","description":"Nombre de la hoja. Si lo dejas vac\u00EDo se usa el nombre del archivo."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un CSV en un archivo .xlsx detectando el separador y la codificaci\u00F3n autom\u00E1ticamente. Sube tu archivo .csv y desc\u00E1rgalo como .xlsx con las columnas ya separadas y los n\u00FAmeros y las fechas reconocidos."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/excel-to-json/run":{"post":{"operationId":"run_excel_to_json","summary":"Convertir Excel a JSON","description":"Convierte una planilla en JSON, con una propiedad por columna, listo para una API. Sube tu archivo .xlsx, .xls o CSV y descarga un JSON listo para consumir desde una API o un script.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos se convierten en los nombres de las propiedades.","default":true},"shape":{"type":"string","description":"Forma del JSON. \u00ABLista de objetos\u00BB es lo que espera casi cualquier API. \u00ABLista de listas\u00BB entrega s\u00F3lo los valores y ocupa bastante menos.","enum":["objects","arrays"],"default":"objects"},"pretty":{"type":"boolean","description":"JSON con sangr\u00EDa. M\u00E1s f\u00E1cil de leer. Desact\u00EDvalo si el archivo va a consumirlo un programa y quieres que pese menos.","default":true},"skip-empty-values":{"type":"boolean","description":"Omitir las propiedades vac\u00EDas. Deja fuera las claves cuya celda est\u00E1 vac\u00EDa en vez de escribirlas como null.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte una planilla en JSON, con una propiedad por columna, listo para una API. Sube tu archivo .xlsx, .xls o CSV y descarga un JSON listo para consumir desde una API o un script."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos se convierten en los nombres de las propiedades.","default":true},"shape":{"type":"string","description":"Forma del JSON. \u00ABLista de objetos\u00BB es lo que espera casi cualquier API. \u00ABLista de listas\u00BB entrega s\u00F3lo los valores y ocupa bastante menos.","enum":["objects","arrays"],"default":"objects"},"pretty":{"type":"boolean","description":"JSON con sangr\u00EDa. M\u00E1s f\u00E1cil de leer. Desact\u00EDvalo si el archivo va a consumirlo un programa y quieres que pese menos.","default":true},"skip-empty-values":{"type":"boolean","description":"Omitir las propiedades vac\u00EDas. Deja fuera las claves cuya celda est\u00E1 vac\u00EDa en vez de escribirlas como null.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte una planilla en JSON, con una propiedad por columna, listo para una API. Sube tu archivo .xlsx, .xls o CSV y descarga un JSON listo para consumir desde una API o un script."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/json-to-excel/run":{"post":{"operationId":"run_json_to_excel","summary":"Convertir JSON a Excel","description":"Convierte un JSON de objetos en una planilla con una columna por propiedad. Sube la respuesta JSON de una API y desc\u00E1rgala como .xlsx (o CSV) con una fila por objeto y una columna por propiedad. La primera fila del archivo debe contener los nombres de las columnas.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .json."},"format":{"type":"string","description":"Formato de salida.","enum":["xlsx","csv"],"default":"xlsx"},"sheet-name":{"type":"string","description":"Nombre de la hoja. Si lo dejas vac\u00EDo se usa el nombre del archivo."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un JSON de objetos en una planilla con una columna por propiedad. Sube la respuesta JSON de una API y desc\u00E1rgala como .xlsx (o CSV) con una fila por objeto y una columna por propiedad. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .json."},"format":{"type":"string","description":"Formato de salida.","enum":["xlsx","csv"],"default":"xlsx"},"sheet-name":{"type":"string","description":"Nombre de la hoja. Si lo dejas vac\u00EDo se usa el nombre del archivo."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un JSON de objetos en una planilla con una columna por propiedad. Sube la respuesta JSON de una API y desc\u00E1rgala como .xlsx (o CSV) con una fila por objeto y una columna por propiedad. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/excel-to-sql/run":{"post":{"operationId":"run_excel_to_sql","summary":"Convertir Excel a SQL","description":"Genera las sentencias INSERT de tu planilla, con el nombre de la tabla que elijas. Sube tu planilla y descarga un script .sql listo para ejecutar, con la tabla creada y los datos insertados por lotes. La primera fila del archivo debe contener los nombres de las columnas.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"table-name":{"type":"string","description":"Nombre de la tabla. Se sanea para que sea un identificador v\u00E1lido.","default":"datos"},"dialect":{"type":"string","description":"Motor de base de datos. Cambia c\u00F3mo se citan los nombres y c\u00F3mo se escriben las fechas y los booleanos.","enum":["standard","mysql","sqlserver","postgres"],"default":"standard"},"create-table":{"type":"boolean","description":"Incluir la sentencia CREATE TABLE. Con los tipos deducidos de los propios datos, para poder cargar el archivo en una base vac\u00EDa.","default":true},"batch-size":{"type":"integer","description":"Filas por INSERT. Agrupar varias filas en un mismo INSERT hace la carga mucho m\u00E1s r\u00E1pida que una sentencia por fila.","minimum":1,"maximum":1000,"default":100},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Genera las sentencias INSERT de tu planilla, con el nombre de la tabla que elijas. Sube tu planilla y descarga un script .sql listo para ejecutar, con la tabla creada y los datos insertados por lotes. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"table-name":{"type":"string","description":"Nombre de la tabla. Se sanea para que sea un identificador v\u00E1lido.","default":"datos"},"dialect":{"type":"string","description":"Motor de base de datos. Cambia c\u00F3mo se citan los nombres y c\u00F3mo se escriben las fechas y los booleanos.","enum":["standard","mysql","sqlserver","postgres"],"default":"standard"},"create-table":{"type":"boolean","description":"Incluir la sentencia CREATE TABLE. Con los tipos deducidos de los propios datos, para poder cargar el archivo en una base vac\u00EDa.","default":true},"batch-size":{"type":"integer","description":"Filas por INSERT. Agrupar varias filas en un mismo INSERT hace la carga mucho m\u00E1s r\u00E1pida que una sentencia por fila.","minimum":1,"maximum":1000,"default":100},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Genera las sentencias INSERT de tu planilla, con el nombre de la tabla que elijas. Sube tu planilla y descarga un script .sql listo para ejecutar, con la tabla creada y los datos insertados por lotes. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/excel-to-pdf/run":{"post":{"operationId":"run_excel_to_pdf","summary":"Convertir Excel a PDF","description":"Convierte tu planilla en un PDF con las columnas ajustadas y la cabecera repetida en cada p\u00E1gina. Sube tu archivo .xlsx, .xls o .csv y desc\u00E1rgalo como un PDF de tabla listo para imprimir o enviar.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos se repiten arriba en todas las p\u00E1ginas del PDF.","default":true},"orientation":{"type":"string","description":"Orientaci\u00F3n. \u00ABAutom\u00E1tico\u00BB pasa a horizontal a partir de siete columnas, que es donde una tabla vertical deja de caber.","enum":["auto","portrait","landscape"],"default":"auto"},"page-size":{"type":"string","description":"Tama\u00F1o de p\u00E1gina.","enum":["a4","letter","a3"],"default":"a4"},"font-size":{"type":"integer","description":"Tama\u00F1o de letra. B\u00E1jalo si la tabla tiene muchas columnas: es lo que evita que el texto se parta.","minimum":6,"maximum":14,"default":9},"title":{"type":"string","description":"T\u00EDtulo del documento. Aparece en la cabecera de cada p\u00E1gina. Si lo dejas vac\u00EDo se usa el nombre de la hoja."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte tu planilla en un PDF con las columnas ajustadas y la cabecera repetida en cada p\u00E1gina. Sube tu archivo .xlsx, .xls o .csv y desc\u00E1rgalo como un PDF de tabla listo para imprimir o enviar."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos se repiten arriba en todas las p\u00E1ginas del PDF.","default":true},"orientation":{"type":"string","description":"Orientaci\u00F3n. \u00ABAutom\u00E1tico\u00BB pasa a horizontal a partir de siete columnas, que es donde una tabla vertical deja de caber.","enum":["auto","portrait","landscape"],"default":"auto"},"page-size":{"type":"string","description":"Tama\u00F1o de p\u00E1gina.","enum":["a4","letter","a3"],"default":"a4"},"font-size":{"type":"integer","description":"Tama\u00F1o de letra. B\u00E1jalo si la tabla tiene muchas columnas: es lo que evita que el texto se parta.","minimum":6,"maximum":14,"default":9},"title":{"type":"string","description":"T\u00EDtulo del documento. Aparece en la cabecera de cada p\u00E1gina. Si lo dejas vac\u00EDo se usa el nombre de la hoja."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte tu planilla en un PDF con las columnas ajustadas y la cabecera repetida en cada p\u00E1gina. Sube tu archivo .xlsx, .xls o .csv y desc\u00E1rgalo como un PDF de tabla listo para imprimir o enviar."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/excel-to-html/run":{"post":{"operationId":"run_excel_to_html","summary":"Convertir Excel a HTML","description":"Convierte tu planilla en una tabla HTML lista para pegar en una p\u00E1gina web. Sube tu planilla y descarga la tabla en HTML: solo el \u003Ctable\u003E para pegarlo donde quieras, o una p\u00E1gina completa.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Se marcan como cabecera de la tabla, que es lo que necesitan los lectores de pantalla y los buscadores.","default":true},"full-document":{"type":"boolean","description":"Documento HTML completo. Con esto obtienes una p\u00E1gina que se abre en el navegador. Sin esto, s\u00F3lo la tabla, lista para pegar dentro de tu web.","default":false},"table-class":{"type":"string","description":"Clase CSS de la tabla. Para que la tabla herede los estilos de tu propio sitio."},"include-styles":{"type":"boolean","description":"Incluir estilos b\u00E1sicos. Bordes y filas alternas para que se lea bien aunque no tengas CSS propio.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte tu planilla en una tabla HTML lista para pegar en una p\u00E1gina web. Sube tu planilla y descarga la tabla en HTML: solo el \u003Ctable\u003E para pegarlo donde quieras, o una p\u00E1gina completa."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Se marcan como cabecera de la tabla, que es lo que necesitan los lectores de pantalla y los buscadores.","default":true},"full-document":{"type":"boolean","description":"Documento HTML completo. Con esto obtienes una p\u00E1gina que se abre en el navegador. Sin esto, s\u00F3lo la tabla, lista para pegar dentro de tu web.","default":false},"table-class":{"type":"string","description":"Clase CSS de la tabla. Para que la tabla herede los estilos de tu propio sitio."},"include-styles":{"type":"boolean","description":"Incluir estilos b\u00E1sicos. Bordes y filas alternas para que se lea bien aunque no tengas CSS propio.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte tu planilla en una tabla HTML lista para pegar en una p\u00E1gina web. Sube tu planilla y descarga la tabla en HTML: solo el \u003Ctable\u003E para pegarlo donde quieras, o una p\u00E1gina completa."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/excel-to-xml/run":{"post":{"operationId":"run_excel_to_xml","summary":"Convertir Excel a XML","description":"Convierte tu planilla en XML, con un elemento por fila y uno anidado por columna. Sube tu planilla y descarga un XML bien formado, con un elemento por fila y los t\u00EDtulos convertidos en nombres v\u00E1lidos. La primera fila del archivo debe contener los nombres de las columnas.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"root-element":{"type":"string","description":"Elemento ra\u00EDz.","default":"datos"},"row-element":{"type":"string","description":"Elemento de cada fila.","default":"fila"},"style":{"type":"string","description":"C\u00F3mo se escriben los valores. Como elementos hijos, que es lo m\u00E1s habitual, o como atributos del elemento de fila, que produce un archivo m\u00E1s compacto.","enum":["elements","attributes"],"default":"elements"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte tu planilla en XML, con un elemento por fila y uno anidado por columna. Sube tu planilla y descarga un XML bien formado, con un elemento por fila y los t\u00EDtulos convertidos en nombres v\u00E1lidos. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"root-element":{"type":"string","description":"Elemento ra\u00EDz.","default":"datos"},"row-element":{"type":"string","description":"Elemento de cada fila.","default":"fila"},"style":{"type":"string","description":"C\u00F3mo se escriben los valores. Como elementos hijos, que es lo m\u00E1s habitual, o como atributos del elemento de fila, que produce un archivo m\u00E1s compacto.","enum":["elements","attributes"],"default":"elements"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte tu planilla en XML, con un elemento por fila y uno anidado por columna. Sube tu planilla y descarga un XML bien formado, con un elemento por fila y los t\u00EDtulos convertidos en nombres v\u00E1lidos. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/document-to-markdown/run":{"post":{"operationId":"run_document_to_markdown","summary":"Convertir documentos a Markdown","description":"Pasa a Markdown un Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV o PDF, con sus t\u00EDtulos, listas y tablas. Sube un documento y descarga su versi\u00F3n en Markdown, con los t\u00EDtulos, las listas y las tablas en su sitio.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv, .pdf, .xlsm, .docx, .docm, .pptx, .ppsm, .ppsx, .pptm, .odt, .odp, .ods, .rtf, .epub."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. S\u00F3lo se aplica a planillas y CSV: es la fila que encabeza la tabla de Markdown.","default":true},"include-images":{"type":"boolean","description":"Extraer las im\u00E1genes. Las im\u00E1genes del documento salen en la carpeta \u00ABimagenes\u00BB y el Markdown las enlaza. Desm\u00E1rcalo para obtener s\u00F3lo el texto.","default":true},"include-notes":{"type":"boolean","description":"Incluir las notas del ponente. S\u00F3lo se aplica a presentaciones. Las notas salen como cita, separadas de lo que se proyect\u00F3.","default":false},"page-breaks":{"type":"string","description":"Separaci\u00F3n entre p\u00E1ginas del PDF. Un encabezado por p\u00E1gina facilita orientarse en un PDF largo; el texto seguido se parece m\u00E1s a un documento escrito.","enum":["heading","rule","continuous"],"default":"heading"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Pasa a Markdown un Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV o PDF, con sus t\u00EDtulos, listas y tablas. Sube un documento y descarga su versi\u00F3n en Markdown, con los t\u00EDtulos, las listas y las tablas en su sitio."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv, .pdf, .xlsm, .docx, .docm, .pptx, .ppsm, .ppsx, .pptm, .odt, .odp, .ods, .rtf, .epub."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. S\u00F3lo se aplica a planillas y CSV: es la fila que encabeza la tabla de Markdown.","default":true},"include-images":{"type":"boolean","description":"Extraer las im\u00E1genes. Las im\u00E1genes del documento salen en la carpeta \u00ABimagenes\u00BB y el Markdown las enlaza. Desm\u00E1rcalo para obtener s\u00F3lo el texto.","default":true},"include-notes":{"type":"boolean","description":"Incluir las notas del ponente. S\u00F3lo se aplica a presentaciones. Las notas salen como cita, separadas de lo que se proyect\u00F3.","default":false},"page-breaks":{"type":"string","description":"Separaci\u00F3n entre p\u00E1ginas del PDF. Un encabezado por p\u00E1gina facilita orientarse en un PDF largo; el texto seguido se parece m\u00E1s a un documento escrito.","enum":["heading","rule","continuous"],"default":"heading"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Pasa a Markdown un Word, PowerPoint, Excel, OpenDocument, RTF, EPUB, CSV o PDF, con sus t\u00EDtulos, listas y tablas. Sube un documento y descarga su versi\u00F3n en Markdown, con los t\u00EDtulos, las listas y las tablas en su sitio."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/markdown-to-document/run":{"post":{"operationId":"run_markdown_to_document","summary":"Convertir Markdown a Word, PDF y m\u00E1s","description":"Convierte un archivo Markdown en Word, PDF, HTML, EPUB, OpenDocument, RTF, PowerPoint o planilla. Sube un archivo .md y elige en qu\u00E9 formato lo quieres. Los t\u00EDtulos, las listas y las tablas llegan como tales, no como texto plano.","tags":["Conversi\u00F3n de formatos"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .zip, .md."},"format":{"type":"string","description":"Formato de salida. Word y PDF conservan todo el documento; la planilla y el CSV se quedan s\u00F3lo con sus tablas.","enum":["docx","pdf","html","epub","odt","rtf","pptx","xlsx","csv"],"default":"docx"},"title":{"type":"string","description":"T\u00EDtulo del documento. Va a las propiedades del archivo y a la portada. Si lo dejas vac\u00EDo se usa el primer t\u00EDtulo del Markdown."},"page-size":{"type":"string","description":"Tama\u00F1o de p\u00E1gina. S\u00F3lo se aplica al PDF.","enum":["a4","letter","a3"],"default":"a4"},"slide-heading":{"type":"string","description":"Cada diapositiva empieza en. S\u00F3lo se aplica a PowerPoint: es el nivel de t\u00EDtulo que abre una diapositiva nueva.","enum":["h1","h2"],"default":"h2"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un archivo Markdown en Word, PDF, HTML, EPUB, OpenDocument, RTF, PowerPoint o planilla. Sube un archivo .md y elige en qu\u00E9 formato lo quieres. Los t\u00EDtulos, las listas y las tablas llegan como tales, no como texto plano."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .zip, .md."},"format":{"type":"string","description":"Formato de salida. Word y PDF conservan todo el documento; la planilla y el CSV se quedan s\u00F3lo con sus tablas.","enum":["docx","pdf","html","epub","odt","rtf","pptx","xlsx","csv"],"default":"docx"},"title":{"type":"string","description":"T\u00EDtulo del documento. Va a las propiedades del archivo y a la portada. Si lo dejas vac\u00EDo se usa el primer t\u00EDtulo del Markdown."},"page-size":{"type":"string","description":"Tama\u00F1o de p\u00E1gina. S\u00F3lo se aplica al PDF.","enum":["a4","letter","a3"],"default":"a4"},"slide-heading":{"type":"string","description":"Cada diapositiva empieza en. S\u00F3lo se aplica a PowerPoint: es el nivel de t\u00EDtulo que abre una diapositiva nueva.","enum":["h1","h2"],"default":"h2"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte un archivo Markdown en Word, PDF, HTML, EPUB, OpenDocument, RTF, PowerPoint o planilla. Sube un archivo .md y elige en qu\u00E9 formato lo quieres. Los t\u00EDtulos, las listas y las tablas llegan como tales, no como texto plano."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/clean-text/run":{"post":{"operationId":"run_clean_text","summary":"Limpiar datos de una planilla","description":"Quita espacios sobrantes, colapsa espacios dobles y normaliza may\u00FAsculas y min\u00FAsculas. Sube tu archivo y desc\u00E1rgalo con el texto limpio: sin espacios de m\u00E1s, sin caracteres invisibles y con las may\u00FAsculas unificadas.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"columns":{"type":"array","items":{"type":"string"},"description":"Columnas que se limpian. Sep\u00E1ralas con comas. D\u00E9jalo vac\u00EDo para limpiar toda la planilla. Los n\u00FAmeros y las fechas no se tocan. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"trim":{"type":"boolean","description":"Quitar espacios al principio y al final.","default":true},"collapse-spaces":{"type":"boolean","description":"Reducir los espacios dobles a uno.","default":true},"remove-invisible":{"type":"boolean","description":"Quitar caracteres invisibles. Espacios de no separaci\u00F3n, marcas de direcci\u00F3n y caracteres de ancho cero: llegan al copiar de una web o un PDF y hacen que dos valores id\u00E9nticos a la vista nunca coincidan.","default":true},"case":{"type":"string","description":"May\u00FAsculas y min\u00FAsculas.","enum":["none","lower","upper","title","sentence"],"default":"none"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Quita espacios sobrantes, colapsa espacios dobles y normaliza may\u00FAsculas y min\u00FAsculas. Sube tu archivo y desc\u00E1rgalo con el texto limpio: sin espacios de m\u00E1s, sin caracteres invisibles y con las may\u00FAsculas unificadas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"columns":{"type":"string","description":"Columnas que se limpian. Sep\u00E1ralas con comas. D\u00E9jalo vac\u00EDo para limpiar toda la planilla. Los n\u00FAmeros y las fechas no se tocan. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"trim":{"type":"boolean","description":"Quitar espacios al principio y al final.","default":true},"collapse-spaces":{"type":"boolean","description":"Reducir los espacios dobles a uno.","default":true},"remove-invisible":{"type":"boolean","description":"Quitar caracteres invisibles. Espacios de no separaci\u00F3n, marcas de direcci\u00F3n y caracteres de ancho cero: llegan al copiar de una web o un PDF y hacen que dos valores id\u00E9nticos a la vista nunca coincidan.","default":true},"case":{"type":"string","description":"May\u00FAsculas y min\u00FAsculas.","enum":["none","lower","upper","title","sentence"],"default":"none"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Quita espacios sobrantes, colapsa espacios dobles y normaliza may\u00FAsculas y min\u00FAsculas. Sube tu archivo y desc\u00E1rgalo con el texto limpio: sin espacios de m\u00E1s, sin caracteres invisibles y con las may\u00FAsculas unificadas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/remove-duplicates/run":{"post":{"operationId":"run_remove_duplicates","summary":"Eliminar filas duplicadas en Excel","description":"Quita las filas repetidas de una planilla Excel o CSV, comparando todas las columnas o solo las que elijas. Sube tu planilla, elige qu\u00E9 columnas deciden si dos filas son la misma y descarga el archivo limpio. El orden original no cambia.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos de las columnas. Desm\u00E1rcalo si tu archivo empieza directamente con datos.","default":true},"compare-columns":{"type":"array","items":{"type":"string"},"description":"Columnas que se comparan. Sep\u00E1ralas con comas. Puedes usar el nombre de la columna, su letra (A, B, C) o su n\u00FAmero. D\u00E9jalo vac\u00EDo para comparar la fila completa. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"keep":{"type":"string","description":"De cada duplicado, conservar. El orden de las filas no cambia en ning\u00FAn caso.","enum":["first","last"],"default":"first"},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas. Si lo marcas, \u00ABAna\u00BB y \u00ABANA\u00BB se consideran valores distintos.","default":false},"trim":{"type":"boolean","description":"Ignorar espacios al principio y al final. Recomendado: los espacios sobrantes son la causa m\u00E1s com\u00FAn de duplicados que no se detectan.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Quita las filas repetidas de una planilla Excel o CSV, comparando todas las columnas o solo las que elijas. Sube tu planilla, elige qu\u00E9 columnas deciden si dos filas son la misma y descarga el archivo limpio. El orden original no cambia."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos de las columnas. Desm\u00E1rcalo si tu archivo empieza directamente con datos.","default":true},"compare-columns":{"type":"string","description":"Columnas que se comparan. Sep\u00E1ralas con comas. Puedes usar el nombre de la columna, su letra (A, B, C) o su n\u00FAmero. D\u00E9jalo vac\u00EDo para comparar la fila completa. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"keep":{"type":"string","description":"De cada duplicado, conservar. El orden de las filas no cambia en ning\u00FAn caso.","enum":["first","last"],"default":"first"},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas. Si lo marcas, \u00ABAna\u00BB y \u00ABANA\u00BB se consideran valores distintos.","default":false},"trim":{"type":"boolean","description":"Ignorar espacios al principio y al final. Recomendado: los espacios sobrantes son la causa m\u00E1s com\u00FAn de duplicados que no se detectan.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Quita las filas repetidas de una planilla Excel o CSV, comparando todas las columnas o solo las que elijas. Sube tu planilla, elige qu\u00E9 columnas deciden si dos filas son la misma y descarga el archivo limpio. El orden original no cambia."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/remove-empty/run":{"post":{"operationId":"run_remove_empty","summary":"Eliminar filas y columnas vac\u00EDas","description":"Quita de tu planilla las filas y columnas que no contienen ning\u00FAn dato. Sube tu archivo y desc\u00E1rgalo sin las filas ni las columnas en blanco que rompen las tablas din\u00E1micas y las importaciones.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Desm\u00E1rcalo si tu archivo empieza con datos.","default":true},"remove-rows":{"type":"boolean","description":"Eliminar filas vac\u00EDas.","default":true},"remove-columns":{"type":"boolean","description":"Eliminar columnas vac\u00EDas. Una columna con t\u00EDtulo pero sin datos se conserva: suele estar pendiente de rellenar.","default":true},"treat-spaces-as-empty":{"type":"boolean","description":"Tratar las celdas con s\u00F3lo espacios como vac\u00EDas. Recomendado. Es la raz\u00F3n por la que \u00ABeliminar filas vac\u00EDas\u00BB de Excel a veces no elimina nada.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Quita de tu planilla las filas y columnas que no contienen ning\u00FAn dato. Sube tu archivo y desc\u00E1rgalo sin las filas ni las columnas en blanco que rompen las tablas din\u00E1micas y las importaciones."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Desm\u00E1rcalo si tu archivo empieza con datos.","default":true},"remove-rows":{"type":"boolean","description":"Eliminar filas vac\u00EDas.","default":true},"remove-columns":{"type":"boolean","description":"Eliminar columnas vac\u00EDas. Una columna con t\u00EDtulo pero sin datos se conserva: suele estar pendiente de rellenar.","default":true},"treat-spaces-as-empty":{"type":"boolean","description":"Tratar las celdas con s\u00F3lo espacios como vac\u00EDas. Recomendado. Es la raz\u00F3n por la que \u00ABeliminar filas vac\u00EDas\u00BB de Excel a veces no elimina nada.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Quita de tu planilla las filas y columnas que no contienen ning\u00FAn dato. Sube tu archivo y desc\u00E1rgalo sin las filas ni las columnas en blanco que rompen las tablas din\u00E1micas y las importaciones."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/normalize-dates/run":{"post":{"operationId":"run_normalize_dates","summary":"Normalizar fechas en Excel","description":"Unifica en un solo formato las fechas que llegaron mezcladas desde varias fuentes. Sube tu planilla con fechas en formatos distintos y desc\u00E1rgala con todas unificadas y reconocidas como fechas reales.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"columns":{"type":"array","items":{"type":"string"},"description":"Columnas de fecha. D\u00E9jalo vac\u00EDo para revisar toda la planilla. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"input-order":{"type":"string","description":"C\u00F3mo est\u00E1n escritas AHORA. \u00AB03/04/2026\u00BB significa dos fechas distintas seg\u00FAn el orden. Si eliges mal, el archivo saldr\u00E1 con el d\u00EDa y el mes cambiados y parecer\u00E1 correcto: revisa el aviso al terminar.","enum":["day-first","month-first"],"default":"day-first"},"output-format":{"type":"string","description":"Formato de salida. AAAA-MM-DD es el que entienden todas las herramientas y el \u00FAnico que ordena bien como texto.","enum":["iso","day-first","month-first","date-only"],"default":"iso"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Unifica en un solo formato las fechas que llegaron mezcladas desde varias fuentes. Sube tu planilla con fechas en formatos distintos y desc\u00E1rgala con todas unificadas y reconocidas como fechas reales."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"columns":{"type":"string","description":"Columnas de fecha. D\u00E9jalo vac\u00EDo para revisar toda la planilla. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"input-order":{"type":"string","description":"C\u00F3mo est\u00E1n escritas AHORA. \u00AB03/04/2026\u00BB significa dos fechas distintas seg\u00FAn el orden. Si eliges mal, el archivo saldr\u00E1 con el d\u00EDa y el mes cambiados y parecer\u00E1 correcto: revisa el aviso al terminar.","enum":["day-first","month-first"],"default":"day-first"},"output-format":{"type":"string","description":"Formato de salida. AAAA-MM-DD es el que entienden todas las herramientas y el \u00FAnico que ordena bien como texto.","enum":["iso","day-first","month-first","date-only"],"default":"iso"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Unifica en un solo formato las fechas que llegaron mezcladas desde varias fuentes. Sube tu planilla con fechas en formatos distintos y desc\u00E1rgala con todas unificadas y reconocidas como fechas reales."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/text-to-number/run":{"post":{"operationId":"run_text_to_number","summary":"Convertir n\u00FAmeros guardados como texto","description":"Convierte en n\u00FAmeros reales las celdas que Excel trata como texto y por eso no puede sumar. Ese tri\u00E1ngulo verde en la esquina de la celda significa que tu n\u00FAmero es texto. Sube el archivo y desc\u00E1rgalo con n\u00FAmeros de verdad.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"columns":{"type":"array","items":{"type":"string"},"description":"Columnas que se convierten. D\u00E9jalo vac\u00EDo para revisar toda la planilla. Lo que no sea un n\u00FAmero se deja intacto. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"strip-currency":{"type":"boolean","description":"Quitar s\u00EDmbolos de moneda. Convierte \u00AB$ 1.234\u00BB en 1234 y entiende el par\u00E9ntesis contable: \u00AB(1.234)\u00BB pasa a \u22121234.","default":true},"percent-to-fraction":{"type":"boolean","description":"Convertir los porcentajes a fracci\u00F3n. Con esto, \u00AB15 %\u00BB pasa a 0,15. Sin esto, pasa a 15.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte en n\u00FAmeros reales las celdas que Excel trata como texto y por eso no puede sumar. Ese tri\u00E1ngulo verde en la esquina de la celda significa que tu n\u00FAmero es texto. Sube el archivo y desc\u00E1rgalo con n\u00FAmeros de verdad."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"columns":{"type":"string","description":"Columnas que se convierten. D\u00E9jalo vac\u00EDo para revisar toda la planilla. Lo que no sea un n\u00FAmero se deja intacto. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"strip-currency":{"type":"boolean","description":"Quitar s\u00EDmbolos de moneda. Convierte \u00AB$ 1.234\u00BB en 1234 y entiende el par\u00E9ntesis contable: \u00AB(1.234)\u00BB pasa a \u22121234.","default":true},"percent-to-fraction":{"type":"boolean","description":"Convertir los porcentajes a fracci\u00F3n. Con esto, \u00AB15 %\u00BB pasa a 0,15. Sin esto, pasa a 15.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Convierte en n\u00FAmeros reales las celdas que Excel trata como texto y por eso no puede sumar. Ese tri\u00E1ngulo verde en la esquina de la celda significa que tu n\u00FAmero es texto. Sube el archivo y desc\u00E1rgalo con n\u00FAmeros de verdad."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/transpose/run":{"post":{"operationId":"run_transpose","summary":"Transponer una tabla de Excel","description":"Intercambia filas por columnas, girando la orientaci\u00F3n de toda la tabla. Sube tu planilla y desc\u00E1rgala girada: lo que estaba en filas pasa a columnas y al rev\u00E9s.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos pasan a ser la primera columna del resultado.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Intercambia filas por columnas, girando la orientaci\u00F3n de toda la tabla. Sube tu planilla y desc\u00E1rgala girada: lo que estaba en filas pasa a columnas y al rev\u00E9s."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos pasan a ser la primera columna del resultado.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Intercambia filas por columnas, girando la orientaci\u00F3n de toda la tabla. Sube tu planilla y desc\u00E1rgala girada: lo que estaba en filas pasa a columnas y al rev\u00E9s."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/unpivot/run":{"post":{"operationId":"run_unpivot","summary":"Despivotar una tabla de Excel","description":"Convierte una tabla cruzada (meses o categor\u00EDas en columnas) al formato tabular que necesitan las tablas din\u00E1micas y cualquier herramienta de an\u00E1lisis. Si tu informe tiene un mes por columna, ninguna tabla din\u00E1mica podr\u00E1 analizarlo. Esta herramienta lo convierte al formato que s\u00ED funciona. La primera fila del archivo debe contener los nombres de las columnas.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"key-columns":{"type":"array","items":{"type":"string"},"description":"Columnas que se mantienen. Las que identifican cada fila, por ejemplo Vendedor o Producto. Sep\u00E1ralas con comas. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"value-columns":{"type":"array","items":{"type":"string"},"description":"Columnas que se despivotan. D\u00E9jalo vac\u00EDo para despivotar todas las columnas que no hayas puesto arriba. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"name-header":{"type":"string","description":"T\u00EDtulo de la columna de atributos. Si lo dejas vac\u00EDo se usa \u00ABAtributo\u00BB."},"value-header":{"type":"string","description":"T\u00EDtulo de la columna de valores. Si lo dejas vac\u00EDo se usa \u00ABValor\u00BB."},"skip-empty":{"type":"boolean","description":"Omitir las celdas vac\u00EDas. Recomendado: evita generar miles de filas sin dato en tablas con muchos huecos.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","key-columns"],"description":"Convierte una tabla cruzada (meses o categor\u00EDas en columnas) al formato tabular que necesitan las tablas din\u00E1micas y cualquier herramienta de an\u00E1lisis. Si tu informe tiene un mes por columna, ninguna tabla din\u00E1mica podr\u00E1 analizarlo. Esta herramienta lo convierte al formato que s\u00ED funciona. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"key-columns":{"type":"string","description":"Columnas que se mantienen. Las que identifican cada fila, por ejemplo Vendedor o Producto. Sep\u00E1ralas con comas. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"value-columns":{"type":"string","description":"Columnas que se despivotan. D\u00E9jalo vac\u00EDo para despivotar todas las columnas que no hayas puesto arriba. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"name-header":{"type":"string","description":"T\u00EDtulo de la columna de atributos. Si lo dejas vac\u00EDo se usa \u00ABAtributo\u00BB."},"value-header":{"type":"string","description":"T\u00EDtulo de la columna de valores. Si lo dejas vac\u00EDo se usa \u00ABValor\u00BB."},"skip-empty":{"type":"boolean","description":"Omitir las celdas vac\u00EDas. Recomendado: evita generar miles de filas sin dato en tablas con muchos huecos.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","key-columns"],"description":"Convierte una tabla cruzada (meses o categor\u00EDas en columnas) al formato tabular que necesitan las tablas din\u00E1micas y cualquier herramienta de an\u00E1lisis. Si tu informe tiene un mes por columna, ninguna tabla din\u00E1mica podr\u00E1 analizarlo. Esta herramienta lo convierte al formato que s\u00ED funciona. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/find-replace/run":{"post":{"operationId":"run_find_replace","summary":"Buscar y reemplazar en Excel","description":"Sustituye texto en toda la planilla, o en varias a la vez, sin abrirlas una por una. Sube tu archivo, indica qu\u00E9 buscar y con qu\u00E9 sustituirlo, y descarga el resultado. Sin abrir Excel.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"find":{"type":"string","description":"Texto que se busca."},"replace":{"type":"string","description":"Texto de reemplazo. D\u00E9jalo vac\u00EDo para borrar el texto encontrado."},"columns":{"type":"array","items":{"type":"string"},"description":"Columnas donde buscar. D\u00E9jalo vac\u00EDo para buscar en toda la planilla. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas.","default":false},"whole-cell":{"type":"boolean","description":"S\u00F3lo si coincide la celda entera. Con esto, buscar \u00ABAna\u00BB no cambia \u00ABAna Mar\u00EDa\u00BB.","default":false},"regex":{"type":"boolean","description":"Usar expresiones regulares. Para lo que el buscar y reemplazar de Excel no cubre. Si no sabes qu\u00E9 es, d\u00E9jalo desactivado.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","find"],"description":"Sustituye texto en toda la planilla, o en varias a la vez, sin abrirlas una por una. Sube tu archivo, indica qu\u00E9 buscar y con qu\u00E9 sustituirlo, y descarga el resultado. Sin abrir Excel."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"find":{"type":"string","description":"Texto que se busca."},"replace":{"type":"string","description":"Texto de reemplazo. D\u00E9jalo vac\u00EDo para borrar el texto encontrado."},"columns":{"type":"string","description":"Columnas donde buscar. D\u00E9jalo vac\u00EDo para buscar en toda la planilla. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas.","default":false},"whole-cell":{"type":"boolean","description":"S\u00F3lo si coincide la celda entera. Con esto, buscar \u00ABAna\u00BB no cambia \u00ABAna Mar\u00EDa\u00BB.","default":false},"regex":{"type":"boolean","description":"Usar expresiones regulares. Para lo que el buscar y reemplazar de Excel no cubre. Si no sabes qu\u00E9 es, d\u00E9jalo desactivado.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","find"],"description":"Sustituye texto en toda la planilla, o en varias a la vez, sin abrirlas una por una. Sube tu archivo, indica qu\u00E9 buscar y con qu\u00E9 sustituirlo, y descarga el resultado. Sin abrir Excel."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/fill-down/run":{"post":{"operationId":"run_fill_down","summary":"Rellenar hacia abajo en Excel","description":"Copia el valor de cada celda en las celdas vac\u00EDas que tiene debajo, hasta el siguiente dato. Los informes escriben la categor\u00EDa s\u00F3lo en su primera fila. Sube el archivo y desc\u00E1rgalo con cada fila completa.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"columns":{"type":"array","items":{"type":"string"},"description":"Columnas que se rellenan. Normalmente son las de categor\u00EDa o agrupaci\u00F3n. D\u00E9jalo vac\u00EDo para rellenar todas. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"direction":{"type":"string","description":"Direcci\u00F3n.","enum":["down","up"],"default":"down"},"stop-at-blank-row":{"type":"boolean","description":"Parar en las filas totalmente vac\u00EDas. Recomendado: una fila en blanco suele separar bloques, y arrastrar valores a trav\u00E9s de ella mezclar\u00EDa dos secciones distintas.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Copia el valor de cada celda en las celdas vac\u00EDas que tiene debajo, hasta el siguiente dato. Los informes escriben la categor\u00EDa s\u00F3lo en su primera fila. Sube el archivo y desc\u00E1rgalo con cada fila completa."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"columns":{"type":"string","description":"Columnas que se rellenan. Normalmente son las de categor\u00EDa o agrupaci\u00F3n. D\u00E9jalo vac\u00EDo para rellenar todas. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"direction":{"type":"string","description":"Direcci\u00F3n.","enum":["down","up"],"default":"down"},"stop-at-blank-row":{"type":"boolean","description":"Parar en las filas totalmente vac\u00EDas. Recomendado: una fila en blanco suele separar bloques, y arrastrar valores a trav\u00E9s de ella mezclar\u00EDa dos secciones distintas.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Copia el valor de cada celda en las celdas vac\u00EDas que tiene debajo, hasta el siguiente dato. Los informes escriben la categor\u00EDa s\u00F3lo en su primera fila. Sube el archivo y desc\u00E1rgalo con cada fila completa."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/split-merge-columns/run":{"post":{"operationId":"run_split_merge_columns","summary":"Dividir o combinar columnas de texto","description":"Parte una columna por un separador, o une varias en una sola con el separador que elijas. Sube tu planilla y desc\u00E1rgala con la columna partida en varias, o con varias unidas en una. La primera fila del archivo debe contener los nombres de las columnas.","tags":["Limpieza y transformaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"mode":{"type":"string","description":"Qu\u00E9 quieres hacer.","enum":["split","merge"],"default":"split"},"columns":{"type":"array","items":{"type":"string"},"description":"Columnas. Para dividir, indica una. Para combinar, indica dos o m\u00E1s separadas por comas. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"separator":{"type":"string","description":"Separador. El car\u00E1cter por el que se parte o con el que se une. Puede ser m\u00E1s de un car\u00E1cter.","default":","},"new-column-name":{"type":"string","description":"Nombre de la columna nueva. Si lo dejas vac\u00EDo se deriva del nombre de la columna original."},"trim-parts":{"type":"boolean","description":"Quitar espacios de cada parte.","default":true},"keep-original":{"type":"boolean","description":"Conservar las columnas originales. \u00DAtil para comprobar el resultado antes de descartarlas.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","columns"],"description":"Parte una columna por un separador, o une varias en una sola con el separador que elijas. Sube tu planilla y desc\u00E1rgala con la columna partida en varias, o con varias unidas en una. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"mode":{"type":"string","description":"Qu\u00E9 quieres hacer.","enum":["split","merge"],"default":"split"},"columns":{"type":"string","description":"Columnas. Para dividir, indica una. Para combinar, indica dos o m\u00E1s separadas por comas. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"separator":{"type":"string","description":"Separador. El car\u00E1cter por el que se parte o con el que se une. Puede ser m\u00E1s de un car\u00E1cter.","default":","},"new-column-name":{"type":"string","description":"Nombre de la columna nueva. Si lo dejas vac\u00EDo se deriva del nombre de la columna original."},"trim-parts":{"type":"boolean","description":"Quitar espacios de cada parte.","default":true},"keep-original":{"type":"boolean","description":"Conservar las columnas originales. \u00DAtil para comprobar el resultado antes de descartarlas.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","columns"],"description":"Parte una columna por un separador, o une varias en una sola con el separador que elijas. Sube tu planilla y desc\u00E1rgala con la columna partida en varias, o con varias unidas en una. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/compare-files/run":{"post":{"operationId":"run_compare_files","summary":"Comparar dos archivos Excel","description":"Muestra las diferencias celda a celda entre dos planillas, resaltando lo que cambi\u00F3. Sube el archivo A y el archivo B, elige la columna que identifica cada fila y descarga un informe que marca cada una como solo en A, solo en B, cambiada o igual. La primera fila del archivo debe contener los nombres de las columnas.","tags":["An\u00E1lisis y comparaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false},"minItems":2,"maxItems":2,"description":"Archivos de entrada, hasta 2. Formatos admitidos: .xlsx, .xls, .csv."},"key-column":{"type":"string","description":"Columna que identifica cada fila. El identificador que existe en los dos archivos (un c\u00F3digo, un RUT, un correo). Si lo dejas vac\u00EDo se usa la primera columna. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas.","default":false},"trim":{"type":"boolean","description":"Ignorar los espacios sobrantes. Recomendado: evita que \u00AB A1 \u00BB y \u00ABA1\u00BB parezcan filas distintas.","default":true},"only-differences":{"type":"boolean","description":"Mostrar s\u00F3lo lo que cambi\u00F3. Deja fuera las filas id\u00E9nticas y muestra s\u00F3lo altas, bajas y cambios.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files"],"description":"Muestra las diferencias celda a celda entre dos planillas, resaltando lo que cambi\u00F3. Sube el archivo A y el archivo B, elige la columna que identifica cada fila y descarga un informe que marca cada una como solo en A, solo en B, cambiada o igual. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"description":"Archivos de entrada, hasta 2. Formatos admitidos: .xlsx, .xls, .csv."},"key-column":{"type":"string","description":"Columna que identifica cada fila. El identificador que existe en los dos archivos (un c\u00F3digo, un RUT, un correo). Si lo dejas vac\u00EDo se usa la primera columna. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas.","default":false},"trim":{"type":"boolean","description":"Ignorar los espacios sobrantes. Recomendado: evita que \u00AB A1 \u00BB y \u00ABA1\u00BB parezcan filas distintas.","default":true},"only-differences":{"type":"boolean","description":"Mostrar s\u00F3lo lo que cambi\u00F3. Deja fuera las filas id\u00E9nticas y muestra s\u00F3lo altas, bajas y cambios.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files"],"description":"Muestra las diferencias celda a celda entre dos planillas, resaltando lo que cambi\u00F3. Sube el archivo A y el archivo B, elige la columna que identifica cada fila y descarga un informe que marca cada una como solo en A, solo en B, cambiada o igual. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/join-files/run":{"post":{"operationId":"run_join_files","summary":"Cruzar dos Excel por una columna clave","description":"Une dos planillas por una columna com\u00FAn, como har\u00EDa un VLOOKUP pero sin f\u00F3rmulas. Sube tu archivo principal y el de consulta, elige la columna que comparten y descarga el primero con las columnas del segundo ya incorporadas. La primera fila del archivo debe contener los nombres de las columnas.","tags":["An\u00E1lisis y comparaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false},"minItems":2,"maxItems":2,"description":"Archivos de entrada, hasta 2. Formatos admitidos: .xlsx, .xls, .csv."},"key-column":{"type":"string","description":"Columna por la que se cruza. La clave com\u00FAn a ambos archivos. Si la dejas vac\u00EDa se usa la primera columna. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"join-type":{"type":"string","description":"Qu\u00E9 filas se conservan. \u00ABConservar todas las del principal\u00BB es el BUSCARV cl\u00E1sico: las que no coinciden salen con las columnas tra\u00EDdas vac\u00EDas.","enum":["left","inner"],"default":"left"},"bring-columns":{"type":"array","items":{"type":"string"},"description":"Columnas que se traen del segundo archivo. Sep\u00E1ralas con comas. D\u00E9jalo vac\u00EDo para traer todas menos la clave. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas.","default":false},"trim":{"type":"boolean","description":"Ignorar los espacios sobrantes. Recomendado: la causa n\u00FAmero uno de un BUSCARV que \u00ABno encuentra\u00BB es un espacio invisible al final de la clave.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files"],"description":"Une dos planillas por una columna com\u00FAn, como har\u00EDa un VLOOKUP pero sin f\u00F3rmulas. Sube tu archivo principal y el de consulta, elige la columna que comparten y descarga el primero con las columnas del segundo ya incorporadas. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"description":"Archivos de entrada, hasta 2. Formatos admitidos: .xlsx, .xls, .csv."},"key-column":{"type":"string","description":"Columna por la que se cruza. La clave com\u00FAn a ambos archivos. Si la dejas vac\u00EDa se usa la primera columna. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"join-type":{"type":"string","description":"Qu\u00E9 filas se conservan. \u00ABConservar todas las del principal\u00BB es el BUSCARV cl\u00E1sico: las que no coinciden salen con las columnas tra\u00EDdas vac\u00EDas.","enum":["left","inner"],"default":"left"},"bring-columns":{"type":"string","description":"Columnas que se traen del segundo archivo. Sep\u00E1ralas con comas. D\u00E9jalo vac\u00EDo para traer todas menos la clave. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas.","default":false},"trim":{"type":"boolean","description":"Ignorar los espacios sobrantes. Recomendado: la causa n\u00FAmero uno de un BUSCARV que \u00ABno encuentra\u00BB es un espacio invisible al final de la clave.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files"],"description":"Une dos planillas por una columna com\u00FAn, como har\u00EDa un VLOOKUP pero sin f\u00F3rmulas. Sube tu archivo principal y el de consulta, elige la columna que comparten y descarga el primero con las columnas del segundo ya incorporadas. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/column-stats/run":{"post":{"operationId":"run_column_stats","summary":"Resumen estad\u00EDstico por columna","description":"Calcula suma, promedio, m\u00EDnimo, m\u00E1ximo, conteo y nulos de cada columna num\u00E9rica. Sube tu planilla y descarga un informe con una fila por columna: tipo, total, vac\u00EDos, distintos y, para las num\u00E9ricas, m\u00EDnimo, m\u00E1ximo, suma, media y mediana. La primera fila del archivo debe contener los nombres de las columnas.","tags":["An\u00E1lisis y comparaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos nombran cada fila del resumen.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Calcula suma, promedio, m\u00EDnimo, m\u00E1ximo, conteo y nulos de cada columna num\u00E9rica. Sube tu planilla y descarga un informe con una fila por columna: tipo, total, vac\u00EDos, distintos y, para las num\u00E9ricas, m\u00EDnimo, m\u00E1ximo, suma, media y mediana. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos nombran cada fila del resumen.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Calcula suma, promedio, m\u00EDnimo, m\u00E1ximo, conteo y nulos de cada columna num\u00E9rica. Sube tu planilla y descarga un informe con una fila por columna: tipo, total, vac\u00EDos, distintos y, para las num\u00E9ricas, m\u00EDnimo, m\u00E1ximo, suma, media y mediana. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/group-count/run":{"post":{"operationId":"run_group_count","summary":"Agrupar y contar por valor","description":"Cuenta cu\u00E1ntas veces aparece cada valor de una columna: una tabla din\u00E1mica en un clic. Sube tu planilla, elige la columna por la que agrupar y descarga cu\u00E1ntas filas hay de cada valor, con opci\u00F3n de sumar o promediar una segunda columna. La primera fila del archivo debe contener los nombres de las columnas.","tags":["An\u00E1lisis y comparaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"group-by":{"type":"string","description":"Columna por la que se agrupa. La categor\u00EDa: regi\u00F3n, vendedor, mes, estado. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"measure":{"type":"string","description":"Columna que se resume. Opcional. D\u00E9jala vac\u00EDa para s\u00F3lo contar filas por grupo. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"aggregate":{"type":"string","description":"C\u00F3mo se resume. S\u00F3lo se aplica si elegiste una columna que resumir.","enum":["sum","average","min","max"],"default":"sum"},"sort":{"type":"string","description":"Orden del resultado.","enum":["count-desc","count-asc","label"],"default":"count-desc"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","group-by"],"description":"Cuenta cu\u00E1ntas veces aparece cada valor de una columna: una tabla din\u00E1mica en un clic. Sube tu planilla, elige la columna por la que agrupar y descarga cu\u00E1ntas filas hay de cada valor, con opci\u00F3n de sumar o promediar una segunda columna. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"group-by":{"type":"string","description":"Columna por la que se agrupa. La categor\u00EDa: regi\u00F3n, vendedor, mes, estado. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"measure":{"type":"string","description":"Columna que se resume. Opcional. D\u00E9jala vac\u00EDa para s\u00F3lo contar filas por grupo. Indica el nombre de la cabecera, o la posici\u00F3n de la columna empezando en 1."},"aggregate":{"type":"string","description":"C\u00F3mo se resume. S\u00F3lo se aplica si elegiste una columna que resumir.","enum":["sum","average","min","max"],"default":"sum"},"sort":{"type":"string","description":"Orden del resultado.","enum":["count-desc","count-asc","label"],"default":"count-desc"},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file","group-by"],"description":"Cuenta cu\u00E1ntas veces aparece cada valor de una columna: una tabla din\u00E1mica en un clic. Sube tu planilla, elige la columna por la que agrupar y descarga cu\u00E1ntas filas hay de cada valor, con opci\u00F3n de sumar o promediar una segunda columna. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/highlight-duplicates/run":{"post":{"operationId":"run_highlight_duplicates","summary":"Resaltar duplicados en Excel","description":"Marca con color las filas o celdas repetidas, sin borrarlas, para que las revises t\u00FA. Sube tu planilla y desc\u00E1rgala con las filas repetidas sombreadas en color y numeradas por grupo. No se elimina ninguna fila: solo se marcan para revisar.","tags":["An\u00E1lisis y comparaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"compare-columns":{"type":"array","items":{"type":"string"},"description":"Columnas que definen un duplicado. Sep\u00E1ralas con comas. D\u00E9jalo vac\u00EDo para comparar la fila entera. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas.","default":false},"trim":{"type":"boolean","description":"Ignorar los espacios sobrantes.","default":true},"add-group-column":{"type":"boolean","description":"A\u00F1adir una columna de grupo. Numera cada conjunto de duplicados. Es el respaldo que sobrevive si luego exportas a CSV, donde no hay color.","default":true},"only-duplicates":{"type":"boolean","description":"Dejar s\u00F3lo las filas duplicadas. Descarta las filas \u00FAnicas y conserva \u00FAnicamente las que se repiten.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Marca con color las filas o celdas repetidas, sin borrarlas, para que las revises t\u00FA. Sube tu planilla y desc\u00E1rgala con las filas repetidas sombreadas en color y numeradas por grupo. No se elimina ninguna fila: solo se marcan para revisar."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"compare-columns":{"type":"string","description":"Columnas que definen un duplicado. Sep\u00E1ralas con comas. D\u00E9jalo vac\u00EDo para comparar la fila entera. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"case-sensitive":{"type":"boolean","description":"Distinguir may\u00FAsculas y min\u00FAsculas.","default":false},"trim":{"type":"boolean","description":"Ignorar los espacios sobrantes.","default":true},"add-group-column":{"type":"boolean","description":"A\u00F1adir una columna de grupo. Numera cada conjunto de duplicados. Es el respaldo que sobrevive si luego exportas a CSV, donde no hay color.","default":true},"only-duplicates":{"type":"boolean","description":"Dejar s\u00F3lo las filas duplicadas. Descarta las filas \u00FAnicas y conserva \u00FAnicamente las que se repiten.","default":false},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Marca con color las filas o celdas repetidas, sin borrarlas, para que las revises t\u00FA. Sube tu planilla y desc\u00E1rgala con las filas repetidas sombreadas en color y numeradas por grupo. No se elimina ninguna fila: solo se marcan para revisar."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/data-quality/run":{"post":{"operationId":"run_data_quality","summary":"Informe de calidad de datos","description":"Detecta nulos, tipos inconsistentes y valores at\u00EDpicos, y te dice en qu\u00E9 columna est\u00E1 el problema. Sube tu planilla y descarga un informe por columna con vac\u00EDos, % de vac\u00EDos, espacios sobrantes, n\u00FAmeros como texto y valores distintos, m\u00E1s aviso de filas repetidas. La primera fila del archivo debe contener los nombres de las columnas.","tags":["An\u00E1lisis y comparaci\u00F3n"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos nombran cada fila del informe.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Detecta nulos, tipos inconsistentes y valores at\u00EDpicos, y te dice en qu\u00E9 columna est\u00E1 el problema. Sube tu planilla y descarga un informe por columna con vac\u00EDos, % de vac\u00EDos, espacios sobrantes, n\u00FAmeros como texto y valores distintos, m\u00E1s aviso de filas repetidas. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos. Los t\u00EDtulos nombran cada fila del informe.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Detecta nulos, tipos inconsistentes y valores at\u00EDpicos, y te dice en qu\u00E9 columna est\u00E1 el problema. Sube tu planilla y descarga un informe por columna con vac\u00EDos, % de vac\u00EDos, espacios sobrantes, n\u00FAmeros como texto y valores distintos, m\u00E1s aviso de filas repetidas. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/pdf-to-excel/run":{"post":{"operationId":"run_pdf_to_excel","summary":"Extraer tablas de un PDF a Excel","description":"Reconstruye en una planilla las tablas que est\u00E1n atrapadas dentro de un PDF. Sube un PDF con tablas y descarga una planilla de Excel con las filas y columnas reconstruidas.","tags":["Utilidades avanzadas"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .pdf."},"pages":{"type":"string","description":"P\u00E1ginas. Por ejemplo \u00AB1-3,5\u00BB. D\u00E9jalo vac\u00EDo para todas."},"one-sheet-per-page":{"type":"boolean","description":"Una hoja por p\u00E1gina. Sin esto, todas las p\u00E1ginas se juntan en una sola tabla continua.","default":false},"detect-types":{"type":"boolean","description":"Detectar n\u00FAmeros y fechas. Convierte a n\u00FAmero lo que lo parezca, para poder sumar y ordenar en Excel.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Reconstruye en una planilla las tablas que est\u00E1n atrapadas dentro de un PDF. Sube un PDF con tablas y descarga una planilla de Excel con las filas y columnas reconstruidas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .pdf."},"pages":{"type":"string","description":"P\u00E1ginas. Por ejemplo \u00AB1-3,5\u00BB. D\u00E9jalo vac\u00EDo para todas."},"one-sheet-per-page":{"type":"boolean","description":"Una hoja por p\u00E1gina. Sin esto, todas las p\u00E1ginas se juntan en una sola tabla continua.","default":false},"detect-types":{"type":"boolean","description":"Detectar n\u00FAmeros y fechas. Convierte a n\u00FAmero lo que lo parezca, para poder sumar y ordenar en Excel.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Reconstruye en una planilla las tablas que est\u00E1n atrapadas dentro de un PDF. Sube un PDF con tablas y descarga una planilla de Excel con las filas y columnas reconstruidas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/consolidate-monthly/run":{"post":{"operationId":"run_consolidate_monthly","summary":"Consolidar planillas mensuales","description":"Junta doce archivos mensuales en un consolidado anual, con sus totales calculados. Sube tus planillas mensuales y descarga una sola tabla con los valores sumados por producto, cliente o cuenta. La primera fila del archivo debe contener los nombres de las columnas.","tags":["Utilidades avanzadas"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false},"minItems":1,"maxItems":20,"description":"Archivos de entrada, hasta 20. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"all-sheets":{"type":"boolean","description":"Usar todas las hojas de cada archivo. Act\u00EDvalo si cada mes es una pesta\u00F1a dentro de un mismo libro. Desact\u00EDvalo para usar s\u00F3lo la primera hoja de cada archivo.","default":true},"key-columns":{"type":"array","items":{"type":"string"},"description":"Columnas que identifican cada registro. Aquello por lo que se acumula: producto, cliente, cuenta. Sep\u00E1ralas con comas. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"value-columns":{"type":"array","items":{"type":"string"},"description":"Columnas que se suman. D\u00E9jalo vac\u00EDo para sumar autom\u00E1ticamente todas las columnas num\u00E9ricas que no sean clave. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"add-count":{"type":"boolean","description":"A\u00F1adir el n\u00FAmero de registros por grupo. \u00DAtil para saber sobre cu\u00E1ntas filas se calcul\u00F3 cada total.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files","key-columns"],"description":"Junta doce archivos mensuales en un consolidado anual, con sus totales calculados. Sube tus planillas mensuales y descarga una sola tabla con los valores sumados por producto, cliente o cuenta. La primera fila del archivo debe contener los nombres de las columnas."}},"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"},"description":"Archivos de entrada, hasta 20. Formatos admitidos: .xlsx, .xls, .csv."},"has-header":{"type":"boolean","description":"La primera fila son los t\u00EDtulos.","default":true},"all-sheets":{"type":"boolean","description":"Usar todas las hojas de cada archivo. Act\u00EDvalo si cada mes es una pesta\u00F1a dentro de un mismo libro. Desact\u00EDvalo para usar s\u00F3lo la primera hoja de cada archivo.","default":true},"key-columns":{"type":"string","description":"Columnas que identifican cada registro. Aquello por lo que se acumula: producto, cliente, cuenta. Sep\u00E1ralas con comas. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"value-columns":{"type":"string","description":"Columnas que se suman. D\u00E9jalo vac\u00EDo para sumar autom\u00E1ticamente todas las columnas num\u00E9ricas que no sean clave. Nombres de cabecera, o posiciones empezando en 1. Vac\u00EDo significa todas."},"add-count":{"type":"boolean","description":"A\u00F1adir el n\u00FAmero de registros por grupo. \u00DAtil para saber sobre cu\u00E1ntas filas se calcul\u00F3 cada total.","default":true},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["files","key-columns"],"description":"Junta doce archivos mensuales en un consolidado anual, con sus totales calculados. Sube tus planillas mensuales y descarga una sola tabla con los valores sumados por producto, cliente o cuenta. La primera fila del archivo debe contener los nombres de las columnas."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/remove-sheet-protection/run":{"post":{"operationId":"run_remove_sheet_protection","summary":"Quitar la protecci\u00F3n de hoja en Excel","description":"Elimina la protecci\u00F3n de hoja de TUS PROPIOS archivos cuando has perdido la contrase\u00F1a. Sube un .xlsx con la hoja protegida y desc\u00E1rgalo desbloqueado, con las f\u00F3rmulas y el formato intactos.","tags":["Utilidades avanzadas"],"parameters":[{"name":"download","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"Con true se devuelve el archivo tal cual en vez de un JSON con el contenido en base64."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"object","properties":{"name":{"type":"string","description":"Nombre del archivo con su extensi\u00F3n, por ejemplo ventas.xlsx. De la extensi\u00F3n sale el formato."},"contentBase64":{"type":"string","contentEncoding":"base64","description":"Contenido del archivo codificado en base64."}},"required":["name","contentBase64"],"additionalProperties":false,"description":"Archivo de entrada. Formatos admitidos: .xlsx."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Elimina la protecci\u00F3n de hoja de TUS PROPIOS archivos cuando has perdido la contrase\u00F1a. Sube un .xlsx con la hoja protegida y desc\u00E1rgalo desbloqueado, con las f\u00F3rmulas y el formato intactos."}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Archivo de entrada. Formatos admitidos: .xlsx."},"language":{"type":"string","enum":["es","en"],"description":"Idioma de los mensajes y de los nombres de archivo generados."}},"additionalProperties":false,"required":["file"],"description":"Elimina la protecci\u00F3n de hoja de TUS PROPIOS archivos cuando has perdido la contrase\u00F1a. Sube un .xlsx con la hoja protegida y desc\u00E1rgalo desbloqueado, con las f\u00F3rmulas y el formato intactos."}}}},"responses":{"200":{"description":"Procesamiento correcto.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResponse"}}}},"400":{"description":"Falta un archivo, el formato no se admite o una opci\u00F3n no es v\u00E1lida.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"El archivo de entrada o el resultado superan el tama\u00F1o m\u00E1ximo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Se agot\u00F3 la cuota de ejecuciones por hora.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"El servidor est\u00E1 procesando su m\u00E1ximo de trabajos simult\u00E1neos. Reintenta en unos segundos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}