Docs/API reference/Action objects

Action objects

The exact signed issuance and redemption payloads brands create before submission.

SignedOperation#

FieldTypeRequiredMeaning
idstringyesCursor ID and operation identifier.
kindissuance | redemptionyesWhich contract function this action targets.
statusrequires_wallet_authorization | pending | submitted | mined | rejected | cancelled | expiredyesWire status. The UI labels pending as Created and mined as Completed.
verifyingContractaddressyesFactory address to submit.
issueraddressyesBrand signer.
walletAddressaddress | nullyesRecipient for issuance or wallet whose balance is redeemed.
deadlineuint256 stringyesExecution deadline copied into the contract call. 0 means no deadline.
metadataMetadata | nullyesPresent on issuance operations, null on redemptions.
txHashbytes32 | nullyesSet after the customer submits the transaction and it is indexed.
SignedOperationjson
{
  "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#

FieldTypeRequiredMeaning
issueraddressexternal signingBrand wallet that signs the action. Omit together with the issuer signature for enabled API signing.
loyaltyIdbytes32yesBrand-scoped program ID.
amountuint256 stringyesNumber of eligible points to convert into wallet tokens. Must be greater than zero.
expiresAtuint256 stringyesUse 0 for no expiry, or a Unix timestamp for an expiring bucket.
deadlineuint256 stringyesLast Unix timestamp when the issuance can be submitted. Use 0 for no execution deadline.
noncebytes32yesUnique per issuer. Replays are rejected.
chainIduint256 stringyesExpected chain ID. Loyfin uses Base 8453.
verifyingContractaddressyesThe Loyfin factory that will execute the action.
operationHashbytes32optionalBrand reference hash for correlating this action with an internal database row. Defaults to zero bytes when omitted.
metadataMetadatayesProgram metadata. Required for issuance because the first issuance can create the program.
datahex bytesoptionalBrand-defined data. Defaults to 0x. Max 2048 bytes.

RedemptionAction#

FieldTypeRequiredMeaning
issueraddressexternal signingBrand wallet that signs the redemption. Omit together with the issuer signature for enabled API signing.
loyaltyIdbytes32yesBrand-scoped program ID.
amountuint256 stringyesTokenized loyalty amount to burn and reconcile offchain. Must be greater than zero.
expiresAtuint256 stringyesThe exact bucket to burn. Use 0 for non-expiring balances.
deadlineuint256 stringyesLast Unix timestamp when the redemption can be submitted. Use 0 for no execution deadline.
noncebytes32yesUnique per issuer. Replays are rejected.
chainIduint256 stringyesExpected chain ID. Loyfin uses Base 8453.
verifyingContractaddressyesThe Loyfin factory that will execute the action.
operationHashbytes32optionalBrand reference hash for correlating this action with an internal database row. Defaults to zero bytes when omitted.
datahex bytesoptionalBrand-defined fulfillment data. Defaults to 0x. Max 2048 bytes.

Metadata#

FieldTypeRequiredMeaning
loyaltyIdbytes32yesMust match the action loyaltyId.
namestringyesCustomer-facing program name. Max 96 UTF-8 bytes.
symbolstringyesShort program ticker or label. Max 24 UTF-8 bytes.
mediastringyesShared artwork URL used as the image for every expiry bucket. Max 512 UTF-8 bytes.
descriptionstringoptionalProgram description. Empty string is allowed. Max 1024 UTF-8 bytes.