ARYZE Open Finance

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.

On this page