[Web3] Opensea API を利用した NFT の情報取得

概要

こんにちは、サイオステクノロジーの安藤 浩です。

今回はOpenseaで提供されているAPIを利用して、アプリ開発をしていますので、Opensea のAPIについて紹介していきます。

OpenSeaは NFT マーケットプレイスで、そのサービスでAPIが提供されているので、APIで提供されている機能をAPIへリクエストしながらご紹介します。

提供されている Endpoints について

大きく分けて3分類のEndpoint があります。ERC721, ERC1155 に対応しているようです。 詳細は以下に記載があります。

  1. Analytics Endpoints
    • コレクションやイベントの分析用のAPIが提供されています。
  2. NFT Endpoints
    • NFTに関連するコレクション、NFT のメタデータ、所有権情報などを取得するためのAPIが提供されています。
  3. OpenSea Marketplace Endpoints
    • OpenSea のNFT マーケットプレイス上での取引に関するAPIなどが提供されています。

※Stream API が提供されていますが、ここでは触れません。

OpenAPI について

OpenAPI Spec は以下で取得できるのでこちらを利用するとリクエストするのに便利です。

API Key について

本番用のOpenSea API キーを取得するには、申請書に記入する必要があります。 テストネットではAPI Keyは不要です。

API Keyの詳細に関しては以下に記載があります。

NFT Endpoints

今回は、主にNFTに関する情報を取得したいと思うので、NFT Endpoints のテストネットのAPIを試したいと思います。(一部抜粋)

テストネットのAPIのベースになるURLは以下です。 APIには v1 と v2 がありますが、今回はv2で試します。

https://testnets-api.opensea.io/api/v2  

テストネットに対応するOpensea のURLは こちら です。

VSCode の拡張機能: Rest Client を利用して、HTTP リクエストしてみたいので以下のように書いてリクエストしてみます。

以下で利用したRest Client のコードは以下のリポジトリに配置してあります。

https://github.com/Hiroshi-Ando-sti/introduction-openseapi/tree/main

@BASE_URL=https://testnets-api.opensea.io
@BASE_PATH=/api/v2

### GET /accounts/{address_or_username}
@address=0xCebC36de334CE12dFD08f4C39E833016263Ba5B0
GET {{BASE_URL}}{{BASE_PATH}}/accounts/{{address}} HTTP/1.1

まずは、アカウントの情報を取得するAPIにリクエストしてみます。 ※以降、@BASE_URL@BASE_PATH は省略します。

上記を実行した結果はこちらです。

{
  "address": "0xcebc36de334ce12dfd08f4c39e833016263ba5b0",
  "username": "hir-ando",
  "profile_image_url": "https://i.seadn.io/s/raw/files/a02cdbb10a9305a3148d4197f0b0de20.png?w=500&auto=format",
  "banner_image_url": "https://i.seadn.io/s/raw/files/635aa07c9d1248c744b9c5dd2a709fc0.jpg?w=500&auto=format",
  "website": "",
  "social_media_accounts": [],
  "bio": "STI",
  "joined_date": "2024-12-24"
}

Opensea には Collection という概念があり、NFTをまとめるグループのようなものです。 Collection の情報を取れるAPIは以下です。

### GET /collections

GET {{BASE_URL}}{{BASE_PATH}}/collections HTTP/1.1

hiroshinft という Collection があるのでこの情報を取得してみます。

テストネットのOpensea では以下から確認できます。

### GET /collections/{collection_slug}

@collection_slug=hiroshinft
GET {{BASE_URL}}{{BASE_PATH}}/collections/{{collection_slug}} HTTP/1.1

実行結果は以下の通りです。(一部省略) Collection の情報がとれていることが分かります。

