Skip to content
Last updated

Native Percents transaction format

Use content=percents-txn-stream for the recommended issuer transaction format. Upload UTF-8 CSV (fileType=csv, the default) or a JSON array (fileType=json). Both formats use the same row fields.

Row fields

FieldRequiredContract
idYesNon-empty issuer transaction identifier; unique within the file.
authDateYesReference date: ISO YYYY-MM-DD or ISO datetime with a timezone.
settlementDateNoOther transaction date: ISO YYYY-MM-DD or ISO datetime with a timezone; may be null.
amountYesInteger USD cents from -999999999 through 999999999, inclusive; 475 represents USD 4.75.
omniMerchantIdYesOmni merchant UUID returned by the merchant catalog.
cardBinYesString of exactly 6 or 8 digits; retain leading zeros.
cardLast4YesString of exactly 4 digits; retain leading zeros.
billingZipNoBilling postal code, or null.
countryCodeNoUppercase two-letter country code (for example US), or null.
mccNoFour-digit merchant category code as a string; retain leading zeros. May be null or blank in CSV.
segmentNonew, loyal, lapsed, or null.
authCodeYesAuthorization code.
locationStringYesTransaction location/descriptor string.
cardTypeYesLowercase visa, mastercard, discover, or amex.
authMethodYesswipe, chip, contactless, online, keyed_in, or other.
currencyYesUSD; other currencies are currently unsupported.
cardIdYesIssuer card identifier.
cardholderIdYesIssuer cardholder identifier.

Use the referenced merchant's segment definitions when supplying segment. Do not infer a merchant UUID from its name. Optional fields may be omitted or null in JSON and blank in CSV. Required fields must contain values.

TypeScript reference

export type UUID = `${string}-${string}-${string}-${string}-${string}`;

export type PercentsTxnUploadRow = {
  id: string;
  authDate: string;
  settlementDate?: string | null;
  amount: number;
  omniMerchantId: UUID;
  cardBin: string;
  cardLast4: string;
  billingZip?: string | null;
  countryCode?: string | null;
  mcc?: string | null;
  segment?: 'new' | 'loyal' | 'lapsed' | null;
  authCode: string;
  locationString: string;
  cardType: 'visa' | 'mastercard' | 'discover' | 'amex';
  authMethod:
    | 'swipe'
    | 'chip'
    | 'contactless'
    | 'online'
    | 'keyed_in'
    | 'other';
  currency: 'USD';
  cardId: string;
  cardholderId: string;
};

JSON files contain an array of these rows. Dates are ISO strings, and amount is an integer in USD cents. The field constraints above still apply; TypeScript does not validate values at runtime.

JSON example

[
  {
    "id": "issuer-transaction-001",
    "authDate": "2026-10-01T10:00:00Z",
    "settlementDate": null,
    "amount": 475,
    "omniMerchantId": "0df83025-5c37-4bb2-a258-f06bc34fd495",
    "cardBin": "012345",
    "cardLast4": "0042",
    "billingZip": "94607",
    "countryCode": "US",
    "mcc": "0742",
    "segment": "loyal",
    "authCode": "ABC123",
    "locationString": "Example Coffee Oakland CA",
    "cardType": "visa",
    "authMethod": "chip",
    "currency": "USD",
    "cardId": "issuer-card-001",
    "cardholderId": "issuer-cardholder-001"
  }
]

CSV example

The first row contains field names. Quote values containing commas, quotes, or line breaks according to CSV escaping rules.

id,authDate,settlementDate,amount,omniMerchantId,cardBin,cardLast4,billingZip,countryCode,mcc,segment,authCode,locationString,cardType,authMethod,currency,cardId,cardholderId
issuer-transaction-001,2026-10-01T10:00:00Z,,475,0df83025-5c37-4bb2-a258-f06bc34fd495,012345,0042,94607,US,0742,loyal,ABC123,Example Coffee Oakland CA,visa,chip,USD,issuer-card-001,issuer-cardholder-001

Whole-file validation

Malformed fields, undeclared JSON properties or CSV headers, unknown merchant IDs, and duplicate transaction IDs within a file fail validation for the entire file. No rows from a failed file are ingested. Correct the source and reserve a new filename before resubmitting. The processing result and file status expose validation and ingestion outcomes; they do not determine individual transaction approval, rewards, or invoices.