---
title: "Product"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.cardzone.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Product

Path: Cardzone B2B API

Product returned by the catalog endpoint. Live keys return real sellable store products.

The id/name identify the sellable denomination. The ordered recipient_fields come from its Cardzone Product configuration, independently of provider activation or store routing; voucher rows have no required account fields. Render each label and submit its canonical key. Sources translate those keys privately and never redefine the customer form.

Sandbox keys return static scenario products. Use the sandbox product `id` as `product_id` when creating an order to trigger the matching hardcoded response. See the Sandbox section for the scenario list.

## Fields

- `id` (`Product.id`; string, required) — Sellable Cardzone product/variant UUID. In sandbox mode, this is also the scenario selector for hardcoded order responses.
  - format `uuid`
- `name` (`Product.name`; string, required)
- `status` (`Product.status`; string, required) — `available`: you can order it now. `out_of_stock`: Cardzone has marked it out of stock, and your store has none of its own stock. It stays out of stock until Cardzone marks it available again. `unavailable`: there is no way to fulfill it for your store. In order errors it also covers products that are hidden for your store or have no active price; the catalog never lists those. Orders for products that are not `available` are rejected with `404` and the same value in `error.product_status`.
  - one of `"available"`, `"out_of_stock"`, `"unavailable"`
- `delivery_type` (`Product.delivery_type`; string, required)
  - one of `"voucher"`, `"topup"`
- `purchase_price` (`Product.purchase_price`; object, required) — Your merchant unit price
  - `amount` (`Product.purchase_price.amount`; string, required) — Decimal amount as a string
    - example `"12.00"`
  - `currency` (`Product.purchase_price.currency`; string, required)
    - example `"SAR"`
- `recommended_retail_price` (`Product.recommended_retail_price`; object, required) — Suggested resale unit price
  - `amount` (`Product.recommended_retail_price.amount`; string, required) — Decimal amount as a string
    - example `"12.00"`
  - `currency` (`Product.recommended_retail_price.currency`; string, required)
    - example `"SAR"`
- `recipient_fields` (`Product.recipient_fields`; array<object>, required) — Required fields configured on the Cardzone Product, in display order and independent of provider routing. Empty for voucher rows.
  - `key` (`Product.recipient_fields.key`; string, required) — Product-configured canonical key, including custom keys such as region_id or account_tag. Never a provider parameter name.
    - pattern `^(?!constructor$|prototype$)[a-z][a-z0-9_]*$`
  - `label` (`Product.recipient_fields.label`; string, required) — Localized display label; use key, not label, in recipient requests.
  - `required` (`Product.recipient_fields.required`; boolean, required)
    - one of `true`
- `product_code` (`Product.product_code`; string, optional) — Cardzone internal product code for support/debugging. In sandbox mode this identifies the static response scenario.
- `description` (`Product.description`; string, optional, nullable)
- `category_id` (`Product.category_id`; string, optional, nullable) — Category slug
- `category_name` (`Product.category_name`; string, optional, nullable)
- `player_lookup` (`Product.player_lookup`; boolean, optional) — True when `POST /api/b2b/v1/player_profiles` can resolve the in-game profile for this product's recipient. Always false for voucher rows.


Source: https://docs.cardzone.ai/reference/schemas/Product/index.md
