> ## Documentation Index
> Fetch the complete documentation index at: https://developer.tazapay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SWIFT GPI Tracking

## Overview

Tazapay's SWIFT GPI Tracking gives you real-time visibility into the journey of your SWIFT payouts through the initiating and correspondent banking chain. Each transfer is identified by a UETR (Unique End-to-End Transaction Reference) and tracked hop-by-hop until funds reach the beneficiary.

Tracking events are delivered as webhook notifications and do not affect the payout lifecycle status (succeeded, failed, etc.).

## Key Concepts

| Term                  | Description                                                                                                                    |
| :-------------------- | :----------------------------------------------------------------------------------------------------------------------------- |
| UETR                  | Unique End-to-End Transaction Reference. A UUID assigned to every SWIFT transfer for end-to-end tracking.                      |
| GPI                   | Global Payments Innovation — SWIFT's real-time tracking layer for cross-border transfers.                                      |
| GPI hop               | Each correspondent bank that processes the transfer generates a status update (a "hop"). Tazapay emits a webhook on every hop. |
| `payout.gpi_tracking` | The Tazapay webhook event emitted on every new GPI hop. Additive — does not change `payout.status`.                            |

## Availability

* SWIFT GPI Tracking is available for all eligible SWIFT payouts processed by Tazapay.
* Tracking is delivered via webhook. GET API access is coming soon.
* GPI Tracking is free during the launch period. After the initial rollout window, it will move to an opt-in paid feature — you'll be notified in advance before any change takes effect.

## Webhook Event: `payout.gpi_tracking`

### When is it fired?

A `payout.gpi_tracking` event is emitted every time a new status update is received for a SWIFT transfer — typically once per correspondent bank hop. Every event includes the full cumulative timeline, so you always have the complete picture in a single payload.

### Event Schema

| Field                                   | Type     | Description                                                                                       |
| :-------------------------------------- | :------- | :------------------------------------------------------------------------------------------------ |
| `type`                                  | string   | Always `"payout.gpi_tracking"`                                                                    |
| `id`                                    | string   | Event ID (`evt_gpi_...`)                                                                          |
| `created_at`                            | ISO 8601 | When this event was generated                                                                     |
| `data.id`                               | string   | Payout ID (`pot_...`)                                                                             |
| `data.status`                           | string   | Payout lifecycle status — not modified by GPI events                                              |
| `data.tracking_details.tracking_type`   | string   | Always `"uetr"`                                                                                   |
| `data.tracking_details.tracking_number` | UUID     | The UETR of the SWIFT transfer                                                                    |
| `data.gpi.latest.reasonCode`            | string   | Most recent GPI status code (e.g. `ACSP/G000`, `ACSC`, `ACCC`, `RJCT/OTHERS`)                     |
| `data.gpi.latest.statusDescription`     | string   | Human-readable description of the latest GPI event                                                |
| `data.gpi.latest.timestamp`             | ISO 8601 | Timestamp of the latest GPI event                                                                 |
| `data.gpi.timeline[]`                   | array    | Full ordered list of all GPI hops. Each entry has: `reasonCode`, `statusDescription`, `timestamp` |

## GPI Status Codes

| `reasonCode`  | Status      | Meaning                                                | `statusDescription`                                                 |
| :------------ | :---------- | :----------------------------------------------------- | :------------------------------------------------------------------ |
| `ACSP/G000`   | IN\_TRANSIT | Payment forwarded to next GPI agent                    | In transit – with intermediary bank                                 |
| `ACSP/G001`   | IN\_TRANSIT | Forwarded to non-GPI bank; no further updates expected | In transit – sent to non-tracked bank (further updates unavailable) |
| `ACSP/G002`   | IN\_TRANSIT | Processing with correspondent bank                     | In transit – processing with correspondent bank                     |
| `ACSP/G003`   | IN\_TRANSIT | Processing with correspondent bank                     | In transit – processing with correspondent bank                     |
| `ACSP/G004`   | IN\_TRANSIT | Processing with correspondent bank                     | In transit – processing with correspondent bank                     |
| `ACSC`        | DELIVERED   | Funds received by beneficiary bank                     | Funds received by beneficiary bank                                  |
| `ACCC`        | CREDITED    | Funds credited to beneficiary account                  | Funds credited to beneficiary account                               |
| `RJCT/OTHERS` | REJECTED    | Payment rejected by a bank in the chain                | Rejected                                                            |

