Retrieve the full state of a card transaction — including status, decline reason, amounts, and billing details.
Overview
Use the Payment Info endpoint to fetch the complete transaction state.
This endpoint is the source of truth when:
- A webhook was not received (network issues, downtime)
- You need to verify a transaction before fulfilling an order
- You need full details for reconciliation or support
Webhooks should be your primary mechanism. Use polling only as a fallback.
Endpoint
GET /api/v1/payments/card/info/{id}
Retrieve full details of a card transaction.
Headers
| Header | Value |
|---|---|
| Authorization | Bearer {token} |
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| id | String | Unique transaction ID returned at creation time |
Important Notes
Use /info, not /status
/info, not /status/info/{id}returns declineCode on failure- Status-only endpoints do not provide decline reasons
Key Response Fields
| Field | Type | Description |
|---|---|---|
| transactionId | String | Unique transaction identifier |
| requestId | String | Idempotency key used in the original request |
| mid | String | Merchant account ID |
| transactionStatus | String | Current transaction status |
| declineCode | Integer | Decline reason (only when FAILED) |
| cardMask | String | Masked card number (e.g. 411111****1111) |
| cardHolder | String | Cardholder name |
| orderCurrency | String | Requested currency |
| processedCurrency | String | Settlement currency |
| orderAmount | Number | Requested amount |
| processedAmount | Number | Processed amount (may differ due to FX) |
| conversionRate | Number | Applied FX rate |
| callbackUrl | String | Webhook endpoint for final status |
| billingDetails | Object | Customer billing information |
| order | Object | Order-related data |
| createdAt | String | ISO 8601 timestamp |
| metadata | Map | Custom key-value data |
Transaction Status Lifecycle
| Status | Terminal | Description |
|---|---|---|
| NEW | No | Transaction created |
| PENDING | No | Sent to processor |
| PROCESSING | No | Actively processing |
| CUSTOMER_VERIFICATION | No | Waiting for 3DS completion |
| SUCCEED | Yes | Payment successful |
| FAILED | Yes | Payment declined (check declineCode) |
| REFUNDED | Yes | Fully refunded |
| CHARGEBACK | Yes | Chargeback initiated |
| CANCELLED | Yes | Transaction cancelled |
Stop polling once a terminal status is reached.
Polling Strategy (Fallback Only)
If webhook is not received:
- Start polling after ~2 seconds
- Use exponential backoff
- Cap interval at ~30 seconds
- Never poll more frequently than every 2 seconds
- Stop when:
- A terminal status is reached
- Max retry limit is exceeded
Example Response
{
"transactionId": "123456789",
"requestId": "req-abc-123",
"mid": "mid-001",
"transactionStatus": "FAILED",
"declineCode": 51,
"cardMask": "411111****1111",
"cardHolder": "John Doe",
"orderCurrency": "USD",
"processedCurrency": "USD",
"orderAmount": 100,
"processedAmount": 100,
"conversionRate": 1,
"callbackUrl": "https://merchant.com/webhook",
"createdAt": "2026-04-24T10:15:30Z",
"metadata": {
"orderId": "ORD-123"
}
}Error Responses
| HTTP Status | Description |
|---|---|
| 400 | Bad Request — invalid or missing parameters |
| 401 | Unauthorized — invalid or expired token |
| 404 | Not Found — transaction does not exist |
| 500 | Internal Server Error — retry with backoff |
Best Practices
- Treat webhooks as the primary source of truth
- Use
/infoonly as a fallback - Always check
declineCodewhen status isFAILED - Store
transactionIdandrequestIdfor reconciliation - Stop polling immediately after terminal status

