Docs/API reference/Action objects
Action objects
The exact signed issuance and redemption payloads brands create before submission.
SignedOperation#
| Field | Type | Required | Meaning |
|---|---|---|---|
id | string | yes | Cursor ID and operation identifier. |
kind | issuance | redemption | yes | Which contract function this action targets. |
status | requires_wallet_authorization | pending | submitted | mined | rejected | cancelled | expired | yes | Wire status. The UI labels pending as Created and mined as Completed. |
verifyingContract | address | yes | Factory address to submit. |
issuer | address | yes | Brand signer. |
walletAddress | address | null | yes | Recipient for issuance or wallet whose balance is redeemed. |
deadline | uint256 string | yes | Execution deadline copied into the contract call. 0 means no deadline. |
metadata | Metadata | null | yes | Present on issuance operations, null on redemptions. |
txHash | bytes32 | null | yes | Set after the customer submits the transaction and it is indexed. |
{
"id": "128",
"kind": "issuance",
"status": "pending",
"chainId": "8453",
"verifyingContract": "0x3333333333333333333333333333333333333333",
"issuer": "0x1111111111111111111111111111111111111111",
"walletAddress": "0x2222222222222222222222222222222222222222",
"loyaltyId": "0x4242424242424242424242424242424242424242424242424242424242424242",
"amount": "1000",
"expiresAt": "0",
"deadline": "1790965800",
"nonce": "0x7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a",
"operationHash": "0x9999999999999999999999999999999999999999999999999999999999999999",
"data": "0x",
"metadata": {
"loyaltyId": "0x4242424242424242424242424242424242424242424242424242424242424242",
"name": "Bloom Coffee Rewards",
"symbol": "BLOOM",
"media": "ipfs://bafy.../bloom.png",
"description": "Rewards for Bloom Coffee customers."
},
"txHash": null,
"createdAt": "2026-06-20T10:15:00.000Z"
}IssuanceAction#
| Field | Type | Required | Meaning |
|---|---|---|---|
issuer | address | external signing | Brand wallet that signs the action. Omit together with the issuer signature for enabled API signing. |
loyaltyId | bytes32 | yes | Brand-scoped program ID. |
amount | uint256 string | yes | Number of eligible points to convert into wallet tokens. Must be greater than zero. |
expiresAt | uint256 string | yes | Use 0 for no expiry, or a Unix timestamp for an expiring bucket. |
deadline | uint256 string | yes | Last Unix timestamp when the issuance can be submitted. Use 0 for no execution deadline. |
nonce | bytes32 | yes | Unique per issuer. Replays are rejected. |
chainId | uint256 string | yes | Expected chain ID. Loyfin uses Base 8453. |
verifyingContract | address | yes | The Loyfin factory that will execute the action. |
operationHash | bytes32 | optional | Brand reference hash for correlating this action with an internal database row. Defaults to zero bytes when omitted. |
metadata | Metadata | yes | Program metadata. Required for issuance because the first issuance can create the program. |
data | hex bytes | optional | Brand-defined data. Defaults to 0x. Max 2048 bytes. |
RedemptionAction#
| Field | Type | Required | Meaning |
|---|---|---|---|
issuer | address | external signing | Brand wallet that signs the redemption. Omit together with the issuer signature for enabled API signing. |
loyaltyId | bytes32 | yes | Brand-scoped program ID. |
amount | uint256 string | yes | Tokenized loyalty amount to burn and reconcile offchain. Must be greater than zero. |
expiresAt | uint256 string | yes | The exact bucket to burn. Use 0 for non-expiring balances. |
deadline | uint256 string | yes | Last Unix timestamp when the redemption can be submitted. Use 0 for no execution deadline. |
nonce | bytes32 | yes | Unique per issuer. Replays are rejected. |
chainId | uint256 string | yes | Expected chain ID. Loyfin uses Base 8453. |
verifyingContract | address | yes | The Loyfin factory that will execute the action. |
operationHash | bytes32 | optional | Brand reference hash for correlating this action with an internal database row. Defaults to zero bytes when omitted. |
data | hex bytes | optional | Brand-defined fulfillment data. Defaults to 0x. Max 2048 bytes. |
Metadata#
| Field | Type | Required | Meaning |
|---|---|---|---|
loyaltyId | bytes32 | yes | Must match the action loyaltyId. |
name | string | yes | Customer-facing program name. Max 96 UTF-8 bytes. |
symbol | string | yes | Short program ticker or label. Max 24 UTF-8 bytes. |
media | string | yes | Shared artwork URL used as the image for every expiry bucket. Max 512 UTF-8 bytes. |
description | string | optional | Program description. Empty string is allowed. Max 1024 UTF-8 bytes. |