---
title: "Adjunta un archivo a un item (máx. 25MB). Envía multipart `file`, O un body JSON { url, filename } para adjuntar desde una URL pública. La respuesta incluye un `download_url` firmado."
method: POST
path: "/items/{itemId}/files"
tags: ["Items"]
---

# Adjunta un archivo a un item (máx. 25MB). Envía multipart \`file\`, O un body JSON { url, filename } para adjuntar desde una URL pública. La respuesta incluye un \`download_url\` firmado.

`POST /items/{itemId}/files`

## Request

- Base URL: `https://api.met.meteor.com.co/api/v1`
- URL: `https://api.met.meteor.com.co/api/v1/items/{itemId}/files`
- Auth: one of:
  - `bearer` (a scheme the document does not define)
  - HTTP bearer

Adjunta un archivo al item, con tope de **25 MB**. Acepta `multipart` con el campo `file` o un cuerpo JSON, así que sirve tanto desde un formulario como desde un backend que ya tiene los bytes.

## Path parameters

- `itemId` number, required

## Response `201`

- object: Sobre en el que viaja toda respuesta correcta de la API. El recurso está en `data`. Los SDKs oficiales lo desenvuelven por ti; un cliente hecho a mano tiene que leer `.data`.
  - `success` true, required: Siempre `true` en una respuesta 2xx.
  - `data` ItemFileUploadResponseDto, required
    - `asset_id` string, nullable, required: Link al mismo archivo en la Mediateca del workspace. `null` en los adjuntos anteriores a la Mediateca.
    - `created_at` string, nullable, required
    - `created_by` number, nullable, required: Usuario que lo subió.
    - `download_url` string, nullable, required: URL de descarga **firmada y temporal** (vence a los 7 días). No es una URL pública y no sirve para guardar: el archivo vive en un bucket privado y esta firma caduca. Para un enlace estable, usa `GET /item-files/{fileId}/download`, que valida la sesión en cada llamada, o vuelve a pedir el archivo para recibir una firma nueva. `null` si la firma falló; el archivo igual quedó guardado.
    - `filename` string, required: Nombre saneado con el que se guardó en Storage (`{timestamp}-{nombre}`). No es el nombre que ve el usuario: ese es `original_name`.
    - `id` number, required
    - `item_id` number, required: Item al que está adjunto.
    - `mime_type` string, nullable, required
    - `original_name` string, required: Nombre legible, tal como se subió. Es el que se muestra y el que se descarga.
    - `size` number, nullable, required: Tamaño en bytes.
    - `storage_path` string, required: **La fuente de verdad del archivo.** La ruta dentro del bucket privado; es lo único estable. Guarda esto, no la URL: una URL firmada vence, y una URL pública vieja puede haber dejado de resolver cuando el objeto se privatizó.

## Other responses

- `400`: La request no es válida: un campo no pasa validación, falta un parámetro requerido o el recurso no admite la transición solicitada.
- `401`: API key ausente, inválida, revocada o expirada — o el workspace está bloqueado.
- `403`: La key está autenticada pero no puede ejecutar esta operación: scope faltante, capacidad deshabilitada, modo test restringido o recurso fuera de su cartera.
- `404`: El recurso no existe o no está disponible dentro del alcance de la key. No revela la existencia de recursos de otros tenants.
- `409`: La operación entra en conflicto con el estado actual o con un Idempotency-Key en uso. No reintentes con el mismo key y un body distinto.
- `429`: Se superó el límite por minuto de la key o la cuota del plan. Respeta `Retry-After`; el SDK ya reintenta solo.
- `500`: Error del servidor o del Met que ejecutaba. El SDK reintenta los 5xx con backoff.

---

[API](https://skmtc.dev/meteor/apis/met-public-api.md) · [All operations](https://skmtc.dev/meteor/apis/met-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/meteor/apis/met-public-api/revisions/5d9ca294295c?raw)
