API de subida de Lumpa Posting
Dos endpoints para mandar contenido ya producido — videos renderizados y carruseles de imágenes — desde un proceso externo directo a un workspace de Lumpa Posting, donde queda pendiente de revisión humana. Nada de lo que se sube por esta API se publica solo en una red social.
🔑 Autentícate con el token del workspace
Cada request lleva un Bearer token ligado a un solo workspace — no hay sistema de API keys separado ni flujo OAuth.
Leer más →🎬 Sube un video renderizado
Manda un .mp4 y queda en el workspace como video Rendered, pendiente de aprobación.
Leer más →🖼️ Sube un carrusel de imágenes
Manda entre 2 y 10 imágenes en su orden final y se crea como Draft de publicación.
Leer más →🕒 Programa con anticipación
Opcionalmente manda scheduled_at + timezone para
precargar una fecha de publicación en cualquiera de los dos endpoints.
Autenticación
Los dos endpoints usan el mismo middleware. Manda el token como un header Bearer estándar — no existe un query parameter de API key ni una sesión por cookie.
Header del request
Authorization: Bearer <token> Accept: application/json
El token identifica al workspace directamente — todo lo que se suba con ese token
queda atribuido a ese workspace automáticamente. No existe un campo
workspace_id en el body, y un token nunca puede escribir en más de un
workspace.
Respuestas de error
| Status | Causa | Body |
|---|---|---|
| 401 | No se mandó el header Authorization |
{"message": "Falta el header Authorization: Bearer <token>."} |
| 401 | El token no coincide con ningún workspace | {"message": "Token inválido."} |
Subir video
Sube un video ya renderizado. Se guarda en almacenamiento de objetos (nunca toca
disco local) y crea un Video con status Rendered — el
mismo estado que tendría un video generado de forma nativa en
Lumpa Posting, así que pasa por la misma revisión humana antes de
publicarse.
Content-Type: multipart/form-data
Parámetros del body
| Campo | Tipo | Notas |
|---|---|---|
| videorequerido | file | video/mp4 o video/quicktime, máx. 500 MB |
| topicrequerido | string | Máx. 255 caracteres |
| aspect_ratioopcional | string | Uno de 9:16, 16:9, 1:1 — 9:16 por default |
| duration_secondsopcional | number | ≥ 0 |
| anchor_urlopcional | url | Artículo o herramienta en la que se basa el video |
| scriptopcional | array | Datos estructurados del guion, se guardan tal cual |
| post_bodyopcional | string | Copy del post; si no viene, usa topic al publicar |
| scheduled_atopcional | date | Ver Programación y zonas horarias |
| timezoneopcional | tz | Ver Programación y zonas horarias |
Respuesta · 201 Created
{
"id": 123,
"status": "rendered",
"public_url": "https://.../videos/....mp4",
"review_url": "https://www.lumpaposting.com/videos/123/review"
}
Reemplazar video
Cambia el archivo de un video que ya existe — por ejemplo, uno que se volvió a renderizar con música de fondo. Solo se reemplaza el archivo: el status, el copy, la fecha programada y las cuentas autorizadas se conservan, así que un video ya programado se publica a su hora con el archivo nuevo. El archivo anterior se borra después de guardar el nuevo.
Content-Type: multipart/form-data
Parámetros del body
| Campo | Tipo | Notas |
|---|---|---|
| videorequerido | file | Mismas reglas que en Subir video |
| duration_secondsopcional | number | Si se omite se conserva la duración anterior |
Errores específicos
| Caso | Status |
|---|---|
| El video es de otro workspace o no existe | 404 |
| El video ya se está publicando o ya se publicó | 409 |
Respuesta · 200 OK
{
"id": 123,
"status": "approved",
"public_url": "https://.../videos/....mp4",
"previous_url": "https://.../videos/....mp4",
"review_url": "https://www.lumpaposting.com/videos/123/review"
}
Subir carrusel
Sube un set de imágenes en su orden final. Siempre crea el post como
Draft, aunque venga scheduled_at — una persona sigue
eligiendo cuentas y confirmando el envío en el compositor antes de que quede
programado de verdad.
Content-Type: multipart/form-data
Parámetros del body
| Campo | Tipo | Notas |
|---|---|---|
| images[]requerido | file[] | 2–10 archivos, image/jpeg · png · webp, máx. 20 MB c/u |
| topicrequerido | string | Máx. 255 caracteres |
| post_bodyopcional | string | Usa topic si no viene |
| link_urlopcional | url | |
| scheduled_atopcional | date | Precarga la fecha del draft — ver Programación y zonas horarias |
| timezoneopcional | tz | Ver Programación y zonas horarias |
Respuesta · 201 Created
{
"id": 456,
"status": "draft",
"media": [
"https://.../images/...-0-....jpg",
"https://.../images/...-1-....jpg"
],
"review_url": "https://www.lumpaposting.com/social-posts/456/edit"
}
Errores
Los dos endpoints comparten el mismo formato para fallas de autenticación y validación.
| Status | Significado |
|---|---|
| 401 | Falta el Bearer token o es inválido — ver Autenticación |
| 422 | Un campo no pasó validación. Formato estándar de Laravel: {"message", "errors": {"campo": ["…"]}} |
| 201 | Creado — el video o carrusel se aceptó y quedó en cola de revisión |
Programación y zonas horarias
Un scheduled_at sin más, como 2026-08-25 14:00, es
ambiguo por sí solo — no dice si es hora de Ciudad de México, UTC o cualquier otra.
Los dos endpoints lo resuelven igual:
- Se interpreta en el campo
timezone, si mandas uno. - Si no, en la zona horaria configurada del workspace.
- Si tampoco hay, en la zona horaria default de la aplicación.
El valor resuelto se convierte a UTC antes de guardarse — la base de datos siempre
está en UTC, la conversión pasa solo en la frontera. Si omites
scheduled_at en un video, lo recoge el scheduler de goteo en vez de
necesitar una fecha explícita.
Cliente de referencia
El pipeline de video edicion-de-videos ya llama
POST /api/videos desde un cliente
pequeño en Python — sirve como ejemplo de implementación real más allá de esta
referencia.
data = {"topic": topic, "aspect_ratio": aspect_ratio} files = {"video": (video_path.name, f, "video/mp4")} requests.post( f"https://www.lumpaposting.com/api/videos", headers={"Authorization": f"Bearer {token}", "Accept": "application/json"}, data=data, files=files, )