> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.redpincompany.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.redpincompany.com/_mcp/server.

# Get Payment Details

GET https://sandbox.currenciesdirect.com/v3/customers/{customer_id}/payments/{payment_id}

Retrieve details for a specific payment by payment_id for a given customer.

**Authentication:** [Bearer token required](/api-guide/getting-started/authentication#oauth-20-authentication)


Reference: https://docs.redpincompany.com/api-reference/customers/api-integration/payments/get-payment-details

## Authentication

- `Authorization` header (bearer token, required) — OAuth 2.0 Bearer token authentication. This API uses OAuth 2.0 Client Credentials flow. Please refer to the [Authentication](/api-guide/getting-started/authentication#oauth-20-authentication) section for detailed information on how to obtain and use your OAuth credentials.

## Servers

- `https://sandbox.currenciesdirect.com` (Sandbox, default)
- `https://api.redpincompany.com` (Production)

## Request

### Path parameters

- `customer_id` (string, required) — Unique identifier for the customer who owns the payment.
- `payment_id` (string, required) — Unique identifier for the payment.

## Response

### 200

Successful response with payment details

- `payment_id` (string, required) — Unique identifier assigned by the API when the payment is created.
- `instruction_number` (string, required) — Instruction number assigned by the API when the payment is created.
- `status` (enum, required) — Current status of the payment. Refer to the [Payment Status Events](/api-reference/webhooks/payments/webhook-payment-status-updated) section for more details about the statuses.
  - Allowed values: `AWAITING_FUNDS`, `RECEIVED_FUNDS`, `FX_COMPLETED`, `PAYOUT_INITIATED`, `PAYOUT_CREDITED`, `BOUNCED_BACK`, `PAYMENT_COMPLETED`, `PROCESSING`, `CANCELLED`
- `payouts` (list of PayoutRecipient, required)
- `client_reference_id` (string, optional) — Client-provided reference ID for the payment while creating the payment.
- `fx_conversion` (FxConversion, optional) — FX conversion details. **Important:** This field is only present when currency conversion was performed (i.e., when `quote_id` was provided in the payment request). **Not present for same-currency payments** (when source and destination currencies are the same and no `quote_id` was provided).

## Errors

### 401 Unauthorized Error

Customer mismatch error

- `code` (string, required)
- `description` (string, required) — Human-readable error description
- `type` (enum, optional) — Category or type of the error. - `VALIDATION_ERROR`: Error due to invalid input data or format - `AUTHORIZATION_ERROR`: Error related to insufficient permissions - `SYSTEM_ERROR`: Internal system or server errors - `RESOURCE_ERROR`: Error related to resource availability - `BUSINESS_ERROR`: Error related to business logic violations - `DATA_ERROR`: Error related to data inconsistencies or duplication
  - Allowed values: `VALIDATION_ERROR`, `AUTHORIZATION_ERROR`, `SYSTEM_ERROR`, `RESOURCE_ERROR`, `BUSINESS_ERROR`, `DATA_ERROR`
- `field` (string, optional)
- `details` (map from string to any, optional) — Additional details about the error
- `timestamp` (datetime, optional)

### 404 Not Found Error

Payment not found

- `code` (string, required)
- `description` (string, required) — Human-readable error description
- `type` (enum, optional) — Category or type of the error. - `VALIDATION_ERROR`: Error due to invalid input data or format - `AUTHORIZATION_ERROR`: Error related to insufficient permissions - `SYSTEM_ERROR`: Internal system or server errors - `RESOURCE_ERROR`: Error related to resource availability - `BUSINESS_ERROR`: Error related to business logic violations - `DATA_ERROR`: Error related to data inconsistencies or duplication
  - Allowed values: `VALIDATION_ERROR`, `AUTHORIZATION_ERROR`, `SYSTEM_ERROR`, `RESOURCE_ERROR`, `BUSINESS_ERROR`, `DATA_ERROR`
- `field` (string, optional)
- `details` (map from string to any, optional) — Additional details about the error
- `timestamp` (datetime, optional)

### 500 Internal Server Error

Internal server error

- `code` (string, required)
- `description` (string, required) — Human-readable error description
- `type` (enum, optional) — Category or type of the error. - `VALIDATION_ERROR`: Error due to invalid input data or format - `AUTHORIZATION_ERROR`: Error related to insufficient permissions - `SYSTEM_ERROR`: Internal system or server errors - `RESOURCE_ERROR`: Error related to resource availability - `BUSINESS_ERROR`: Error related to business logic violations - `DATA_ERROR`: Error related to data inconsistencies or duplication
  - Allowed values: `VALIDATION_ERROR`, `AUTHORIZATION_ERROR`, `SYSTEM_ERROR`, `RESOURCE_ERROR`, `BUSINESS_ERROR`, `DATA_ERROR`
- `field` (string, optional)
- `details` (map from string to any, optional) — Additional details about the error
- `timestamp` (datetime, optional)

## Types

### PayoutRecipient

- `amount` (Amount, required)
- `recipient_details` (RecipientDetails, required) — Recipient details are used to identify the recipient of the payment. The recipient_id is a unique identifier of the recipient. The payment_reference is used to identify the payment in the recipient's bank.
- `status` (enum, required) — Status of the payment to the recipient. This is the status of the payment to the recipient. **Allowed values:** | Status | Description | |-------------|-------------| | NOT_STARTED | The payment process for this recipient has not begun yet. No action has been taken to initiate the transfer. | | INITIATED | The payment to the recipient has been started, but the funds have not yet been credited to the recipient's account. This typically means the payment is in progress or is being processed by the bank or payment provider. | | COMPLETED | The payment to the recipient has been successfully completed and the funds have been credited to the recipient's account. | | BOUNCED_BACK | The payment to the recipient failed and the funds were returned (bounced back) to Redpin. This can happen due to issues like invalid account details, closed accounts, or other banking errors. | | FAILED | The payment to the recipient could not be completed due to an error or issue (other than a bounce back). This is a general failure status indicating the payment did not succeed. | | CANCELLED | The payment to the recipient was cancelled before it could be completed. This could be due to a user action, a system rule, or a compliance reason. |
  - Allowed values: `NOT_STARTED`, `INITIATED`, `COMPLETED`, `BOUNCED_BACK`, `FAILED`, `CANCELLED`
- `payment_date` (date, required) — Date (in ISO 8601 format (YYYY-MM-DD)) on which the payment will be credited to the recipient.

### FxConversion

- `selling_amount` (Amount, required) — Amount being sold.
- `buying_amount` (Amount, required) — Amount being bought.
- `agreed_rate` (double, required) — Agreed FX conversion rate.
- `booking_datetime` (datetime, required) — Date and time (in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ)) when the FX conversion was booked.
- `value_date` (date, required) — The date (in ISO 8601 format (YYYY-MM-DD)) on which the FX conversion will be executed.
- `status` (enum, required) — Status of the FX conversion. **Allowed values:** | Status | Description | |--------|-------------| | OPEN | The FX conversion is active and available for use. The agreed FX rate and conversion details are still valid, and the conversion can be used to process payments or settlements. | | CLOSED | The FX conversion has been fully settled or closed. The conversion is no longer available for use—either the funds have been exchanged and settled. |
  - Allowed values: `OPEN`, `CLOSED`

### Amount

- `currency` (string, required) — Three-letter ISO 4217 currency code.
- `value` (double, required) — Amount of the payment with 2 decimal precision.

### RecipientDetails

Recipient details are used to identify the recipient of the payment. The recipient_id is a unique identifier of the recipient. The payment_reference is used to identify the payment in the recipient's bank.

- `recipient_id` (string, required) — Unique identifier of the recipient.
- `payment_reference` (string, required) — This reference is used to identify the payment in the recipient's bank.

## Examples

### Payment with FX Conversion

**Response**

```json
{
  "payment_id": "5636191",
  "instruction_number": "cust_123456789-000000009",
  "status": "FX_COMPLETED",
  "payouts": [
    {
      "amount": {
        "currency": "AED",
        "value": 107.56
      },
      "recipient_details": {
        "recipient_id": "rec_123456789",
        "payment_reference": "payment to Mashreq account1"
      },
      "status": "INITIATED",
      "payment_date": "2025-07-10"
    },
    {
      "amount": {
        "currency": "AED",
        "value": 100
      },
      "recipient_details": {
        "recipient_id": "rec_987654321",
        "payment_reference": "payment to Mashreq account2"
      },
      "status": "INITIATED",
      "payment_date": "2025-07-10"
    }
  ],
  "client_reference_id": "c2860379-c845-4f4e-9d2e-5b058e9114b9",
  "fx_conversion": {
    "selling_amount": {
      "currency": "GBP",
      "value": 43.24
    },
    "buying_amount": {
      "currency": "AED",
      "value": 207.56
    },
    "agreed_rate": 4.8794,
    "booking_datetime": "2025-07-07T13:02:46Z",
    "value_date": "2025-07-09",
    "status": "CLOSED"
  }
}
```

**SDK Code**

```python Payment with FX Conversion
import requests

url = "https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Payment with FX Conversion
const url = 'https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Payment with FX Conversion
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

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

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Payment with FX Conversion
require 'uri'
require 'net/http'

url = URI("https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java Payment with FX Conversion
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Payment with FX Conversion
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp Payment with FX Conversion
using RestSharp;

var client = new RestClient("https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Payment with FX Conversion
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### Same Currency Payment (No FX Conversion)

**Response**

```json
{
  "payment_id": "3925407",
  "instruction_number": "0202000010600852-000000672",
  "status": "PROCESSING",
  "payouts": [
    {
      "amount": {
        "currency": "AED",
        "value": 10
      },
      "recipient_details": {
        "recipient_id": "1212774",
        "payment_reference": "payment-ref-client_ref_545dda27-0"
      },
      "status": "NOT_STARTED",
      "payment_date": "2025-12-26"
    }
  ]
}
```

**SDK Code**

```python Same Currency Payment (No FX Conversion)
import requests

url = "https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Same Currency Payment (No FX Conversion)
const url = 'https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Same Currency Payment (No FX Conversion)
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

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

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Same Currency Payment (No FX Conversion)
require 'uri'
require 'net/http'

url = URI("https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java Same Currency Payment (No FX Conversion)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Same Currency Payment (No FX Conversion)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp Same Currency Payment (No FX Conversion)
using RestSharp;

var client = new RestClient("https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Same Currency Payment (No FX Conversion)
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox.currenciesdirect.com/v3/customers/cust_123456789/payments/5636191")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```