PayFacto API - v1.0 - POST /v1/datacandy/partialCancel

PayFacto API - v1.0 - POST /v1/datacandy/partialCancel

PayFacto API - v1.0 - POST /v1/datacandy/partialCancel

Reverses a partial amount from a previously committed DataCandy transaction, returning the specified amount to the card balance. The OriginalInvoiceNumber and OriginalTransactionNumber from the original transaction are required. This is a direct operation β€” no commit or cancel follow-up is needed.

1

Prerequisites

πŸ”‘

API Key

Generate your API key from the Payments Manager: Administrator Client β†’ API Key β†’ Add New Key. Pass it as auth-api-key in every request.

πŸͺ

Company & Merchant Numbers

Your CompanyNumber (5-digit) and MerchantNumber (8-digit) are issued by PayFacto during onboarding. Both are required on every DataCandy Partial Cancel request.

🌐

Environment Base URL

Test: https://test.api.payfacto.cloud/v1   |   Production: Provided by the PayFacto Integration team upon certification.

πŸ“¦

Request Format β€” Base64-Encoded Payload

Requests use HTTP POST with an application/x-www-form-urlencoded body. Assemble all parameters as a cleartext query string, Base64-encode it, then send: auth-api-key={key}&payload={base64}. For terminal transactions (InputType=N), send CardNumber as 40 space characters and ExpirationDate as 4 space characters.

🎁

DataCandy Gift & Loyalty Cards

DataCandy is a gift and loyalty card solution integrated through PayFacto. All DataCandy endpoints operate on cards identified by CardNumber. DataCandy card transactions are identified by card type F (Datacandy/fidelity) in the response. Refer to the DataCandy documentation for account type numbers and card program specifics.

↩️

Original Transaction Required β€” Direct Operation

This endpoint reverses a partial amount from a previously committed DataCandy transaction. The OriginalInvoiceNumber and OriginalTransactionNumber from the original transaction response must be supplied. The partial cancel amount must not exceed the amount of the original transaction. No transactionConfirmationNumber is returned β€” this is a direct operation and no commit or cancel follow-up is required.

2

Request

POST https://test.api.payfacto.cloud/v1/datacandy/partialCancel
ℹ️

All parameters are passed inside the Base64-encoded payload form field. Raw body format: auth-api-key=<key>&payload=<base64>. For terminal transactions (InputType=N), send CardNumber as 40 space characters and ExpirationDate as 4 space characters. This endpoint has no optional fields.

Required fields

FieldTypeDescription
CompanyNumberNumeric(5)Identifies the merchant on PayFacto's network. Provided by PayFacto during onboarding. Example: 12345
MerchantNumberNumeric(8)Identifies the merchant to PayFacto's network. Provided by the integration team. Example: 53400000
CustomerNumberAlphanumeric(8)Merchant-assigned customer identifier. Associates a client record with the transaction. Example: CLIENT12
AmountNumeric(11)The partial amount to reverse and return to the card balance, including the decimal portion, left (0) padded. Must not exceed the amount of the original transaction. Example: 00000001000 = $10.00
InvoiceNumberAlphanumeric(12)Merchant-generated invoice number for this Partial Cancel operation. May be unique or reused per merchant needs. Example: PCN000000001
InputTypeAlphanumeric(1)How the transaction is initiated. N = terminal/pinpad (Semi-Integrated), I = Internet/E-Commerce, M = MOTO, U = Unattended.
CardTypeAlphanumeric(1)Card brand. For InputType=N send a blank space. For I/M: A = Amex, M = Mastercard, V = Visa, I = Diners, O = Discover. Blank for unknown.
CardNumberAlphanumeric(40)The DataCandy gift or loyalty card number, left-justified and space-padded to 40 characters. For InputType=N, send 40 space characters β€” the terminal reads the card directly.
ExpirationDateNumeric(4)Card expiration date in MMYY format. For InputType=N, send 4 space characters. Example: 1226
MerchantTerminalNumberNumeric(5)Identifies the terminal on PayFacto's network. For E-Commerce transactions, send 5 blank spaces. Example: 12345
LanguageCodeAlphanumeric(1)Language for PayFacto responses and terminal display. F = French, E = English.
CurrencyCodeAlphanumeric(3)Currency of the transaction (indicative only). CAD = Canadian dollars, USD = US dollars (requires a US merchant number).
OperatorIDAlphanumeric(8)Identifies the cashier, agent, or system that initiated the transaction. Example: USER0001
OriginalInvoiceNumberAlphanumeric(12)The merchant's invoice number from the original DataCandy transaction, exactly as it appeared in the original request and response. Must match the value recorded on the original transaction. Example: INV000000001
OriginalTransactionNumberNumeric(12)The PayFacto gateway transaction number returned in the response of the original DataCandy transaction. Example: 000111222333
3

