Check payment status
Poll the transaction endpoint to confirm a payment's current state, or as a backup to webhooks.
Webhooks are the primary way to learn about status changes. Polling
GET /v1/payments/{transactionId} is useful for:
- A safety net in case a webhook is delayed or lost.
- Back-office tools that inspect a single transaction on demand.
- Reconciliation jobs that verify your local state against ARYZE.
Don't poll in a tight loop. Bank settlement can take seconds to minutes — use
at least a 5-second interval, stop as soon as the status is terminal
(COMPLETED or FAILED), and cap the total duration (for example, 10
minutes).
Fetch the transaction
curl https://payment-api.openfinance.aryze.io/v1/payments/2f1a3e8c-9b7d-4a11-8c6f-d3e5e9b1a2c0 \
-H "Authorization: Bearer $ACCESS_TOKEN"async function getPayment(transactionId: string, token: string) {
const res = await fetch(
`${process.env.ARYZE_API_BASE}/v1/payments/${transactionId}`,
{ headers: { Authorization: `Bearer ${token}` } },
);
if (res.status === 404) return null;
if (!res.ok) throw new Error(`Lookup failed: ${res.status}`);
return res.json();
}def get_payment(transaction_id: str, token: str):
res = requests.get(
f'https://payment-api.openfinance.aryze.io/v1/payments/{transaction_id}',
headers={'Authorization': f'Bearer {token}'},
)
if res.status_code == 404:
return None
res.raise_for_status()
return res.json()public async Task<PaymentTransaction?> GetPaymentAsync(string transactionId, string token)
{
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
var res = await http.GetAsync(
$"https://payment-api.openfinance.aryze.io/v1/payments/{transactionId}");
if (res.StatusCode == HttpStatusCode.NotFound) return null;
res.EnsureSuccessStatusCode();
return await res.Content.ReadFromJsonAsync<PaymentTransaction>();
}Status values
Prop
Type
You may have seen CANCELLED in the dashboard's status filter — that's a UI
option, but no transaction ever sits in CANCELLED at the API level. A
cancelled bank transfer surfaces as status: "FAILED" with
mastercardStatus: "CANCELLED".
Polling pattern
async function waitForTerminalStatus(
transactionId: string,
token: string,
{
intervalMs = 5000,
timeoutMs = 10 * 60 * 1000,
}: { intervalMs?: number; timeoutMs?: number } = {},
) {
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
const payment = await getPayment(transactionId, token);
if (!payment) return { status: 'NOT_FOUND' } as const;
if (payment.status === 'COMPLETED' || payment.status === 'FAILED') {
return payment;
}
await new Promise((r) => setTimeout(r, intervalMs));
}
return { status: 'TIMEOUT' } as const;
}Response
The transaction response includes both the ARYZE status and the underlying Mastercard status, plus any metadata you stored at initiation.
{
"transactionId": "2f1a3e8c-9b7d-4a11-8c6f-d3e5e9b1a2c0",
"mastercardPaymentId": "mcob_8f3c2a...",
"amount": 100.50,
"currencyCode": "EUR",
"status": "COMPLETED",
"mastercardStatus": "PAYMENT_EXECUTED_CREDITED",
"paymentRail": "SepaCreditTransfer",
"reference": "ORDER12345",
"endToEndId": "E2E-ORDER12345",
"redirectUrl": "https://yourapp.com/checkout/return",
"flowUrl": "https://payment.aryze.io/complete/abc123...",
"providerId": "bank_xyz",
"metadata": "{\"orderId\":\"ORDER12345\"}",
"initiationTimestamp": "2026-04-21T14:30:00Z",
"updatedTimestamp": "2026-04-21T14:32:10Z",
"completedTimestamp": "2026-04-21T14:32:10Z"
}See the full field reference.