Create a product
Products
Create Product
Create a new card product within a program. POST /programs//products. Requires accounts:write scope.
POST
Create a product
Documentation Index
Fetch the complete documentation index at: https://docs.fyatu.com/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Creates a new card product under an existing program. A Card Product defines the scheme (VISA or Mastercard), card type (Consumer or Corporate), the feature set (3DS, Apple Pay, JIT), and the lifecycle controls (reloadability, one-time use, TTL, spend limits, cardholder card limits). Once created, the productproductId is passed to POST /cards to issue cards under that configuration.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
programId | string | The program to create the product under (prefix prg_) |
Request Body
Required
| Field | Type | Description |
|---|---|---|
name | string | Human-readable product name (e.g. "Standard VISA Consumer") |
scheme | string | Card network — VISA or MASTERCARD. Must match a scheme enabled on your program |
Optional — Card Type
| Field | Type | Default | Description |
|---|---|---|---|
cardType | string | CONSUMER | CONSUMER or CORPORATE |
Optional — features Object
Features are validated against what your program catalog allows. Requesting a feature not enabled on your program returns 422 FEATURE_NOT_ALLOWED.
| Field | Type | Default | Description |
|---|---|---|---|
features.has3DS | boolean | false | Enable 3D Secure authentication |
features.hasApplePay | boolean | false | Enable Apple Pay tokenisation |
features.hasGooglePay | boolean | false | Enable Google Pay tokenisation |
features.hasJIT | boolean | false | Enable Just-In-Time funding |
features.hasSpendControl | boolean | false | Enable per-card spend limits |
features.hasMccControl | boolean | false | Enable MCC (merchant category) allow/block rules |
Optional — controls Object
Controls govern card lifecycle rules and are enforced at issuance and funding time.
| Field | Type | Default | Description |
|---|---|---|---|
controls.isReloadable | boolean | true | When false, POST /cards/{id}/fund is rejected for every card under this product. Set to false for one-load prepaid or gift-card style products |
controls.isOneTimeUse | boolean | false | When true, a card is automatically terminated after its first settled transaction. Ideal for single-purchase virtual cards |
controls.cardTTLMonths | integer | null | 36 | Cap on card validity in months from issuance. If the card scheme grants a longer expiry, it is capped at this value |
controls.maxCardsPerCardholder | integer | null | 5 | Maximum simultaneously active (non-TERMINATED) cards a cardholder may hold under this product. Attempting to issue a card beyond this limit returns 409 CARDHOLDER_CARD_LIMIT_EXCEEDED |
controls.spendingLimit | number | 1000 | Maximum spend amount per spendingPeriod. Expressed in the program’s currency (USD) |
controls.spendingPeriod | string | TRANSAMOUNT | The period over which spendingLimit is enforced — TRANSAMOUNT, DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY, or LIFETIME |
Example
Success Response (201)
Product Controls in Practice
Non-reloadable (controls.isReloadable: false)
Use this for prepaid, gift-card, or expense-allowance products where the cardholder receives a fixed balance at issuance and cannot add more funds. Any call to POST /cards/{id}/fund will be rejected with 422 CARD_NOT_RELOADABLE.
One-time use (controls.isOneTimeUse: true)
Cards are automatically terminated after their first settled transaction. Best for single-purchase virtual cards where you want strong controls on card reuse. The card remains ACTIVE until the first settlement clears.
TTL cap (controls.cardTTLMonths)
The card provider normally sets card expiry based on the scheme default (often 3–5 years). Setting cardTTLMonths caps that to a shorter window — for example, 12 ensures cards expire within one year of issuance even if the provider would have granted longer. Defaults to 36 months when not provided.
Per-cardholder card limit (controls.maxCardsPerCardholder)
Enforced at issuance time. The limit counts all non-TERMINATED cards under this product for the same cardholder. Issuing a card that would breach the limit returns 409 CARDHOLDER_CARD_LIMIT_EXCEEDED. Defaults to 5 when not provided.
Spending limit (controls.spendingLimit + controls.spendingPeriod)
Sets a maximum spend cap on every card issued under this product. spendingLimit is expressed in the program currency (USD). spendingPeriod sets the window:
| Period | Description |
|---|---|
TRANSAMOUNT | Cap applied per individual transaction |
DAILY | Cap resets at midnight UTC each day |
WEEKLY | Cap resets each Monday at midnight UTC |
MONTHLY | Cap resets on the 1st of each month at midnight UTC |
QUARTERLY | Cap resets every three months |
YEARLY | Cap resets on the 1st of January at midnight UTC |
LIFETIME | Cap applies for the entire lifetime of the card |
1000 / TRANSAMOUNT when not provided.
Error Codes
| Code | HTTP | Cause |
|---|---|---|
MISSING_FIELD | 400 | name or scheme not provided |
INVALID_REQUEST | 400 | Request body is not valid JSON |
SCHEME_NOT_ALLOWED | 422 | The requested scheme is not enabled for your program |
FEATURE_NOT_ALLOWED | 422 | A requested feature flag is not available under your program catalog |
PROGRAM_NOT_FOUND | 404 | Program does not exist or belongs to another business |
INVALID_STATUS | 409 | Program is closed or not in a state that allows new products |
INSUFFICIENT_SCOPE | 403 | Key lacks accounts:write scope |
INTERNAL_ERROR | 500 | Server error |
Authorizations
API key from the FYATU CaaS portal. Pass as Authorization: Bearer <key>.
Path Parameters
Program ID (prefix prg_)
Body
application/json
Human-readable product name
Example:
"Prepaid VISA Consumer 12m"
Card network. Must match a scheme enabled on your program.
Available options:
VISA, MASTERCARD Example:
"VISA"
Available options:
CONSUMER, CORPORATE Example:
"CONSUMER"
Feature flags validated against your program catalog.
Card lifecycle and spend controls.

