Payment statuses

Every payment has two statuses in API responses:

Each ISO status maps to exactly one Syntropi status. Syntropi works out its own status from the ISO status, so the two never disagree.

"status": "FAILED",
"isoStatus": {
  "code": "RJCT",
  "name": "Rejected",
  "description": "The payment was rejected, did not complete, or timed out.",
  "reason": { "code": "AM04", "name": "InsufficientFunds" }
}

isoStatus is returned on create, GET /api/payments/{paymentId}, the list, and on every entry of statusHistory. reason appears only on RJCT and CANC.

ISO status to Syntropi status#

ISO codeISO nameSyntropi status
RCVDReceivedPENDING
PDNGPendingAUTHORIZING
ACTCAcceptedTechnicalValidationAUTHORIZED
ACCPAcceptedCustomerProfileSUBMITTED
ACSPAcceptedSettlementInProcessACCEPTED
ACSCAcceptedSettlementCompletedCOMPLETED
RJCT, any reason except NOASRejectedFAILED
RJCT with NOASRejected, no answer from customerEXPIRED
CANCCancelledCANCELLED

ISO has no "expired" status, so a payment that was never answered is reported as RJCT with reason NOAS. Provider codes ACWC and ACWP are treated as ACSP, ACFC as ACCP, and ACIS as ACSC. An unknown code never moves a payment to a final status.

Reason codes in use: AM04 InsufficientFunds, AC04 ClosedAccountNumber, CUST RequestedByCustomer, NOAS NoAnswerFromCustomer, NARR Narrative (any other reason).

Rules#

Token.io statuses#

Token.io statusISOSyntropi
INITIATION_PENDING*, PENDING_AUTHENTICATIONPDNGAUTHORIZING
INITIATION_PENDING_REDEMPTION*, PENDING_SUBMISSIONACTCAUTHORIZED
INITIATION_PROCESSING, SUBMITTEDACCPSUBMITTED
SETTLEMENT_IN_PROGRESS, INITIATION_COMPLETED, ACCEPTEDACSPACCEPTED
SETTLEMENT_COMPLETED, COMPLETEDACSCCOMPLETED
INITIATION_REJECTED_INSUFFICIENT_FUNDSRJCT / AM04FAILED
INITIATION_REJECTED, INITIATION_FAILED, SETTLEMENT_INCOMPLETE, FAILEDRJCT / NARRFAILED
INITIATION_DECLINED, CANCELLEDCANC / CUSTCANCELLED
INITIATION_EXPIRED, EXPIREDRJCT / NOASEXPIRED