API: Medios de Vault y cargas firmadas
El Vault guarda las fotos, videos y notas de voz de una creadora, organizados en carpetas. Cada elemento es Free, Teaser o Paid con un precio en Stars. Los archivos nunca viajan a través de la API: pides una URL de carga firmada, envías el archivo allí y luego confirmas.
Endpoints #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /media | Listar medios (creator_id= obligatorio, folder_id=, type=photo,video,voice, access=free,teaser,paid) | can_setup | Planned |
| POST | /media/uploads | Obtener una URL firmada para subir un archivo (válida 15 minutos) | can_setup | Planned |
| POST | /media/uploads/{upload_id}/complete | Confirmar la carga; el medio se crea y procesa | can_setup | Planned |
| GET | /media/{id} | Un medio, su vista previa y dónde se usa | can_setup | Planned |
| PATCH | /media/{id} | Cambiar su descripción, acceso, precio o carpeta | can_setup | Planned |
| DELETE | /media/{id} | Eliminarlo (rechazado si un paso de script lo usa) | can_setup | Planned |
| GET | /media/folders | Carpetas del Vault de una creadora | can_setup | Planned |
| POST | /media/folders | Crear una carpeta | can_setup | Planned |
| PATCH | /media/folders/{id} | Renombrar o mover una carpeta | can_setup | Planned |
| DELETE | /media/folders/{id} | Eliminar una carpeta vacía | can_setup | Planned |
El objeto media #
{
"id": "med_5521",
"creator_id": "cr_lea",
"type": "photo",
"status": "ready",
"folder_id": "vf_3",
"access": "paid",
"stars": 300,
"description": "Beach, golden hour, white bikini",
"preview_url": "https://cdn.lanachat.ai/w/7Hq2/cr_lea/med_5521/preview.jpg",
"created_at": "2026-10-06T14:21:40Z"
}
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Comienza con med_ |
creator_id | string | De quién es el Vault |
type | string | photo, video o voice |
status | string | processing, ready o failed (con motivo) |
folder_id | string o null | Carpeta del Vault |
access | string | free, teaser o paid |
stars | number o null | Precio en Stars, obligatorio si access es paid (1 a 100,000) |
description | string o null | Ayuda a la IA a elegir el medio correcto; nunca se muestra al fan |
preview_url | string o null | Vista previa, una vez que el medio está ready |
created_at | string | ISO 8601, UTC |
Medios #
Listar medios #
GET /media · can_setup
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
creator_id | string | Sí | La creadora |
folder_id | string | No | Solo esta carpeta |
type | string | No | photo, video o voice; varios separados por comas |
access | string | No | free, teaser o paid; varios separados por comas |
limit, cursor | number, string | No | Paginación |
curl "https://api.lanachat.ai/v1/media?creator_id=cr_lea&type=photo&access=paid" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
{
"data": [
{ "id": "med_5522", "creator_id": "cr_lea", "type": "photo", "status": "ready", "folder_id": "vf_3", "access": "paid", "stars": 250, "description": "Mirror, black dress", "preview_url": "https://cdn.lanachat.ai/w/7Hq2/cr_lea/med_5522/preview.jpg", "created_at": "2026-10-06T14:25:10Z" },
{ "id": "med_5521", "creator_id": "cr_lea", "type": "photo", "status": "ready", "folder_id": "vf_3", "access": "paid", "stars": 300, "description": "Beach, golden hour, white bikini", "preview_url": "https://cdn.lanachat.ai/w/7Hq2/cr_lea/med_5521/preview.jpg", "created_at": "2026-10-06T14:21:40Z" }
],
"next_cursor": null
}
Sin creator_id la API responde 400.
Subir un archivo #
Tres llamadas: pides una URL firmada, envías el archivo allí, confirmas.
Paso 1. POST /media/uploads · can_setup
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
creator_id | string | Sí | A quién pertenece el Vault que lo recibe |
file_name | string | Sí | Nombre del archivo, por ejemplo beach-01.jpg |
content_type | string | Sí | Por ejemplo image/jpeg o video/mp4 |
size_bytes | number | Sí | Tamaño del archivo, hasta 2 GB |
folder_id | string | No | Carpeta del Vault donde ponerlo |
curl -X POST https://api.lanachat.ai/v1/media/uploads \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"creator_id": "cr_lea", "file_name": "beach-01.jpg", "content_type": "image/jpeg", "size_bytes": 2483201, "folder_id": "vf_3"}'
{
"upload_id": "up_7781",
"url": "https://uploads.lanachat.ai/w/7Hq2/up_7781?X-Signature=…&X-Expires=1759760100",
"method": "PUT",
"headers": { "Content-Type": "image/jpeg" },
"expires_at": "2026-10-06T14:35:00Z"
}
La URL es válida 15 minutos.
Paso 2. Envía el archivo con PUT a url, con exactamente los headers indicados (sin encabezado Authorization).
curl -X PUT "https://uploads.lanachat.ai/w/7Hq2/up_7781?X-Signature=…&X-Expires=1759760100" \
-H "Content-Type: image/jpeg" --data-binary @beach-01.jpg
Paso 3. POST /media/uploads/{upload_id}/complete · can_setup
curl -X POST https://api.lanachat.ai/v1/media/uploads/up_7781/complete \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)"
{
"id": "med_5521",
"creator_id": "cr_lea",
"type": "photo",
"status": "processing",
"folder_id": "vf_3",
"access": "paid",
"stars": null,
"description": null,
"preview_url": null,
"created_at": "2026-10-06T14:21:40Z"
}
El status pasa de processing a ready (se crean vistas previas y la copia para Telegram) o failed con un motivo. Un webhook media.ready te avisa cuándo, consulta Webhooks. Se aceptan: JPEG, PNG, HEIC, MP4, MOV, OGG y M4A, hasta 2 GB.
Obtener un medio #
GET /media/{id} · can_setup
curl https://api.lanachat.ai/v1/media/med_5521 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La respuesta es el objeto media, con su vista previa y dónde se usa. Un id desconocido responde 404.
Precio y descripción #
PATCH /media/{id} · can_setup
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
access | string | No | free, teaser o paid |
stars | number | Cuando access es paid | 1 a 100,000 |
description | string | No | Qué muestra, para la IA |
folder_id | string o null | No | Moverlo a otra carpeta |
curl -X PATCH https://api.lanachat.ai/v1/media/med_5521 \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"access": "paid", "stars": 300, "description": "Beach, golden hour, white bikini"}'
La respuesta es el medio actualizado. stars es obligatorio cuando access es paid (1 a 100,000), si no la API responde 400. La descripción ayuda a la IA a elegir el medio correcto; nunca se muestra al fan.
Eliminar un medio #
DELETE /media/{id} · can_setup
curl -X DELETE https://api.lanachat.ai/v1/media/med_5521 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Un medio que un paso de script aún usa es rechazado (409): quítalo del script primero.
Carpetas #
Listar carpetas #
GET /media/folders · can_setup
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
creator_id | string | Sí | De quién es el Vault |
curl "https://api.lanachat.ai/v1/media/folders?creator_id=cr_lea" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Crear una carpeta #
POST /media/folders · can_setup
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
creator_id | string | Sí | De quién es el Vault |
name | string | Sí | Nombre de la carpeta |
curl -X POST https://api.lanachat.ai/v1/media/folders \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"creator_id": "cr_lea", "name": "Beach"}'
Renombrar o mover una carpeta #
PATCH /media/folders/{id} · can_setup
curl -X PATCH https://api.lanachat.ai/v1/media/folders/vf_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Beach, summer"}'
Eliminar una carpeta #
DELETE /media/folders/{id} · can_setup
curl -X DELETE https://api.lanachat.ai/v1/media/folders/vf_3 \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Solo se puede eliminar una carpeta vacía; de lo contrario la API responde 409.