Skip to content

Carpetas ​

Las carpetas organizan tus archivos subidos en el dashboard. Por defecto son solo metadatos — los archivos conservan sus propios CIDs y no se mueven en IPFS — pero también puedes crear un snapshot de una carpeta para materializarla como un directorio UnixFS real y obtener un único CID para todo el conjunto.

Cuándo crear un snapshot de una carpeta ​

Un snapshot de carpeta es un único CID de directorio IPFS que contiene todos los archivos de la carpeta, direccionables por nombre. Con él puedes:

  • Compartir toda la carpeta mediante una sola URL: https://ipfs.ninja/ipfs/{dirCid}/
  • Resolver https://ipfs.ninja/ipfs/{dirCid}/photo.jpg (o cualquier otro gateway) directamente
  • Colocar el CID en un contenthash de ENS para alojar un sitio estático
  • Usarlo como CID base de una colección NFT para que cada token haga referencia a ipfs://{dirCid}/<id>.json
  • Fijar el directorio en cualquier otro lugar — cualquier gateway IPFS del mundo sabe cómo resolver un CID de directorio UnixFS

Los snapshots son direccionados por contenido: contenidos de carpeta idénticos siempre producen el mismo CID. Volver a crear el snapshot de una carpeta que no has modificado devuelve el mismo CID que devolvió antes. Añadir, eliminar o renombrar un archivo produce un nuevo CID; el CID anterior permanece fijado y resoluble mientras no elimines sus archivos.

Crear carpeta ​

POST /folders

ParámetroTipoRequeridoDescripción
namestringSíNombre visible.
parentFolderIdstring | nullNoID de la carpeta padre para carpetas anidadas. Omítelo para una carpeta de nivel raíz.

Ejemplo ​

bash
curl -X POST https://api.ipfs.ninja/folders \
  -H "X-Api-Key: bws_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "name": "My NFT collection" }'

Devuelve:

json
{
  "folderId": "1f8e2c3a-…",
  "name": "My NFT collection",
  "parentFolderId": null,
  "createdAt": 1746360000000
}

Las carpetas recién creadas no tienen snapshot. El campo latestSnapshot aparece en la carpeta una vez que llamas a POST /folders/{id}/snapshot (ver más abajo) y en las respuestas posteriores de GET /folders.

Listar carpetas ​

GET /folders

Devuelve todas las carpetas de tu cuenta, tanto de nivel raíz como anidadas, con el CID del último snapshot de cada una (si existe).

json
[
  {
    "folderId": "1f8e2c3a-…",
    "name": "My NFT collection",
    "parentFolderId": null,
    "createdAt": 1746360000000,
    "fileCount": 42,
    "latestSnapshot": {
      "cid": "QmRZx5…",
      "takenAt": 1746421000000,
      "fileCount": 42
    }
  }
]

fileCount refleja el contenido actual de la carpeta; latestSnapshot.fileCount refleja el contenido en el momento del último snapshot. Si difieren, el CID del snapshot sigue resolviendo pero está desactualizado — vuelve a crear el snapshot para actualizarlo.

Mover un archivo a una carpeta ​

PUT /files/{cid}/move

ParámetroTipoRequeridoDescripción
folderIdstring | nullSíID de la carpeta destino, o null para mover el archivo a la raíz.
bash
curl -X PUT https://api.ipfs.ninja/files/Qm.../move \
  -H "X-Api-Key: bws_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "folderId": "1f8e2c3a-…" }'

Crear snapshot de una carpeta (obtener un CID de directorio UnixFS) ​

POST /folders/{folderId}/snapshot

Materializa la carpeta como un directorio UnixFS real en el cluster de IPFS y fija el resultado. Devuelve un único CID para toda la carpeta. Los nombres de los hijos provienen del fileName de cada archivo; los duplicados se resuelven automáticamente.

No se necesita cuerpo de solicitud; el parámetro de ruta identifica la carpeta.

Ejemplo ​

bash
curl -X POST https://api.ipfs.ninja/folders/1f8e2c3a-.../snapshot \
  -H "X-Api-Key: bws_your_api_key_here"

Devuelve:

json
{
  "ok": true,
  "folderId": "1f8e2c3a-…",
  "cid": "QmRZx5VgFHDsG7ECvaKkZBS4ydmkdAkDyaKyF71RYvh8",
  "fileCount": 42,
  "sizeBytes": 8421376,
  "takenAt": 1746421000000,
  "ipfsUrl": "https://ipfs.ninja/ipfs/QmRZx5.../"
}

El CID también se guarda en el registro de la carpeta, así que las siguientes llamadas a GET /folders lo devuelven como latestSnapshot.cid sin necesidad de otro snapshot.

Resolver un snapshot ​

Una vez que un snapshot está fijado, el CID del directorio resuelve a través de cualquier gateway IPFS. El patrón de URL más simple:

https://ipfs.ninja/ipfs/{dirCid}/         → listado de directorio
https://ipfs.ninja/ipfs/{dirCid}/photo.jpg → ese archivo en concreto

El cluster fija de forma recursiva, así que los hijos también son resolubles — incluso si más adelante eliminas el archivo original de tu cuenta, la copia del snapshot sobrevive porque es un pin independiente que recorre el directorio.

Volver a crear el snapshot ​

Volver a crear el snapshot de una carpeta sin cambios devuelve el mismo CID — los CIDs de directorio se direccionan por contenido, así que contenidos idénticos siempre producen el mismo hash, y la llamada de fijación del cluster reconoce el duplicado y no hace nada en su extremo.