{
  "collection": "hiroshinft",
  "name": "HiroshiNFT",
  "description": "",
  "image_url": "",
  "banner_image_url": "",
  "owner": "0x36da942099c028275321130b5e503f37da446487",
  "safelist_status": "not_requested",
  "category": "",
  "is_disabled": false,
  "is_nsfw": false,
  "trait_offers_enabled": false,
  "collection_offers_enabled": true,
  "opensea_url": "https://testnets.opensea.io/collection/hiroshinft",
  "project_url": "",
  "contracts": [
    {
      "address": "0xe88df35e01e3e33df38fb0b5e324282feceb20c2",
      "chain": "sepolia"
    }
  ],
  "editors": [
    "0x36da942099c028275321130b5e503f37da446487"
  ],
  "fees": [
    {
      "fee": 0.5,
      "recipient": "0x0000a26b00c1f0df003000390027140000faa719",
      "required": true
    }
  ],
  "total_supply": 2,
  "created_date": "2025-02-20"
}

今度は Opensea で取得できるChainとContract Address を指定してContract を指定したいと思います。

### GET /chain/{chain}/contract/{address}
@chain=sepolia
@contract_address=0xE88Df35e01e3e33Df38FB0B5e324282feCeb20c2
GET {{BASE_URL}}{{BASE_PATH}}/chain/{{chain}}/contract/{{contract_address}} HTTP/1.1

NFTの名前、供給量などが確認できます。

{
  "address": "0xe88df35e01e3e33df38fb0b5e324282feceb20c2",
  "chain": "sepolia",
  "collection": "hiroshinft",
  "contract_standard": "erc721",
  "name": "HiroshiNFT",
  "total_supply": 0
}

個別のNFT の情報を取得したいと思います。ここでは @identifier を2とします。

### GET /chain/{chain}/contract/{address}/nfts/{identifier}
@chain=sepolia
@contract_address=0xE88Df35e01e3e33Df38FB0B5e324282feCeb20c2
@identifier=2
GET {{BASE_URL}}{{BASE_PATH}}/chain/{{chain}}/contract/{{contract_address}}/nfts/{{identifier}} HTTP/1.1

NFTの作成者や所有者情報、Opensea のURLなどが確認できます。

{
  "nft": {
    "identifier": "2",
    "collection": "hiroshinft",
    "contract": "0xe88df35e01e3e33df38fb0b5e324282feceb20c2",
    "token_standard": "erc721",
    "name": null,
    "description": null,
    "image_url": null,
    "display_image_url": "",
    "display_animation_url": null,
    "metadata_url": null,
    "opensea_url": "https://testnets.opensea.io/assets/sepolia/0xe88df35e01e3e33df38fb0b5e324282feceb20c2/2",
    "updated_at": "2025-02-20T13:42:02.649572",
    "is_disabled": false,
    "is_nsfw": false,
    "animation_url": null,
    "is_suspicious": false,
    "creator": "0x36da942099c028275321130b5e503f37da446487",
    "traits": null,
    "owners": [
      {
        "address": "0xcebc36de334ce12dfd08f4c39e833016263ba5b0",
        "quantity": 1
      }
    ],
    "rarity": null
  }
}

上記で取得できた所有者のAddress を指定して、その Address が所有するNFTを情報を取得します。

### Get NFTs (by account)
### GET /chain/{chain}/account/{address}/nfts
@chain=sepolia
@address=0xCebC36de334CE12dFD08f4C39E833016263Ba5B0
GET {{BASE_URL}}{{BASE_PATH}}/chain/{{chain}}/account/{{address}}/nfts HTTP/1.1

1件しかないですが、nfts は配列であり複数件あれば複数件取得できます。

{
  "nfts": [
    {
      "identifier": "2",
      "collection": "hiroshinft",
      "contract": "0xe88df35e01e3e33df38fb0b5e324282feceb20c2",
      "token_standard": "erc721",
      "name": null,
      "description": null,
      "image_url": null,
      "display_image_url": "",
      "display_animation_url": null,
      "metadata_url": null,
      "opensea_url": "https://testnets.opensea.io/assets/sepolia/0xe88df35e01e3e33df38fb0b5e324282feceb20c2/2",
      "updated_at": "2025-02-20T13:42:02.649572",
      "is_disabled": false,
      "is_nsfw": false
    }
  ]
}

また、Collection を指定して、その Collection 内のNFTの情報を取得できます。

### Get NFTs (by collection) ### GET /collection/{collection_slug}/nfts
@collection_slug=hiroshinft
GET {{BASE_URL}}{{BASE_PATH}}/collection/{{collection_slug}}/nfts HTTP/1.1

