balance
| Field | Type | Required | Description |
contractAddress | text | ✓ Yes | ERC-721 contract address. |
ownerAddress | text | ✓ Yes | Address to count NFTs for. |
{ "success": true, "balance": "3" }
ownerOf
| Field | Type | Required | Description |
contractAddress | text | ✓ Yes | ERC-721 contract address. |
tokenId | text | ✓ Yes | Integer uint256 token ID. |
{ "success": true, "owner": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb" }
transferFrom / safeTransferFrom — need credential
| Field | Type | Required | Description |
contractAddress | text | ✓ Yes | ERC-721 contract address. |
from | text | ✓ Yes | Current owner (or approved caller). |
to | text | ✓ Yes | Recipient address. |
tokenId | text | ✓ Yes | Integer uint256 token ID. |
Prefer safeTransferFrom: it performs the same transfer but additionally checks the
recipient can handle ERC-721 tokens (via onERC721Received) when the recipient is a
contract — transferFrom skips that check and can permanently strand an NFT if the
recipient contract wasn't built to receive them.
approve / setApprovalForAll — need credential
| Operation | Fields | Description |
approve | contractAddress*, spender*, tokenId* | Approve a single address to transfer one specific token. |
setApprovalForAll | contractAddress*, operator*, approved* (boolean) | Approve (or revoke) an operator for every token this account owns in the collection. |
getApproved / isApprovedForAll
| Operation | Fields | Returns |
getApproved | contractAddress*, tokenId* | { "approved": "0x..." } — the single-token approved address, or the zero address if none. |
isApprovedForAll | contractAddress*, owner*, operator* | { "isApproved": true } |
tokenUri
| Field | Type | Required | Description |
contractAddress | text | ✓ Yes | ERC-721 contract address. |
tokenId | text | ✓ Yes | Integer uint256 token ID. |
{ "success": true, "tokenUri": "ipfs://bafybeig.../1234.json" }
The raw URI as returned by the contract, unresolved — often an ipfs:// URI. Use
nft.getMetadata if you also want the fetched/parsed metadata document.
mint — non-standard, needs credential
| Field | Type | Required | Description |
contractAddress | text | ✓ Yes | ERC-721 contract address. |
to | text | ✓ Yes | Recipient of the new token. |
tokenId | text | No | Explicit token ID. When supplied, calls {functionName}(address,uint256); when omitted, calls the auto-incrementing {functionName}(address) shape. |
functionName | text | No (default "safeMint") | Override if the contract names its mint function differently. |
Not part of the ERC-721 standard (EIP-721): minting shape varies by project. This
assumes a common OpenZeppelin-style pattern and will revert against contracts that don't implement
a matching function.
listOwnedTokens — addendum v3
| Field | Type | Required | Description |
contractAddress | text | ✓ Yes | ERC-721 contract address. |
ownerAddress | text | ✓ Yes | Address to list owned tokens for. |
limit | number | No (default 100) | Page size, 1–1000. |
offset | number | No (default 0) | Page offset. |
{ "success": true, "tokenIds": ["17", "204", "980"], "totalBalance": 3 }
Requires ERC-721 Enumerable: this is gated on the real
ERC-721 Enumerable extension
(interface ID
0x780e9d63) being implemented by the contract. It fails clearly with
NOT_SUPPORTED when the contract doesn't implement it, rather than attempting an
unreliable
Transfer-event log scan. Many popular collections (including most large PFP
projects) skip Enumerable to save gas on mint — check with
contract.detectStandards first if unsure.
getMetadata — addendum v3
| Field | Type | Required | Description |
contractAddress | text | ✓ Yes | ERC-721 contract address. |
tokenId | text | ✓ Yes | Integer uint256 token ID. |
timeoutSeconds | number | No (default 10) | HTTP fetch timeout, 1–60. |
{
"success": true,
"tokenUri": "ipfs://bafybeig.../1234.json",
"metadataJson": "{\"name\":\"Cool Cat #1234\",\"image\":\"ipfs://...\",\"attributes\":[...]}"
}
This node's only outbound non-RPC HTTP call: calls tokenUri() on-chain,
resolves an ipfs:// URI to the public ipfs.io gateway if needed, then
fetches and returns the metadata document as raw JSON text — everything else on this node talks only
to the configured RPC endpoint.