Request β€” Code Example

⚠️

The example below uses the test endpoint and a sandbox API key, and shows an E-Commerce (InputType=I) partial cancel. Replace credentials and base URL before going live.

cURL
# DataCandy Partial Cancel -- POST /v1/datacandy/partialCancel
# Step 1: Build the cleartext payload

PAYLOAD="CompanyNumber=12345&MerchantNumber=53400000&CustomerNumber=CLIENT12&Amount=00000001000&InvoiceNumber=PCN000000001&InputType=I&CardType= &CardNumber=6006491000000000001 &ExpirationDate=1226&MerchantTerminalNumber= &LanguageCode=E&CurrencyCode=CAD&OperatorID=USER0001&OriginalInvoiceNumber=INV000000001&OriginalTransactionNumber=000111222333"

# Step 2: Base64-encode the payload
ENCODED=$(echo -n "$PAYLOAD" | base64)

# Step 3: Submit the request
curl -X POST "https://test.api.payfacto.cloud/v1/datacandy/partialCancel" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "auth-api-key=YOUR_TEST_API_KEY&payload=$ENCODED"
4

Response

Always returned

FieldTypeDescription
returnCodeAlphanumeric(4)Identifies the exact status of the transaction result. 00 = approved. All other values indicate a failure. Refer to Section 6 for endpoint-specific codes.
balanceAmountNumeric(12)The balance in dollars available on the card after the partial cancel. The reversed amount has been credited back to this balance. Example: 000000003500 = $35.00
totalBalanceAmountNumeric(12)The total balance on the card including all locked amounts after the partial cancel. Example: 000000003500 = $35.00
remainingAmountNumeric(12)The amount remaining on this partial cancel transaction. Example: 000000000000 = $0.00
accountTypeNumberNumeric(1)The account type number associated with the DataCandy card program. Refer to the DataCandy documentation for possible values.
picNumeric(1)Indicates whether the card's profile is complete. 1 = complete, 0 = incomplete.
transactionNumberNumeric(12)Unique PayFacto gateway transaction identifier for this Partial Cancel. Example: 000111222444
cardNumberAlphanumeric(40)Echo of the request CardNumber (masked).
cardTypeAlphanumeric(1)Card type determined by the network. For DataCandy transactions this will always be F (Datacandy/fidelity).
companyNumberNumeric(5)Echo of the request CompanyNumber.
expirationDateNumeric(4)Echo of the request ExpirationDate, in MMYY format.
invoiceNumberAlphanumeric(12)Echo of the request InvoiceNumber.
languageCodeAlphanumeric(1)Echo of the request LanguageCode.
merchantNumberNumeric(8)Echo of the request MerchantNumber.
operatorIdAlphanumeric(8)Echo of the request OperatorID.
receiptDispAlphanumeric(32)PayFacto-generated receipt message. Can be used to produce a receipt. Example: APPROVED-THANK-YOU
referenceNumberAlphanumeric(10)Reference number obtained following successful processing of the transaction.
sequenceNumberAlphanumeric(12)Sequence number generated by the banking acquirer.
serverNumberAlphanumeric(4)Identifies the PayFacto Network server that processed the transaction.
terminalDispAlphanumeric(24)Message displayed on the terminal or payment page. Example: APPROVED
terminalNumberNumeric(5)Identifies the terminal in the PayFacto Network used to process the transaction.
timeStampAlphanumeric(17)Date and time the transaction was processed on the payment server. Format: YYYYMMDD-HHMMSSCC. Example: 20240515-14300100
trxDateNumeric(8)Transaction date at the banking acquirer. Format: MMDDYYYY. May differ from timeStamp.
trxMethodAlphanumeric(3)Summarizes how the transaction was processed. First character: D = swiped, T = manual entry. Third character: 1 = authorized. Example: T@1
trxTimeNumeric(6)Transaction time at the banking acquirer. Format: HHMMSS. May differ from timeStamp.
trxTypeAlphanumeric(1)Type of card used. For DataCandy transactions this will be F = Fidelity/Gift.

