PayFacto API - v2.0 - POST /refunds

PayFacto API - v2.0 - POST /refunds

PayFacto API - v2.0 - POST /refunds

Issues a refund for a previously completed charge. Partial refunds are supported — the amount must not exceed the remaining captured amount.

1

Prerequisites

🔑

Authentication — HTTP Basic Auth

All v2.0 endpoints use HTTP Basic Authentication. Set Authorization: Basic base64(username:password). Contact PayFacto for credentials.

📋

Content-Type

All request bodies require Content-Type: application/json.

🔄

Idempotency

Include Idempotency-Key header (max 64 chars) on POST requests. 200 = duplicate; 201 = newly created.

💵

Amounts

All monetary amounts are positive integers in cents. $12.99 = 1299.

2

Request

POST  https://uat.ca.api.payfacto.cloud/payments/v1/refunds
ℹ️

A charge must be captured or succeeded to be refunded. If the batch is settled, use this endpoint rather than a void.

Request body fields

FieldConstraintDescription
amountinteger · requiredAmount to refund in cents. Must be >= 1 and <= remaining captured amount.
chargeIdstring (UUID) · requiredID of the charge to refund.
reasonstring · requiredDUPLICATE, FRAUDULENT, REQUESTED_BY_CUSTOMER, or REQUESTED_BY_MERCHANT.
metadataobject · optionalKey-value pairs stored with the refund.
paymentMethodobject · optionalOverride payment method. Required for some terminal flows.

reason values

reasonDescription
DUPLICATEDuplicate transaction
FRAUDULENTSuspected fraud
REQUESTED_BY_CUSTOMERCustomer requested
REQUESTED_BY_MERCHANTMerchant initiated
3

Request — Code Example

⚠️

Use UAT credentials during testing.

JSON — Refund request
{
"amount": 1299,
"chargeId": "a1822999-099d-4fb1-a354-77be553a5b22",
"reason": "REQUESTED_BY_CUSTOMER",
"metadata": { "ticket": "TKT-0042" }
}
4

Response

Response fields (refund object)

FieldTypeDescription
idstring (UUID)Unique refund identifier.
amountintegerRefund amount in cents.
chargeIdstring (UUID)The charge that was refunded.
failureReasonstringIf failed: LOST_OR_STOLEN_CARD, EXPIRED_OR_CANCELLED_CARD, UNKNOWN.
metadataobjectKey-value pairs.
originalTransactionTimestring (ISO 8601)UTC timestamp of original charge.
paymentMethodobjectPayment method used for the refund.
reasonstringRefund reason from request.
resultobjectAuth result including authCode.
statusstringSUCCEEDED, FAILED, or VOIDED.
transactionTimestring (ISO 8601)UTC timestamp when this refund was created.
voidDetailobjectVoid details if voided.
errorobjectError object on failure.
5

Response — Code Examples

JSON — 201 Succeeded
{
"id": "3a2049fb-6c9f-433d-9cef-701b6843f0cd",
"amount": 1299,
"chargeId": "a1822999-099d-4fb1-a354-77be553a5b22",
"reason": "REQUESTED_BY_CUSTOMER",
"result": { "authCode": "012345" },
"status": "SUCCEEDED",
"transactionTime": "2024-05-15T17:00:01Z"
}
JSON — 402 Failed
{
"id": "3a2049fb-6c9f-433d-9cef-701b6843f0cd",
"amount": 1299,
"failureReason": "LOST_OR_STOLEN_CARD",
"reason": "REQUESTED_BY_CUSTOMER",
"status": "FAILED",
"error": { "code": "ISSUER_DECLINED", "type": "CARD_ERROR", "message": "Declined by the issuer." }
}
6

Error / HTTP Status Codes

HTTP StatusMeaningRecommended Action
200OK — Previously created (same idempotency key)Check status field in response body
201Created — New resource createdStore the id for future operations
400Bad Request — Invalid payloadCheck error.details and error.invalidFields
402Payment Required — Issuer declinedCheck result.declineCode — do not retry automatically
404Not FoundVerify the ID in the request path
422Unprocessable — Invalid stateCheck error.message
500Internal Server ErrorRetry with backoff; contact PayFacto Support if persistent