Skip to content

NFTs and reward fulfillment ​

Read web3/NFT data and submit reward fulfillment details. Some requests use a direct JSON body while checkout-reservation calls use body.payload.

Access labels such as Origin + Brand key + Customer are defined in Headers and access. Each endpoint ends in a Try it console; set the host and keys once in its Settings tab or on the overview.

Not collectibles

These endpoints deal with tokens held in a customer's own external wallet and the prize forms tied to them. They are separate from Batch collectibles, which are digital tokens with no chain, minting or wallet.

Submit an NFT reward fulfillment form ​

MethodURL pathRequired access
POST/api/v1/brand/form/createOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
bodyobjectyes—
body.walletAddressstringyes—
body.namestringyes—
body.emailstringyesEmail address
body.addressIdnumberoptional—
body.statusstringoptionalAllowed values ("pending" , "completed" , "rejected"); Default ("pending")
body.prizestringyes—
body.nftIdstringoptional—
body.rewardTypeAppliedarray of stringyesMinimum (1)

Send fields directly in the JSON body, without a payload wrapper.

Example:

bash
curl -X POST "$BASE_URL/api/v1/brand/form/create" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-raw '{"walletAddress":"<WALLET_ADDRESS>","name":"Example","email":"alex@example.com","prize":"example","rewardTypeApplied":["example"]}'

Response: Upstream/service JSON is returned directly, without an extra envelope.

Source: app/v1/controller/nft_controller.ts:18 → createForm; routes: routes/v1/nft_route.ts:10; service: _createForm (app/v1/service/nft_service.ts:14).

Submit NFT reward forms in bulk ​

Submit a non-empty JSON array of NFT fulfillment forms. This request is a top-level array, without a payload wrapper.

MethodURL pathRequired access
POST/api/v1/brand/form/create-bulkOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
body[]objectyes—
body[].walletAddressstringyes—
body[].namestringyes—
body[].emailstringyesEmail address
body[].addressIdnumberoptional—
body[].statusstringoptionalAllowed values ("pending" , "completed" , "rejected"); Default ("pending")
body[].prizestringyes—
body[].nftIdstringoptional—
body[].rewardTypeAppliedarray of stringyesMinimum (1)

Example:

bash
curl -X POST "$BASE_URL/api/v1/brand/form/create-bulk" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-raw '[{"walletAddress":"<WALLET_ADDRESS>","name":"Example","email":"alex@example.com","prize":"example","rewardTypeApplied":["example"]}]'

Response: Upstream/service JSON is returned directly, without an extra envelope. The local service success response includes success, result, total, created, and failed.

Source: app/v1/controller/nft_controller.ts:60 → createFormBulk; routes: routes/v1/nft_route.ts:19; service: _createFormBulk (app/v1/service/nft_service.ts:161).

Fetch a wallet NFT page ​

MethodURL pathRequired access
POST/api/v1/brand/user/nftsOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
bodyobjectyes—
body.addressstringyesWhitespace trimmed
body.actionstringyesWhitespace trimmed; Allowed values ("fetchAll" , "loadMore" , "getKiosks" , "getKioskItems" , "getNftObjects")
body.nftTypestringyesWhitespace trimmed
body.limitnumberoptional—
body.kioskIdsarray of stringoptional—
body.cursorsobjectoptional—
body.nextKioskCursorstringoptional—
body.nftObjectIdsarray of stringoptional—

Send fields directly in the JSON body, without a payload wrapper.

Example:

bash
curl -X POST "$BASE_URL/api/v1/brand/user/nfts" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-raw '{"address":"<WALLET_ADDRESS>","action":"fetchAll","nftType":"example"}'

Response: Upstream/service JSON is returned directly, without an extra envelope.

Source: app/v1/controller/nft_controller.ts:114 → getUserNfts; routes: routes/v1/nft_route.ts:28; service: _getUserNfts (app/v1/service/nft_service.ts:226).

Sync NFT reward items to an order ​

MethodURL pathRequired access
POST/api/v1/brand/nfts/syncItemOrigin + Brand key + Hub selected + Customer

Request fields:

FieldTypeRequiredRules / meaning
bodyobjectyes—
body.addressIdnumberyes—
body.orderTypestringyesAllowed values ("delivery" , "pos" , "rapid" , "pickup" , "shipment")

Send fields directly in the JSON body, without a payload wrapper.

Example:

bash
curl -X POST "$BASE_URL/api/v1/brand/nfts/syncItem" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-raw '{"addressId":1,"orderType":"delivery"}'

Response: JSON with success: true and result containing the operation’s service data.

Source: app/v1/controller/nft_controller.ts:291 → syncItem; routes: routes/v1/nft_route.ts:37; service: _syncItem (app/v1/service/nft_service.ts:517).

Get web3 brand ​

MethodURL pathRequired access
GET/api/v1/brand/web3/brandOrigin + Brand key

Request fields: no body, query, or path fields are read by this controller. Context comes from the headers/middleware above.

Example:

