{
  "$schema": "https://degreesofsatoshi.com/encyclopedia/schemas/article-v1.json",
  "schemaVersion": "1.0.0",
  "id": "nft-ipfs-storage",
  "canonical": "https://degreesofsatoshi.com/encyclopedia/nft-ipfs-storage/",
  "collection": "ethereum",
  "title": "NFTs and IPFS: a content address is not a storage guarantee",
  "description": "Separate an NFT’s IPFS content identifier from continued file availability, pinning and the contract’s metadata pointer.",
  "aliases": [
    "NFT IPFS permanence",
    "IPFS pinning NFT image"
  ],
  "dates": {
    "published": "2026-10-02",
    "modified": "2026-10-02",
    "verified": "2026-10-02T19:27:58.939Z",
    "dataAsOf": "2026-10-02"
  },
  "authorship": {
    "publisher": "Degrees of Satoshi editorial project",
    "process": "AI-assisted research and drafting with a separate automated source-verification pass; no external expert or named human review is implied."
  },
  "quickAnswer": {
    "text": "IPFS content identifiers identify content addressed data, but do not guarantee that a reachable node will retain and serve it forever. An NFT can reference IPFS metadata or media while its ownership stays on Ethereum. Check the token’s actual URI, whether the referenced data is pinned and whether the contract can change that URI; these are different durability questions.",
    "claimId": "nft-ipfs-storage-quick-answer",
    "sourceIds": [
      "x425-eth-ipfs-content",
      "x425-eth-ipfs-persistence",
      "x425-eth-erc721"
    ]
  },
  "keyFacts": [
    {
      "label": "Content identity",
      "value": "A CID identifies content within a specified encoding and structure.",
      "sourceIds": [
        "x425-eth-ipfs-content"
      ],
      "id": "content-identity",
      "claimId": "nft-ipfs-storage-fact-content-identity"
    },
    {
      "label": "Availability",
      "value": "Pinning protects retained data from a node’s garbage collection.",
      "sourceIds": [
        "x425-eth-ipfs-persistence"
      ],
      "id": "availability",
      "claimId": "nft-ipfs-storage-fact-availability"
    },
    {
      "label": "Pointer",
      "value": "An ERC-721 metadata URI can refer to offchain content.",
      "sourceIds": [
        "x425-eth-erc721"
      ],
      "id": "pointer",
      "claimId": "nft-ipfs-storage-fact-pointer"
    }
  ],
  "prerequisites": [
    "nft-metadata"
  ],
  "sections": [
    {
      "id": "identifier",
      "heading": "An identifier is not a storage contract",
      "sourceIds": [
        "x425-eth-ipfs-content",
        "x425-eth-ipfs-persistence"
      ],
      "paragraphs": [
        "Content addressing lets software verify that retrieved data corresponds to the requested identifier. It does not create an obligation for every node to store that data. If no reachable provider retains it, retrieval can fail.",
        "Different chunking, codecs or directory layouts can produce different CIDs for representations of the same apparent file. Avoid treating the CID as a universal hash of the original file bytes."
      ]
    },
    {
      "id": "example",
      "heading": "Metadata and the image may have separate dependencies",
      "sourceIds": [
        "x425-eth-erc721",
        "x425-eth-ipfs-content",
        "x425-eth-ipfs-persistence"
      ],
      "paragraphs": [
        "Suppose an NFT points to an IPFS metadata file whose image field points to another IPFS object. Keeping only the metadata accessible does not establish that the separate image is retained. Check both references and the pinning arrangement.",
        "A gateway failure can also prevent one browser path from loading data that other providers still have. Distinguish one inaccessible gateway from proven loss of every copy."
      ]
    },
    {
      "id": "retention",
      "heading": "Inspect who keeps the data available",
      "sourceIds": [
        "x425-eth-ipfs-persistence",
        "x425-eth-erc721"
      ],
      "paragraphs": [
        "Pinning can be local or handled by a remote service. A recursive pin retains referenced children in that object’s data structure, but unrelated URLs inside a metadata document need their own handling. Check the actual retention setup rather than rely on the word IPFS.",
        "Finally, immutable content at one CID does not automatically make the NFT’s pointer immutable. The collection contract determines whether token metadata references can later change."
      ]
    }
  ],
  "faq": [
    {
      "question": "Does minting an NFT automatically pin its image?",
      "answer": "No. Token creation and storage retention are separate operations. A project must arrange for the referenced content to remain available.",
      "sourceIds": [
        "x425-eth-erc721",
        "x425-eth-ipfs-persistence"
      ]
    },
    {
      "question": "Can I rely on one working gateway as proof of permanent storage?",
      "answer": "No. It demonstrates current retrieval through that route. Long-term availability depends on retained copies and reachable providers.",
      "sourceIds": [
        "x425-eth-ipfs-persistence"
      ]
    }
  ],
  "claims": [
    {
      "id": "nft-ipfs-storage-quick-answer",
      "articleSlug": "nft-ipfs-storage",
      "statement": "IPFS content identifiers identify content addressed data, but do not guarantee that a reachable node will retain and serve it forever. An NFT can reference IPFS metadata or media while its ownership stays on Ethereum. Check the token’s actual URI, whether the referenced data is pinned and whether the contract can change that URI; these are different durability questions.",
      "sourceIds": [
        "source-d6c57c6845e6d6cf",
        "source-37c1413248e9760f",
        "source-b08b9aae11ea4085"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-d6c57c6845e6d6cf",
          "locator": "Content identifiers; content addressing"
        },
        {
          "sourceId": "source-37c1413248e9760f",
          "locator": "Pinning; garbage collection; remote pinning"
        },
        {
          "sourceId": "source-b08b9aae11ea4085",
          "locator": "safeTransferFrom; approve; setApprovalForAll; Transfer; metadata"
        }
      ],
      "scope": {
        "collection": "ethereum",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T19:27:58.939Z",
        "reviewer": "Independent automated verification agent verify_bitcoin_stablecoins_100",
        "notes": [
          "Read IPFSCIDcreation/differentchunking/codecs/rootblock distinction and allpinningtypes/localremoteretention. ERC721metadata URI is explicitlymutable. JSONimageURL is not necessarilya DAGchild; draftavoidsrecursivepinningguaranteeforunrelatedURLstrings."
        ]
      }
    },
    {
      "id": "nft-ipfs-storage-fact-content-identity",
      "articleSlug": "nft-ipfs-storage",
      "statement": "Content identity: A CID identifies content within a specified encoding and structure.",
      "sourceIds": [
        "source-d6c57c6845e6d6cf"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-d6c57c6845e6d6cf",
          "locator": "Content identifiers; content addressing"
        }
      ],
      "scope": {
        "collection": "ethereum",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T19:27:58.939Z",
        "reviewer": "Independent automated verification agent verify_bitcoin_stablecoins_100",
        "notes": [
          "Read IPFSCIDcreation/differentchunking/codecs/rootblock distinction and allpinningtypes/localremoteretention. ERC721metadata URI is explicitlymutable. JSONimageURL is not necessarilya DAGchild; draftavoidsrecursivepinningguaranteeforunrelatedURLstrings."
        ]
      }
    },
    {
      "id": "nft-ipfs-storage-fact-availability",
      "articleSlug": "nft-ipfs-storage",
      "statement": "Availability: Pinning protects retained data from a node’s garbage collection.",
      "sourceIds": [
        "source-37c1413248e9760f"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-37c1413248e9760f",
          "locator": "Pinning; garbage collection; remote pinning"
        }
      ],
      "scope": {
        "collection": "ethereum",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T19:27:58.939Z",
        "reviewer": "Independent automated verification agent verify_bitcoin_stablecoins_100",
        "notes": [
          "Read IPFSCIDcreation/differentchunking/codecs/rootblock distinction and allpinningtypes/localremoteretention. ERC721metadata URI is explicitlymutable. JSONimageURL is not necessarilya DAGchild; draftavoidsrecursivepinningguaranteeforunrelatedURLstrings."
        ]
      }
    },
    {
      "id": "nft-ipfs-storage-fact-pointer",
      "articleSlug": "nft-ipfs-storage",
      "statement": "Pointer: An ERC-721 metadata URI can refer to offchain content.",
      "sourceIds": [
        "source-b08b9aae11ea4085"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-b08b9aae11ea4085",
          "locator": "safeTransferFrom; approve; setApprovalForAll; Transfer; metadata"
        }
      ],
      "scope": {
        "collection": "ethereum",
        "dataAsOf": "2026-10-02",
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T19:27:58.939Z",
        "reviewer": "Independent automated verification agent verify_bitcoin_stablecoins_100",
        "notes": [
          "Read IPFSCIDcreation/differentchunking/codecs/rootblock distinction and allpinningtypes/localremoteretention. ERC721metadata URI is explicitlymutable. JSONimageURL is not necessarilya DAGchild; draftavoidsrecursivepinningguaranteeforunrelatedURLstrings."
        ]
      }
    }
  ],
  "sources": [
    {
      "id": "x425-eth-ipfs-content",
      "label": "IPFS content addressing",
      "publisher": "IPFS contributors",
      "url": "https://docs.ipfs.tech/concepts/content-addressing/",
      "locator": "Content identifiers; content addressing",
      "note": "A CID identifies content rather than promising a continuously available server.",
      "version": "Documentation snapshot retrieved 2 October 2026; response hash recorded separately",
      "checkedAt": "2026-10-02T18:55:25.788Z",
      "contentSha256": "6b5f2f1fd6e1e2605f34ee5e63618a2239ed27666148d82a4931a6959cd0fc5d",
      "recordId": "source-d6c57c6845e6d6cf"
    },
    {
      "id": "x425-eth-ipfs-persistence",
      "label": "IPFS persistence and pinning",
      "publisher": "IPFS contributors",
      "url": "https://docs.ipfs.tech/how-to/pin-files/",
      "locator": "Pinning; garbage collection; remote pinning",
      "note": "Availability depends on nodes retaining and serving content; pinning prevents local garbage collection.",
      "version": "Documentation snapshot retrieved 2 October 2026; response hash recorded separately",
      "checkedAt": "2026-10-02T18:55:25.704Z",
      "contentSha256": "3fd4a0313f1c5af3309da80188b6ea14f3ea178d73f769a35b97d72d06690b76",
      "recordId": "source-37c1413248e9760f"
    },
    {
      "id": "x425-eth-erc721",
      "label": "ERC-721 NFT standard",
      "publisher": "Ethereum Improvement Proposals",
      "url": "https://eips.ethereum.org/EIPS/eip-721",
      "locator": "safeTransferFrom; approve; setApprovalForAll; Transfer; metadata",
      "note": "Ownership, receiver checks, token-level and operator approvals, mint/burn event semantics.",
      "version": "ERC-721",
      "checkedAt": "2026-10-02T18:55:25.399Z",
      "contentSha256": "bedd672103f3ebb6803ce2bddb33a9ff3d23b08e8e3ae3173b6a5b016f65e2a1",
      "recordId": "source-b08b9aae11ea4085"
    }
  ],
  "related": {
    "articles": [
      "nft-metadata",
      "erc-721-nfts",
      "contract-proxies",
      "nfts-not-showing-in-wallet"
    ],
    "dossiers": [],
    "wallets": []
  },
  "revisionHistory": [
    {
      "date": "2026-10-02",
      "kind": "published",
      "summary": "First publication after primary-source research and separate automated verification."
    }
  ],
  "citation": "Degrees of Satoshi editorial project. “NFTs and IPFS: a content address is not a storage guarantee.” Published 2026-10-02; updated 2026-10-02. https://degreesofsatoshi.com/encyclopedia/nft-ipfs-storage/"
}