こちらも先ほど同様で複数件取得が出来るようになっています。

{
  "nfts": [
    {
      "identifier": "2",
      "collection": "hiroshinft",
      "contract": "0xe88df35e01e3e33df38fb0b5e324282feceb20c2",
      "token_standard": "erc721",
      "name": null,
      "description": null,
      "image_url": null,
      "display_image_url": "",
      "display_animation_url": null,
      "metadata_url": null,
      "opensea_url": "https://testnets.opensea.io/assets/sepolia/0xe88df35e01e3e33df38fb0b5e324282feceb20c2/2",
      "updated_at": "2025-02-20T13:42:02.649572",
      "is_disabled": false,
      "is_nsfw": false
    },
    {
      "identifier": "1",
      "collection": "hiroshinft",
      "contract": "0xe88df35e01e3e33df38fb0b5e324282feceb20c2",
      "token_standard": "erc721",
      "name": null,
      "description": null,
      "image_url": null,
      "display_image_url": "",
      "display_animation_url": null,
      "metadata_url": null,
      "opensea_url": "https://testnets.opensea.io/assets/sepolia/0xe88df35e01e3e33df38fb0b5e324282feceb20c2/1",
      "updated_at": "2025-02-20T13:39:02.836098",
      "is_disabled": false,
      "is_nsfw": false
    }
  ]
}

GET /chain/{chain}/contract/{address} と似ていますが、Contract Address のNFTの情報を取得します。

### Get NFTs (by contract)
### GET /chain/{chain}/contract/{address}/nfts
@chain=sepolia
@contract_address=0xE88Df35e01e3e33Df38FB0B5e324282feCeb20c2
GET {{BASE_URL}}{{BASE_PATH}}/chain/{{chain}}/contract/{{contract_address}}/nfts HTTP/1.1

上記で@identifier=2 を指定した情報と同じ情報が含まれています。 @identifier=1 もMintしてあるのでその情報も含まれていることが確認できます。

{
  "nfts": [
    {
      "identifier": "2",
      "collection": "hiroshinft",
      "contract": "0xe88df35e01e3e33df38fb0b5e324282feceb20c2",
      "token_standard": "erc721",
      "name": null,
      "description": null,
      "image_url": null,
      "display_image_url": "",
      "display_animation_url": null,
      "metadata_url": null,
      "opensea_url": "https://testnets.opensea.io/assets/sepolia/0xe88df35e01e3e33df38fb0b5e324282feceb20c2/2",
      "updated_at": "2025-02-20T13:42:02.649572",
      "is_disabled": false,
      "is_nsfw": false
    },
    {
      "identifier": "1",
      "collection": "hiroshinft",
      "contract": "0xe88df35e01e3e33df38fb0b5e324282feceb20c2",
      "token_standard": "erc721",
      "name": null,
      "description": null,
      "image_url": null,
      "display_image_url": "",
      "display_animation_url": null,
      "metadata_url": null,
      "opensea_url": "https://testnets.opensea.io/assets/sepolia/0xe88df35e01e3e33df38fb0b5e324282feceb20c2/1",
      "updated_at": "2025-02-20T13:39:02.836098",
      "is_disabled": false,
      "is_nsfw": false
    }
  ]
}

上記で指定していた Contract Address では traits がないので先ほどの情報に含まれていませんでしたが、Traits を取得することができます。

### Get Traits
### GET /traits/{collection_slug}
@traits_collection_slug=usernft-14
GET {{BASE_URL}}{{BASE_PATH}}/traits/{{traits_collection_slug}}/nfts HTTP/1.1

例えば、Collection が usernft-14 というものだとTraits に stage というパラメータがあります。

{
  "categories": {
    "stage": "number"
  },
  "counts": {
    "stage": {
      "min": 1,
      "max": 4
    }
  }
}

まとめ

Opensea のAPI の特に NFT Endpoints について取り上げました。 NFT Endpoints のAPIを利用するとCollection 、NFT のメタデータ、所有権情報などを取得することができます。

Opensea のAPIを利用して、NFT の所有者や作成者、Contract の情報が取得できるので活用してみてはいかがでしょうか。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です