bash
curl -X GET "$BASE_URL/api/v1/brand/web3/brand" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY"

Response: Upstream/service JSON is returned directly, without an extra envelope.

Source: app/v1/controller/nft_controller.ts:231 → getWeb3Brand; routes: routes/v1/nft_route.ts:46; service: _getWeb3Brand (app/v1/service/nft_service.ts:480).

Find an NFT by a search field ​

Search by at least one of nftId, tokenId, name, description, or transactionDigest.

MethodURL pathRequired access
GET/api/v1/brand/brand-nftOrigin + Brand key

Request fields:

FieldTypeRequiredRules / meaning
query.descriptionstringconditionalSupply at least one search field
query.namestringconditionalSupply at least one search field
query.nftIdstringconditionalSupply at least one search field
query.tokenIdstringconditionalSupply at least one search field
query.transactionDigeststringconditionalSupply at least one search field

Example:

bash
curl -X GET "$BASE_URL/api/v1/brand/brand-nft?nftId=%3CNFT_ID%3E" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY"

Response: Upstream/service JSON is returned directly, without an extra envelope.

Source: app/v1/controller/nft_controller.ts:158 → getBrandNFTById; routes: routes/v1/nft_route.ts:55; service: _getBrandNFTById (app/v1/service/nft_service.ts:274).

Get brand nf ts ​

MethodURL pathRequired access
GET/api/v1/brand/brand-nftsOrigin + Brand key

Request fields:

FieldTypeRequiredRules / meaning
query.customerAddressstringoptionalNo controller schema
query.descriptionstringoptionalNo controller schema
query.limitstringoptionalNo controller schema
query.namestringoptionalNo controller schema
query.nftIdstringoptionalNo controller schema
query.offsetstringoptionalNo controller schema
query.tokenIdstringoptionalNo controller schema
query.transactionDigeststringoptionalNo controller schema

Example:

bash
curl -X GET "$BASE_URL/api/v1/brand/brand-nfts?limit=example&offset=example" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY"

Response: Upstream/service JSON is returned directly, without an extra envelope.

Source: app/v1/controller/nft_controller.ts:183 → getBrandNFTs; routes: routes/v1/nft_route.ts:64; service: _getBrandNFTs (app/v1/service/nft_service.ts:345).

List NFTs grouped by ownership ​

MethodURL pathRequired access
GET/api/v1/brand/brand-nfts/groupedOrigin + Brand key

Request fields:

FieldTypeRequiredRules / meaning
queryobjectoptionalForwarded to web3 service without local validation

The controller forwards query fields to web3 without local Joi validation. The route describes groupBy (default name) and the same filters as brand-nfts: customerAddress, nftId, tokenId, description, name, transactionDigest, limit, offset. Confirm supported grouping values with that service.

Example:

bash
curl -X GET "$BASE_URL/api/v1/brand/brand-nfts/grouped" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY"

Response: Upstream/service JSON is returned directly, without an extra envelope.

Source: app/v1/controller/nft_controller.ts:217 → getBrandNFTsGrouped; routes: routes/v1/nft_route.ts:73; service: _getBrandNFTsGrouped (app/v1/service/nft_service.ts:413).

Get reward checkout status ​

MethodURL pathRequired access
POST/api/v1/brand/reward/checkout-statusOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
body.payloadobjectyes—
body.payload.nftMarketplaceIdsarray of stringyesMinimum (1)

Send body.payload.nftMarketplaceIds. This only checks eligibility; it does not reserve rewards. Read the upstream canCheckout flag before continuing.

Example:

bash
curl -X POST "$BASE_URL/api/v1/brand/reward/checkout-status" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-raw '{"payload":{"nftMarketplaceIds":["<NFTMARKETPLACEIDS>"]}}'

Response: Upstream/service JSON is returned directly, without an extra envelope.

Source: app/v1/controller/nft_controller.ts:251 → getRewardCheckoutStatus; routes: routes/v1/nft_route.ts:82.

Mark reward processing ​

MethodURL pathRequired access
POST/api/v1/brand/reward/processingOrigin + Brand key + Customer

Request fields:

FieldTypeRequiredRules / meaning
body.payloadobjectyes—
body.payload.nftMarketplaceIdsarray of stringyesMinimum (1)

Reserve rewards before generating a Shopify checkout link. Continue only when the upstream response reports allClaimed=true.

Example:

bash
curl -X POST "$BASE_URL/api/v1/brand/reward/processing" \
  -H "Origin: $ORIGIN" \
  -H "api-key: $API_KEY" \
  -H "Authorization: Bearer $CUSTOMER_TOKEN" \
  -H 'Content-Type: application/json' \
  --data-raw '{"payload":{"nftMarketplaceIds":["<NFTMARKETPLACEIDS>"]}}'

Response: Upstream/service JSON is returned directly, without an extra envelope.

Source: app/v1/controller/nft_controller.ts:271 → markRewardProcessing; routes: routes/v1/nft_route.ts:91.

Batch platform, Shopify app and API documentation