Nota: la ruta de snapshot en sí no es gratuita aunque el resultado sea el mismo CID. Cada llamada lee de nuevo los bytes de cada archivo desde IPFS y los vuelve a subir como multipart al endpoint /add del cluster — ahí es donde ocurre el envoltorio con el directorio. Para carpetas típicas (≤100 archivos pequeños) esto se completa en unos segundos; para carpetas muy grandes, es preferible llamar al snapshot solo cuando el contenido realmente ha cambiado.

Llamar al snapshot después de haber añadido o eliminado archivos produce un CID diferente; el anterior sigue resolviendo mientras no elimines los archivos subyacentes.

Límites ​

  • La carpeta debe contener al menos un archivo. Las carpetas vacías devuelven 400 — folder is empty.
  • Los caracteres del nombre de archivo se codifican en URL en la subida multipart que acepta Kubo; las URLs de gateway pueden necesitar codificación porcentual para espacios o caracteres no ASCII en tus nombres de archivo.
  • Los snapshots cuentan para el total de pins de tu plan exactamente una vez por CID único — los bloques de archivo se deduplican, así que el snapshot mayormente añade un pequeño nodo de directorio encima de los archivos que ya tienes fijados.

Actualizar una carpeta ​

PUT /folders/{folderId}

ParámetroTipoRequeridoDescripción
namestringNoNuevo nombre visible.
parentFolderIdstring | nullNoReasigna el padre de la carpeta. null la mueve a la raíz.

Eliminar una carpeta ​

DELETE /folders/{folderId}

Elimina la carpeta y encadena recursivamente a través de cada archivo y subcarpeta que contiene. Sujeto a la misma protección de seguridad de CID compartido que las eliminaciones de archivos individuales — si otros usuarios todavía fijan un CID que subiste, tu operación de eliminar el pin no se lo quita a ellos.

json
{
  "deleted": true,
  "filesDeleted": 42,
  "foldersDeleted": 3
}

Configurar CORS de S3 para una carpeta / bucket ​

Las carpetas expuestas a través de la API compatible con S3 actúan como buckets. Si estás usando esa API desde JavaScript en el navegador, necesitas reglas CORS en el bucket para que los preflights del navegador pasen. Dos superficies equivalentes persisten en el mismo almacén:

  • PUT /folders/{folderId}/cors — este endpoint REST, autenticado con JWT (usado por el dashboard)
  • Subrecurso S3 PUT /{bucket}?cors — autenticado con SigV4 (usado por los SDKs de AWS, ver s3-compatibility.md)

El PUT en este endpoint también reclama el nombre de la carpeta como nombre de bucket único a nivel global si aún no ha sido reclamado.

PUT /folders/{folderId}/cors ​

Establece las reglas CORS del bucket S3 de la carpeta. Hasta 5 reglas por bucket, 64 KB en total.

ParámetroTipoRequeridoDescripción
rulesCorsRule[]SíArreglo de reglas CORS con forma AWS (ver más abajo). No vacío.
bucketNamestringNoNombre de bucket S3 explícito. Por defecto es el nombre visible de la carpeta. Si el nombre deseado ya está reclamado globalmente, pasa una alternativa aquí.

Cada CorsRule:

CampoTipoRequeridoDescripción
AllowedOriginsstring[]SíOrígenes autorizados a enviar solicitudes. Admite comodines (https://*.myapp.com). Usa * para cualquier origen.
AllowedMethodsstring[]SíUno o más de GET, HEAD, PUT, POST, DELETE.
AllowedHeadersstring[]NoEncabezados que los navegadores pueden incluir en las solicitudes. Por defecto: ninguno. Usa ["*"] para permitir todos (recomendado para AWS SDK v3, que envía Authorization, x-amz-*, etc.).
ExposeHeadersstring[]NoEncabezados de respuesta legibles desde JavaScript en el navegador. Incluye ETag y x-amz-meta-cid si tu app necesita el CID devuelto.
MaxAgeSecondsnumberNoCuánto tiempo los navegadores almacenan en cache el preflight. 0-86400. Por defecto 3600.
IDstringNoEtiqueta de texto libre para la regla.

Ejemplo de solicitud ​

bash
curl -X PUT https://api.ipfs.ninja/folders/17f6dfd8-519c-4d0e-8f3a-5988a1d34ef2/cors \
  -H "Authorization: Bearer $COGNITO_JWT" \
  -H "Content-Type: application/json" \
  -d '{
    "rules": [{
      "AllowedOrigins": ["https://myapp.com", "http://localhost:3000"],
      "AllowedMethods": ["GET", "HEAD", "PUT", "POST", "DELETE"],
      "AllowedHeaders": ["*"],
      "ExposeHeaders": ["ETag", "x-amz-meta-cid", "x-amz-request-id"],
      "MaxAgeSeconds": 3600
    }]
  }'

Respuesta 200 OK ​

json
{ "success": true, "rules": [ { "AllowedOrigins": ["https://myapp.com", "http://localhost:3000"], "AllowedMethods": ["GET", "HEAD", "PUT", "POST", "DELETE"], "AllowedHeaders": ["*"], "ExposeHeaders": ["ETag", "x-amz-meta-cid", "x-amz-request-id"], "MaxAgeSeconds": 3600 } ] }

GET /folders/{folderId}/cors ​

Devuelve las reglas CORS actuales más el nombre del bucket (si ha sido reclamado).

json
{
  "rules": [ … ],
  "bucketName": "my-project"
}

DELETE /folders/{folderId}/cors ​

Elimina todas las reglas CORS. Los preflights del navegador contra el bucket fallarán por defecto hasta que se establezcan nuevas reglas.

Alternativa desde el Dashboard

En la página de Archivos, el menú de acciones de cada carpeta tiene una opción S3 CORS que abre un editor basado en formulario. Mismo almacén subyacente que este endpoint REST y que PutBucketCors a través de la API S3.