Subir Logo
Sube o actualiza el logo de tu organizacion. El logo aparecera en los PDFs de las facturas.
Endpoint
POST https://api.lummy.io/v1/branding/logo
| Entorno | URL |
|---|---|
| Producción | https://api.lummy.io/v1/branding/logo |
| Sandbox | https://sandbox.lummy.io/v1/branding/logo |
Formatos soportados
Se aceptan imagenes en formato PNG, JPEG y SVG con un tamano maximo de 2MB.
Headers
{
"Authorization": string,requerido
↳Token de autenticación Bearer (JWT) para validar la identidad del usuario y sus permisos de acceso.
"x-organization-id": string,requerido
↳Identificador único (UUID) de la organización donde se almacenará el logotipo.
↳Formato: uuid
"Content-Type": stringrequerido
↳Tipo de contenido de la petición. Debe ser multipart/form-data para permitir la carga de archivos binarios.
↳Valores permitidos:
"multipart/form-data"}
Body (multipart/form-data)
{
"logo": filerequerido
↳Archivo de imagen del logotipo de la organización. Formatos permitidos: PNG, JPG, JPEG, SVG. Tamaño máximo: 2MB. Dimensiones recomendadas: 200x200 píxeles o superior. Se recomienda usar imágenes con fondo transparente (PNG) para mejor integración en los PDFs. Los archivos SVG ofrecen mejor calidad al escalar.
}
Ejemplos de Codigo
- cURL
- Node.js (TypeScript)
- Python
- PHP (Guzzle)
curl -X POST https://sandbox.lummy.io/branding/logo \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "x-organization-id: ${LUMMY_ORG_ID}" \
-F "logo=@/path/to/logo.png"
import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';
interface BrandingResponse {
id: string;
organizationId: string;
logoUrl: string | null;
primaryColor: string | null;
secondaryColor: string | null;
createdAt: string;
updatedAt: string;
}
async function subirLogo(filePath: string): Promise<BrandingResponse> {
const API_URL = 'https://sandbox.lummy.io/branding/logo';
const ACCESS_TOKEN = process.env.ACCESS_TOKEN!;
const ORG_ID = process.env.LUMMY_ORG_ID!;
const form = new FormData();
form.append('logo', fs.createReadStream(filePath));
const response = await axios.post<BrandingResponse>(API_URL, form, {
headers: {
...form.getHeaders(),
'Authorization': `Bearer ${ACCESS_TOKEN}`,
'x-organization-id': ORG_ID,
},
});
console.log('Logo subido:', response.data.logoUrl);
return response.data;
}
subirLogo('./logo.png');
Dependencias
npm install axios form-data
import os
import requests
def subir_logo(file_path: str):
api_url = "https://sandbox.lummy.io/branding/logo"
access_token = os.getenv("ACCESS_TOKEN")
org_id = os.getenv("LUMMY_ORG_ID")
headers = {
"Authorization": f"Bearer {access_token}",
"x-organization-id": org_id,
}
with open(file_path, "rb") as f:
files = {"logo": f}
response = requests.post(api_url, headers=headers, files=files)
response.raise_for_status()
data = response.json()
print(f"Logo subido: {data['logoUrl']}")
return data
if __name__ == "__main__":
subir_logo("./logo.png")
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
function subirLogo(string $filePath): array
{
$client = new Client([
'base_uri' => 'https://sandbox.lummy.io',
'headers' => [
'Authorization' => 'Bearer ' . getenv('ACCESS_TOKEN'),
'x-organization-id' => getenv('LUMMY_ORG_ID'),
],
]);
$response = $client->post('/branding/logo', [
'multipart' => [
[
'name' => 'logo',
'contents' => fopen($filePath, 'r'),
'filename' => basename($filePath),
],
],
]);
$data = json_decode($response->getBody(), true);
echo "Logo subido: " . $data['logoUrl'] . "\n";
return $data;
}
subirLogo('./logo.png');
Respuestas
200 OK
Logo subido exitosamente.
{
"id": string,opcional
↳Identificador único del registro de branding en el sistema.
↳Formato: uuid
↳Ejemplo:
"550e8400-e29b-41d4-a716-446655440000" "organizationId": string,opcional
↳Identificador único de la organización a la que pertenece este branding.
↳Formato: uuid
↳Ejemplo:
"123e4567-e89b-12d3-a456-426614174000" "logoUrl": string,opcional
↳URL completa del logotipo recién subido, almacenado en Amazon S3. Este logotipo aparecerá en el encabezado de los PDFs de las facturas generadas.
↳Ejemplo:
"https://bucket.s3.region.amazonaws.com/organizations/uuid/branding/logo.png" "primaryColor": string,opcional
↳Color primario de la marca en formato hexadecimal. Retorna el valor existente si ya estaba configurado.
↳Patrón: ^#[0-9A-Fa-f]{6}$
↳Ejemplo:
"#4F46E5" "secondaryColor": string,opcional
↳Color secundario de la marca en formato hexadecimal. Retorna el valor existente si ya estaba configurado.
↳Patrón: ^#[0-9A-Fa-f]{6}$
↳Ejemplo:
"#10B981" "createdAt": string,opcional
↳Fecha y hora de creación del registro de branding en formato ISO 8601 (UTC).
↳Formato: date-time
↳Ejemplo:
"2025-01-15T10:30:00.000Z" "updatedAt": stringopcional
↳Fecha y hora de la última actualización del branding en formato ISO 8601 (UTC). Refleja el momento en que se subió el logotipo.
↳Formato: date-time
↳Ejemplo:
"2025-01-15T11:00:00.000Z"}
{
"requestId": "abc123-def456",
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"organizationId": "123e4567-e89b-12d3-a456-426614174000",
"logoUrl": "https://bucket.s3.region.amazonaws.com/organizations/uuid/branding/logo.png",
"primaryColor": "#4F46E5",
"secondaryColor": "#10B981",
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T11:00:00.000Z"
},
"timestamp": "2025-01-15T11:00:00.000Z",
"path": "/branding/logo",
"method": "POST"
}
400 Bad Request
{
"requestId": "abc123-def456",
"error": {
"message": "No se proporciono ningun archivo de logo",
"code": "BadRequestException",
"status": 400
},
"timestamp": "2025-01-15T10:30:00.000Z",
"path": "/branding/logo",
"method": "POST"
}
400 Bad Request (Archivo muy grande)
{
"requestId": "abc123-def456",
"error": {
"message": "El archivo excede el tamano maximo permitido (2MB)",
"code": "PayloadTooLargeException",
"status": 400
},
"timestamp": "2025-01-15T10:30:00.000Z",
"path": "/branding/logo",
"method": "POST"
}
Recomendaciones
- Usa imagenes con fondo transparente (PNG) para mejor integracion en los PDFs
- El tamano recomendado es de 200x200 pixeles o superior
- Los formatos SVG ofrecen mejor calidad al escalar