Skip to content

Collectible page (web) ​

A collectible is a digital token the brand defines. A customer gets a copy by scanning a product, on scan to claim, and the copy is their user collectible. The storefront shows them on two pages: the collection grid, and one collectible's detail with the campaigns it counts toward. They are pages rather than a journey, so this one has no player.

The collection grid ​

WantAPI callAccess
Every collectible, owned ones markedGET /api/v1/brand/collectiblesOrigin + Brand key + Customer
Owned ones onlyGET /api/v1/user/collectiblesOrigin + Brand key + Customer
Featured rowGET /api/v1/brand/loyalty/collectibles/trendingOrigin + Brand key

All three take an optional tag (comma-separated). A collectible matches if it carries any of the tags.

  • The full grid comes from brand/collectibles. It returns every available, unarchived collectible with its assets, in the brand's order. Each one has a user_collectibles array of this customer's copies. An empty array means locked; its length is how many copies the customer holds.
  • Owned only comes from user/collectibles. On the web this response is grouped: an object keyed by collectible_id, each value an array of copies. It does not include assets, so pair it with the grid call for images.
  • Featured row — trending is the same available, unarchived list, oldest first, with no customer data. It needs no customer token.

Only copies with status APPROVED count as owned. A copy still waiting on a receipt does not appear until the hold is released.

One collectible ​

WantAPI callAccess
Name, description, images, videoGET /api/v1/collectible/:idOrigin + Brand key
The customer's copyGET /api/v1/user/collectible/:idOrigin + Brand key + Customer
Campaigns it counts towardGET /api/v1/brand/user/loyalty/collectible/:collectible_id/campaignOrigin + Brand key + Customer
One campaign's steps and progressGET /api/v1/brand/user/loyalty/campaigns/:idOrigin + Brand key + Customer

The storefront has no call that shows who else holds a collectible.

Load the page in this order:

  1. The collectible — collectible/:id returns the definition and its assets.
  2. The customer's copy — user/collectible/:id returns their first approved copy, or fails with Collectible not found for the user. That failure is the page's locked state, not an error to show.
  3. Its campaigns — …/collectible/:collectible_id/campaign returns [{ campaign_id, isCompleted }], the campaign ids only.
  4. Each campaign's progress — campaigns/:id returns the steps and the customer's allowed[] / claimed[] arrays. In a collectible campaign, each step's detail.collectible lists the collectibles that complete it, with their assets, so the page can show the set this collectible belongs to. What each step state means is on Loyalty campaigns. Claiming a ready step is the earn-and-spend flow.

What the API forces onto this page ​

  • :id in user/collectible/:id is the collectible id, not the id of the copy. The lookup is by collectible_id, so the same id works for both detail calls. A customer holding several copies gets only one.
  • isCompleted is a one-time banner, not a progress flag. It is true only when every other step of that campaign is reached and this collectible's step is the one still missing. In other words, this collectible is the piece the set needs. The call then records that it reported this, in the progress row's achievement, and returns false from then on. Show the banner when it is true, and take the actual progress from step 4.
  • That call reads but also writes. Because of the achievement update, do not call it speculatively, for example on hover or a prefetch. The customer would lose the banner.
  • It only lists campaigns already started. It joins on the customer's progress row, so a campaign the customer has not moved yet is missing. To show "collect this to start…", check the collectible_id constraints on the steps of the campaigns from GET /api/v1/user/loyalty/campaigns.
  • Only web campaigns appear. These calls return campaigns whose medium is all or web.
  • collectible/:id is not scoped to the brand. It finds any available collectible by id. Only link to ids that came from this brand's grid.
  • Moving a copy to someone else is a product ownership transfer.

Batch platform, Shopify app and API documentation