Conditionally returned

FieldTypeDescription
startDateAlphanumeric(10)Only returned when the card has a start date later than its activation date. If not returned, the card is active. Format: YYYY-MM-DD. Example: 2024-12-31
ctmString(155)Only returned when the DataCandy program has a consumer targeted message configured. A multiple-line message to be printed on the customer receipt. Each line is separated by a pipe | character.
customerNumberAlphanumeric(8)Only returned when provided in the request. Echo of the request CustomerNumber.
demoModeAlphanumeric(4)Only returned when the terminal is in demo mode. Value will be true.
errorDescriptionAlphanumeric(50)Only returned when the transaction is not approved. Human-readable description of the failure reason.
terminalInvoiceNumberNumeric(12)Only returned for terminal transactions. Terminal-assigned invoice number.
5

Response β€” Code Example

JSON β€” 200 Approved
{
"returnCode": "00",
"transactionNumber": "000111222444",
"referenceNumber": "0000000002",
"balanceAmount": "000000003500",
"totalBalanceAmount": "000000003500",
"remainingAmount": "000000000000",
"accountTypeNumber": "1",
"pic": "1",
"cardNumber": "6006491XXXXX0001 ",
"cardType": "F",
"trxType": "F",
"trxDate": "05152024",
"trxTime": "145001",
"trxMethod": "T@1",
"timeStamp": "20240515-14500100",
"sequenceNumber": "000011112224",
"serverNumber": "0001",
"terminalNumber": "00001",
"companyNumber": "12345",
"merchantNumber": "53400000",
"invoiceNumber": "PCN000000001",
"expirationDate": "1226",
"languageCode": "E",
"operatorId": "USER0001",
"receiptDisp": "APPROVED-THANK-YOU ",
"terminalDisp": "APPROVED "
}
JSON β€” Declined / Error
{
"returnCode": "9068",
"errorDescription": "ORIGINAL TRANSACTION NUMBER NOT FOUND",
"terminalDisp": "DECLINED ",
"receiptDisp": "DECLINED ",
"transactionNumber": "000111222445",
"timeStamp": "20240515-14500200"
}
6

Error / Return Codes

The following codes are most relevant to this endpoint. For the complete catalogue see the Return Code Index.

