SpareSpare Docs
GuidesAPI Reference

Reconciliation

Read the status Spare has on record for a UAE payment request, its payments, and its mandates.

Reconciliation returns the status Spare has on record for one payment request in a single call: the request, its payments, and its mandates with their transactions. You use it when you would otherwise poll the payment request, each payment, and each mandate separately to see where that checkout stands.

This read is UAE only.

Latest status from the bank

The status in this response is the one Spare has on record. It is not always the latest status at the bank.

When you need the status the bank has now, refresh it with the call that matches the resource:

  • For the consent, call Sync with GET /consent/payment/sync. The request is on Payment Consents.
  • For the payment, call GET /payments/{paymentId}. The request is on Payments.

When To Use

Use this after a webhook gap, for a support lookup, or any time you need the ids and statuses together. Webhooks are still how you hear about a change as it happens. See Receive Events.

Read the Snapshot

GET /payment-requests/{paymentRequestId}/reconciliation

The path value is the payment request UUID or its internalReference. Both return the same snapshot. An unknown value, or an id that belongs to another client, returns not_found with message Payment request not found.

Send Authorization: Bearer and x-tenant: UAE. The call is not signed.

FieldMeaning
paymentRequestid, internalReference, and status of the payment request.
paymentsPayments that no mandate transaction points at. A single instant payment appears here.
mandatesMandates created from this request. Empty for a single instant payment.
mandates[].transactionsEach transaction's id and status.
mandates[].transactions[].paymentid, status, and consentId of the payment for that transaction. Omitted until Spare has recorded one. Not set on instalments paid before 27 October 2026, whose payments are in payments.

Each transaction status is PENDING, PROCESSING, COMPLETED, or FAILED. COMPLETED means the instalment has been posted to the bank, so the payment on that transaction can still be Pending. Payment request statuses match Payment flow. Mandate status is ACTIVE, INACTIVE, EXPIRED, FULFILLED, or REVOKED.

payments and mandates are always arrays. A request that has no payment and no mandate yet returns 200 with both arrays empty.

Replace the path value with the payment request id or internalReference from create.

curl "https://api.sandbox.tryspare.ae/payment-requests/Kp9mQx2nRwT/reconciliation" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "x-tenant: UAE"
const res = await fetch(
  `https://api.sandbox.tryspare.ae/payment-requests/${reference}/reconciliation`,
  {
    headers: {
      Authorization: `Bearer ${accessToken}`,
      "x-tenant": "UAE",
    },
  },
);

const { data } = await res.json();
import requests

res = requests.get(
    f"https://api.sandbox.tryspare.ae/payment-requests/{reference}/reconciliation",
    headers={
        "Authorization": f"Bearer {access_token}",
        "x-tenant": "UAE",
    },
)

data = res.json()["data"]
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create(
        "https://api.sandbox.tryspare.ae/payment-requests/" + reference + "/reconciliation"))
    .header("Authorization", "Bearer " + accessToken)
    .header("x-tenant", "UAE")
    .GET()
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
using var client = new HttpClient();
var request = new HttpRequestMessage(
    HttpMethod.Get,
    $"https://api.sandbox.tryspare.ae/payment-requests/{reference}/reconciliation");
request.Headers.Add("Authorization", $"Bearer {accessToken}");
request.Headers.Add("x-tenant", "UAE");

var response = await client.SendAsync(request);
req, err := http.NewRequest(
    http.MethodGet,
    "https://api.sandbox.tryspare.ae/payment-requests/"+reference+"/reconciliation",
    nil,
)
req.Header.Set("Authorization", "Bearer "+accessToken)
req.Header.Set("x-tenant", "UAE")

res, err := http.DefaultClient.Do(req)

A mandate with one unpaid transaction and one transaction that already has a payment looks like this. The paid instalment is on the transaction, and it is left out of payments. Instalments paid before 27 October 2026 keep their payment in payments, and the transaction has no payment.

{
  "data": {
    "paymentRequest": {
      "id": "7c1e0a2b-4d55-4e8a-9f10-2b6c8d0e1a33",
      "internalReference": "Kp9mQx2nRwT",
      "status": "Scheduled"
    },
    "payments": [],
    "mandates": [
      {
        "id": "a91c4e20-1b7d-4f6a-8c33-0e5d9a2b7c14",
        "status": "ACTIVE",
        "consentId": "b30d8f11-6a4e-4c92-9d77-1f2e6b8c0a55",
        "transactions": [
          {
            "id": "c44e1a90-8d2b-4f71-a6c0-3e9b1d5f7a22",
            "status": "PENDING"
          },
          {
            "id": "d55f2b01-9e3c-4a82-b7d1-4f0c2e6a8b33",
            "status": "COMPLETED",
            "payment": {
              "id": "e66a3c12-0f4d-4b93-c8e2-5a1d3f7b9c44",
              "status": "Pending",
              "consentId": "b30d8f11-6a4e-4c92-9d77-1f2e6b8c0a55"
            }
          }
        ]
      }
    ]
  }
}

A single instant payment has no mandate. Its payment is in payments, and mandates is [].

What Is Missing

  • No payment recorded for a transaction: payment is omitted.
  • A payment linked to a transaction: that payment is on the transaction, and it is left out of payments.
  • Instalments paid before 27 October 2026: the transaction can be COMPLETED with no payment, and the payment is in payments.
  • A payment with no transaction: it is in payments. This is the single instant payment case, and any payment Spare has not attached to an instalment.

On this page