---
title: Files y Uploads | RunAPI
description: Cree, liste, descargue y elimine Files persistentes, o ensamble un File
  a partir de partes de carga multiparte.
url: https://runapi.ai/es/docs/resources/files.md
canonical: https://runapi.ai/es/docs/resources/files
locale: es
---

> Versión HTML: https://runapi.ai/es/docs/resources/files
> Índice del sitio para agentes: https://runapi.ai/llms.txt

# Files y Uploads

La API de archivos almacena archivos `user_data`, `batch` y `batch_output` inmutables con alcance de cuenta, y devuelve IDs de archivo estables en lugar de URLs de almacenamiento. Usa un ID de archivo cuando una API acepte un recurso File reutilizable, y usa el endpoint de contenido cuando tu aplicación necesite los bytes exactos almacenados.

## Elegir un flujo de Upload

* Use `POST /v1/files` para crear un archivo a partir de una única solicitud
  multiparte. Un archivo `user_data` completado puede contener hasta
  `52,428,800` bytes.
* Use `POST /v1/files` con `purpose=batch` para una entrada de lote directa de
  hasta `95,000,000` bytes.
* Use la API de Uploads para enviar partes antes de componer el archivo final.
  Cada parte puede contener hasta `67,108,864` bytes; un archivo `user_data`
  completado está limitado a `52,428,800` bytes y un archivo `batch` completado
  a `209,715,200` bytes. Una carga no finalizada expira después de una hora.
* Los archivos activos y las reservas en curso comparten un límite de
  almacenamiento de cuenta de `5,368,709,120` bytes.

`POST /api/v1/files` es un flujo de carga temporal independiente que devuelve una URL temporal. SDK `files.create` y CLI `runapi files create` continúan usando ese flujo. Usa `files.createFile` o `files.create_file`, o CLI
`runapi files create-file`, cuando necesites un objeto File persistente.

## Autenticar una solicitud

Files y Uploads utilizan una clave de API estándar de RunAPI. Envíela como token Bearer:

```shell
export RUNAPI_API_KEY="runapi_..."
```

Cada solicitud de File, Upload, Part y contenido está limitada a la cuenta autenticada. Un ID perteneciente a otra cuenta devuelve `404` sin revelar si ese recurso existe.

## Crear un File con un cliente compatible

Apunte un cliente compatible con OpenAI a la URL base `/v1` de RunAPI. No
se requieren campos de solicitud específicos de RunAPI:

```python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["RUNAPI_API_KEY"],
    base_url="https://runapi.ai/v1",
)

with open("knowledge.pdf", "rb") as source:
    file = client.files.create(file=source, purpose="user_data")

metadata = client.files.retrieve(file.id)
client.files.content(file.id).write_to_file("knowledge-copy.pdf")
client.files.delete(file.id)
```

El archivo devuelto nunca contiene un identificador de almacenamiento, un backend ni una URL de portador.

## Referencia de la API