Return CodeMeaningWhen it occursRecommended Action
00Transaction approvedThe partial amount was reversed and credited back to the card balance successfully.Display the updated balanceAmount on the receipt. Print the ctm message if present. No follow-up operation is required.
05Transaction declinedThe partial cancel was declined by the DataCandy platform or the issuer.Retry the transaction. If the problem persists, contact PayFacto customer service.
9004"Null" value: company numberCompanyNumber is null or blank in the payload.Check your application. The field must correspond to the specification in the documentation.
9005 / 9006Invalid / rejected: company numberCompanyNumber does not match the required 5-digit length or is not configured in the payment solution.Make sure the application uses the correct company number provided by PayFacto. If it does, contact PayFacto customer service.
9007"Null" value: merchant numberMerchantNumber is null or blank in the payload.Check your application. The field must correspond to the specification in the documentation.
9008 / 9009Invalid / rejected: merchant numberMerchantNumber does not match the required 8-digit length or is not configured in the payment solution.Make sure the application uses the merchant number provided by PayFacto. If it does, contact PayFacto customer service.
9013 / 9014 / 9015Null / invalid / rejected: amountAmount is null, does not match the required 11-digit length, or does not follow the specification.Confirm the amount is left (0) padded to 11 digits, includes the decimal portion, and does not exceed the original transaction amount. If the problem persists, contact PayFacto customer service.
9016 / 9017 / 9018Null / invalid / rejected: invoice numberInvoiceNumber is null, exceeds 12 characters, or does not follow the specification.Check your application. The field must correspond to the specification in the documentation.
9019 / 9020 / 9021Null / invalid / rejected: input typeInputType is null, not a single character, not in the list of accepted values (N, I, M, U), or not associated with the merchant.Check your application. The field must correspond to the specification in the documentation.
9022 / 9023 / 9024Null / invalid / rejected: card typeCardType is null, not a single character, or not in the list of accepted values.Check your application. For terminal transactions send a blank space; for E-Commerce use one of the accepted card type codes.
9025 / 9026 / 9027Null / invalid / rejected: card numberCardNumber is null, exceeds 40 characters, or does not follow the specification.For terminal transactions send 40 space characters. For E-Commerce, send the card number left-justified and space-padded to 40 characters.
9028 / 9029 / 9030Null / invalid / rejected: expiration dateExpirationDate is null, not 4 characters, or does not follow the specification.For terminal transactions send 4 space characters. For E-Commerce, send in MMYY format.
9031"Null" value: POS terminal numberMerchantTerminalNumber is null or blank when a terminal transaction is being attempted.Check your application. For terminal transactions provide a valid terminal number; for E-Commerce send 5 blank spaces.
9032 / 9033Invalid / rejected: POS terminal numberMerchantTerminalNumber does not follow the specification, or the merchant is not configured as a POS terminal merchant.Check your application. The field must correspond to the specification in the documentation. If the problem persists, contact PayFacto customer service.
9034 / 9035 / 9036Null / invalid / rejected: language codeLanguageCode is null, not a single character, or not one of the accepted values (F, E).Check your application. The field must correspond to the specification in the documentation.
9037 / 9038 / 9039Null / invalid / rejected: currencyCurrencyCode is null, not 3 characters, or not one of the accepted values (CAD, USD).Check your application. The field must correspond to the specification in the documentation.
9040 / 9041 / 9042Null / invalid / rejected: operator IDOperatorID is null, exceeds 8 characters, or does not follow the specification.Check your application. The field must correspond to the specification in the documentation.
9056 / 9057 / 9058Null / invalid / rejected: original invoice numberOriginalInvoiceNumber is null, exceeds 12 characters, or was rejected because it does not follow the specification.Make sure you are sending the invoice number exactly as it appeared on the original DataCandy transaction request and response.
9068Original transaction number not foundNo transaction matching the submitted OriginalTransactionNumber exists in the system.Check your application. Make sure you are sending the correct transaction number from the original DataCandy transaction response.
3666One or more terminals are busyAll of the merchant's terminals are currently processing transactions.Wait and retry. If the problem persists, contact PayFacto customer service.
3667Semi-integrated terminal is busyThe target terminal is currently processing another transaction or a recovery is in progress.Wait 15 seconds and retry. If the problem persists, contact PayFacto customer service.
3668Waiting for a recoveryAn error occurred with the semi-integrated terminal. A recovery must be completed before another operation can be processed.Make sure everything is plugged in correctly. If needed, restart the driver and unplug then replug the terminal power. Wait 35 seconds and retry. If the problem persists, contact PayFacto customer service.
3777Inexistent terminal and/or merchantThe merchant or terminal has not been configured in the Dispatcher module.If the problem persists, contact PayFacto customer service.
9051Time outTransaction processing timed out. Often caused by an inactive Dispatcher module.Retry the transaction. If the problem persists, contact PayFacto customer service.
9049 / 9050Fatal errorA critical error occurred while processing the transaction.Retry the transaction. If the problem persists, contact PayFacto customer service.