## Sample Payload

```json expandable theme={null}
{
  "type": "payout.gpi_tracking",
  "id": "evt_gpi_123",
  "object": "event",
  "created_at": "2025-11-28T10:12:01Z",
  "data": {
    "id": "pot_123",
    "object": "payout",
    "type": "swift",
    "status": "succeeded",
    "tracking_details": {
      "tracking_type": "uetr",
      "tracking_number": "11111111-2222-3333-4444-555555555555"
    },
    "gpi": {
      "latest": {
        "reasonCode": "ACCC",
        "statusDescription": "Funds credited to beneficiary account - AAAABBCC123",
        "timestamp": "2025-11-28T16:20:00Z"
      },
      "timeline": [
        {
          "reasonCode": "ACCC",
          "statusDescription": "Funds credited to beneficiary account - AAAABBCC123",
          "timestamp": "2025-11-28T16:20:00Z"
        },
        {
          "reasonCode": "ACSC",
          "statusDescription": "Funds received by beneficiary bank - AAAABBCC123",
          "timestamp": "2025-11-28T15:38:10Z"
        },
        {
          "reasonCode": "ACSP/G004",
          "statusDescription": "In transit – processing with correspondent bank - AAAABBCC123",
          "timestamp": "2025-11-28T14:00:00Z"
        },
        {
          "reasonCode": "ACSP/G003",
          "statusDescription": "In transit – processing with correspondent bank - AAAABBCC123",
          "timestamp": "2025-11-28T13:00:00Z"
        },
        {
          "reasonCode": "ACSP/G002",
          "statusDescription": "In transit – processing with correspondent bank - AAAABBCC123",
          "timestamp": "2025-11-28T12:00:00Z"
        },
        {
          "reasonCode": "ACSP/G001",
          "statusDescription": "In transit – sent to non-tracked bank (further updates unavailable) - AAAABBCC123",
          "timestamp": "2025-11-28T11:05:00Z"
        },
        {
          "reasonCode": "ACSP/G000",
          "statusDescription": "In transit – with intermediary bank - AAAABBCC123",
          "timestamp": "2025-11-28T10:10:40Z"
        }
      ]
    }
  }
}
```

## Implementation Notes

* GPI tracking does not affect `payout.status`. It is additive event data only.
* Every `payout.gpi_tracking` event contains the full cumulative timeline — not a delta.
* If the transfer passes through a non-GPI-enabled bank (`ACSP/G001`), no further GPI hops will be reported. The last known status is retained.
* `RJCT` events are normalised to `RJCT/OTHERS` for consistency across all banking rails.
* Existing SWIFT payouts without a stored UETR will not be retro-tracked.

## GET API — Coming Soon

GPI tracking data will also be available inline via the existing payout GET API response. This will allow you to fetch the current GPI status and full timeline on demand, without relying solely on webhooks.

Coming soon. You'll be notified as soon as this becomes available.

## Edge Cases

| Scenario                     | Behaviour                                                                                                                       |
| :--------------------------- | :------------------------------------------------------------------------------------------------------------------------------ |
| Tracking service unavailable | Tazapay retries automatically. No event is emitted until the hop is confirmed. You may see a delay between hops during outages. |
| Non-GPI bank in chain        | Tracking stops at the last GPI-enabled bank. The `ACSP/G001` event will indicate this explicitly.                               |
| No GPI events received       | No `payout.gpi_tracking` event is emitted. The payout status remains unchanged.                                                 |
| UETR not available           | GPI tracking will not be available for this transfer. No event will be emitted.                                                 |