* La [API de archivos persistentes](https://runapi.ai/es/docs/api/protocol/files.md) cubre el objeto
  File y las operaciones de creación, listado, recuperación, contenido y
  eliminación.
* La [API de Uploads](https://runapi.ai/es/docs/api/protocol/uploads.md) cubre el objeto Upload y las
  operaciones de creación, adición de parte, finalización y cancelación.
* La [API de Batches](https://runapi.ai/es/docs/api/protocol/batches.md) cubre la creación, el estado,
  el listado y la cancelación de lotes de moderación.

## Ejecutar Moderación en un Batch

Cree un File JSONL de entrada con una solicitud de moderación por línea. Cada
línea utiliza la forma de Batch compatible: `custom_id`, `method`, `url` establecida
en `/v1/moderations`, y un `body` que contiene el modelo de moderación y
la entrada. Un File con `purpose=batch` puede contener hasta 50.000 solicitudes. La
capacidad de Batch acepta actualmente el endpoint `/v1/moderations` con una
ventana de finalización de `24h`.

```shell
INPUT_FILE_ID=$(curl -sS https://runapi.ai/v1/files \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -F purpose=batch \
  -F file=@moderation.jsonl | jq -r .id)

BATCH_ID=$(curl -sS https://runapi.ai/v1/batches \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --arg file "$INPUT_FILE_ID" '{input_file_id:$file,endpoint:"/v1/moderations",completion_window:"24h"}')" \
  | jq -r .id)

curl -sS "https://runapi.ai/v1/batches/$BATCH_ID" \
  -H "Authorization: Bearer $RUNAPI_API_KEY"
```

Usa `GET /v1/batches` para listar el trabajo, repite `GET /v1/batches/{batch_id}`
hasta que el estado sea terminal, o llama a `POST
/v1/batches/{batch_id}/cancel` mientras aún esté en ejecución. La salida completada
y el JSONL de errores se exponen como Files `batch_output`; recupera
sus metadatos con `GET /v1/files/{file_id}` y los bytes exactos con `GET
/v1/files/{file_id}/content`.

## Ciclo de vida de carga multiparte

Cree un Upload con el recuento final de bytes, el nombre de archivo, el tipo MIME y
`purpose=user_data`. Añada una o más partes y pase sus IDs a
`complete` en el orden de composición. La finalización devuelve el Upload con su
File terminado.

```shell
UPLOAD_ID=$(curl -sS https://runapi.ai/v1/uploads \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"bytes":1048576,"filename":"archive.bin","mime_type":"application/octet-stream","purpose":"user_data"}' \
  | jq -r .id)

PART_ID=$(curl -sS "https://runapi.ai/v1/uploads/$UPLOAD_ID/parts" \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -F data=@archive.part-01 | jq -r .id)

curl -sS "https://runapi.ai/v1/uploads/$UPLOAD_ID/complete" \
  -H "Authorization: Bearer $RUNAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"part_ids\":[\"$PART_ID\"]}"
```

Cancele un Upload sin terminar con `POST /v1/uploads/{upload_id}/cancel`.
Repetir la misma intención de finalización o cancelación es seguro; una
finalización, cancelación o vencimiento en competencia devuelve `409
upload_state_conflict` cuando otro resultado terminal ya ha prevalecido.

## Recursos de CLI y SDK

La CLI expone el ciclo de vida completo:

```shell
runapi files create-file knowledge.pdf
runapi files list --order desc
runapi files retrieve file_123
runapi files content file_123 --output knowledge-copy.pdf
runapi files delete file_123

runapi uploads create --bytes 1048576 --filename archive.bin --mime-type application/octet-stream
runapi uploads add-part upload_123 archive.part-01
runapi uploads complete upload_123 --part-id part_123
runapi uploads cancel upload_123
```

Cada cliente de proveedor expone `files` y `uploads`. JavaScript y PHP
usan `createFile` / `deleteFile` / `addPart`; Python y Ruby usan
`create_file` / `delete_file` / `add_part`; Go usa `CreateFile` /
`DeleteFile` / `AddPart`; Java usa `createFile` / `deleteFile` /
`addPart`. List, retrieve, content, create, complete y cancel siguen
la convención de nombres habitual de cada lenguaje. Consulte
[SDKs](https://runapi.ai/es/docs/resources/sdks.md) para la instalación de paquetes.

## Comportamiento del ciclo de vida

El contenido de un File es inmutable. Eliminar un File lo retira de los
listados activos de inmediato y programa la limpieza del almacenamiento. La finalización de la carga
combina las partes únicamente en el orden indicado, y una finalización exitosa
crea un único File. Conserve el orden original de los IDs de parte al reintentar
una respuesta de finalización incierta.

---

## Más de RunAPI

- [Inicio](https://runapi.ai/es/.md)
- [Catálogo de modelos](https://runapi.ai/es/models.md)
- [Precios](https://runapi.ai/es/pricing.md)
- [Proveedores](https://runapi.ai/es/models)
- [Documentación](https://runapi.ai/es/docs/guides)
- [SDKs](https://runapi.ai/es/sdk.md)
- [CLI](https://runapi.ai/es/cli.md)
- [Servidor MCP](https://runapi.ai/es/mcp.md)
- [Claude Code vs Cursor](https://runapi.ai/es/claude-code-vs-cursor.md)
- [Configuración de Cursor API](https://runapi.ai/es/cursor-api-setup.md)
- [RunAPI vs OpenRouter](https://runapi.ai/es/openrouter-alternative.md)
- [Enterprise](https://runapi.ai/es/contact.md)
- [Contacto](https://runapi.ai/es/contact.md)
- [Términos](https://runapi.ai/es/terms.md)
- [Privacidad](https://runapi.ai/es/privacy.md)
- [Índice del sitio para agentes](https://runapi.ai/llms.txt)

Contacto: contact@runapi.ai

## Datos estructurados

```json
[
  {
    "@context": "https://schema.org",
    "inLanguage": "es",
    "@type": "WebSite",
    "name": "RunAPI",
    "url": "https://runapi.ai/es",
    "potentialAction": {
      "@type": "SearchAction",
      "target": {
        "@type": "EntryPoint",
        "urlTemplate": "https://runapi.ai/es/models?q={search_term_string}"
      },
      "query-input": "required name=search_term_string"
    }
  },
  {
    "@context": "https://schema.org",
    "inLanguage": "es",
    "@type": "Organization",
    "name": "RunAPI",
    "url": "https://runapi.ai/es",
    "logo": {
      "@type": "ImageObject",
      "url": "https://runapi.ai/esicon.svg"
    },
    "sameAs": [
      "https://github.com/runapi-ai"
    ]
  },
  {
    "@context": "https://schema.org",
    "inLanguage": "es",
    "@type": "TechArticle",
    "headline": "Files y Uploads",
    "description": "Cree, liste, descargue y elimine Files persistentes, o ensamble un File a partir de partes de carga multiparte.",
    "url": "https://runapi.ai/es/docs/resources/files",
    "mainEntityOfPage": "https://runapi.ai/es/docs/resources/files"
  }
]
```
