---
title: "Upload drop metadata to IPFS"
method: POST
path: "/api/v2/drops/{slug}/metadata/ipfs"
tags: ["Drops Endpoints"]
---

# Upload drop metadata to IPFS

`POST /api/v2/drops/{slug}/metadata/ipfs`

## Request

- Base URL: `https://api.opensea.io`
- URL: `https://api.opensea.io/api/v2/drops/{slug}/metadata/ipfs`
- Auth: API key in header `x-api-key` and OpenID Connect (`https://auth.opensea.io/.well-known/openid-configuration`, scopes: `write:drops`)
- TypeScript: <https://skmtc.dev/opensea/apis/opensea-api/docs/api/v2/drops/:slug/metadata/ipfs/post.ts> (a function with typed inputs; its response is checked against the schema)

Uploads every saved item's media and metadata to IPFS, then saves the resulting folder as the drop's draft base URI. Run it after POST /api/v2/drops/{slug}/items/media/save-batch; the drop needs at least one item. It does not change the contract: call POST /api/v2/drops/{slug}/publish once it completes.

This is the reveal. The base URI it writes points at the real item metadata, so a drop published after it has completed is revealed as soon as it is live. To reveal later, publish without running it (showing the prereveal item from POST /api/v2/drops/{slug}/prereveal-item), then run it and publish again when ready.

Only ERC-721 SeaDrop V1 drops are supported; any other drop type returns 400. An ERC-1155 self-mint drop uploads each item's metadata when the item is saved or updated.

Only one upload runs per drop at a time. Calling again while one is running returns that upload's id. Poll GET /api/v2/drops/{slug}/metadata/ipfs/{workflow_execution_id} until status is completed or failed.

## Path parameters

- `slug` string, required

## Response `200`

Upload started, or the upload already running for this drop

- DropMetadataUploadResponse: Started upload of a drop's item media and metadata to IPFS
  - `workflow_execution_id` string, required: Opaque id of the upload. Pass it to GET /api/v2/drops/{slug}/metadata/ipfs/{workflow_execution_id} to follow progress.

## Other responses

- `400`: For error reasons, review the response data.
- `401`: Invalid or missing API key
- `403`: Wallet token lacks permission for this request
- `404`: Resource not found
- `409`: Conflict
- `500`: Internal server error. Please open a support ticket so OpenSea can investigate.

## Changes

- **2026-11-03** `2c7935d84f90`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/opensea/apis/opensea-api/changes/api/v2/drops/:slug/metadata/ipfs/post.md)

---

[API](https://skmtc.dev/opensea/apis/opensea-api.md) - [All operations](https://skmtc.dev/opensea/apis/opensea-api/llms.txt) - [OpenAPI document](https://skmtc.dev/opensea/apis/opensea-api/revisions/2c7935d84f90?raw)
