> 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.

# Create Third-Party Customer

POST https://sandbox.currenciesdirect.com/v1/customers/{customer_id}/third-parties
Content-Type: application/json

This is a compliance data collection endpoint that gathers information about the actual end users (funding parties) who will be making property payments through Redpin's platform via partner applications, without creating direct customer relationships with Redpin. These end users are referred to as "third-parties" because they access Redpin's services indirectly through their relationship with the partner, making them third-party to the direct Redpin-partner relationship.

This allows Redpin to meet regulatory requirements for international property payments while the customer relationship remains entirely with the partner platform.


**Common Use Cases**
This endpoint is specifically designed for:

- Property Developers facilitating international buyer payments
- Real Estate Asset Management Platforms handling investor transactions
- Fractional Investment Platforms managing partial property ownership payments
- Title Company Software Providers processing closing transactions
- Real Estate Sales Management Solutions coordinating international property purchases

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


Reference: https://docs.redpincompany.com/api-reference/customers/api-integration/third-parties/create-third-party-customer

## 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 of the partner platform creating the third-party customer

### Body (application/json)

This endpoint expects a ThirdPartyCustomerRequest.

- `client_customer_details` (ClientCustomerDetailsForCreate, required)

## Response

### 200

Third-party customer created successfully

- `client_customer_ref` (string, required) — The customer reference that was provided in the request
- `status` (enum, required) — Status of the third party customer. - `APPROVED`: Compliance check has passed successfully. - `REJECTED`: Compliance check has failed due to validation or regulatory issues. - `PENDING`: Compliance check is still in progress.
  - Allowed values: `APPROVED`, `REJECTED`, `PENDING`

## Errors

### 400 Bad Request Error

Bad request - missing or invalid parameters

- `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)

### 409 Conflict Error

Duplicate client_customer_ref

- `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)

### 422 Unprocessable Entity Error

Customer is not eligible for the selected country

- `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

### ClientCustomerDetailsForCreate

- `client_customer_ref` (string, required) — Partner's internal reference/ID for this customer. Must be alphanumeric and may include underscores (_) and hyphens (-).
- `first_name` (string, required) — Third-party Customer's first name
- `last_name` (string, required) — Third-party Customer's last name
- `email` (string, required) — Third-party Customer's email address
- `mobile_phone` (string, required) — Third-party Customer's mobile phone number in E.164 international format (e.g., +14155552671)
- `country` (string, required) — ISO 3166-1 alpha-3 country code representing the third party customer's legal nationality or citizenship status. See [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) for the complete list of country codes.
- `date_of_birth` (string, required) — Third-party Customer's date of birth in ISO 8601 format (YYYY-MM-DD)
- `address` (address, required)
- `currency` (string, optional) — 3-letter ISO currency code for the third party customer's preferred currency. See [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) for the complete list of currency codes.
- `occupation` (string, optional) — Third-party customer's occupation
- `employer_name` (string, optional) — Name of the third-party customer's employer
- `income_range` (IncomeRange, optional) — Third party customer's income range in the given currency

### address

- `address_line` (string, required) — Full street address of the customer, including apartment or unit number if applicable. Example: "123 Main St, Apt 4B"
- `city` (string, required) — City or town of the customer's residence. Example: "New York"
- `state` (string, required) — State, province, or region associated with the address. This field is required for countries that use regional subdivisions. Example: "NY"
- `post_code` (string, required) — ZIP code, postal code, or equivalent regional code used for mail delivery. Example: "10001"
- `country` (string, required) — 3-letter [ISO 3166-1] (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code (e.g., USA, GBR, IND) representing the country of residence. Example: "USA"

### IncomeRange

Third party customer's income range in the given currency

- `currency` (string, required) — 3-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code for the income range.
- `min_value` (double, required) — Minimum value of the income range
- `max_value` (double, required) — Maximum value of the income range

## Examples

**Request**

```json
{
  "client_customer_details": {
    "client_customer_ref": "SKYLINE-CLIENT-001",
    "first_name": "Sarah",
    "last_name": "Johnson",
    "email": "sarah.johnson@example.com",
    "mobile_phone": "+14155552671",
    "country": "USA",
    "date_of_birth": "1985-03-15",
    "address": {
      "address_line": "123 Main St, Apt 4B",
      "city": "New York",
      "state": "NY",
      "post_code": "10001",
      "country": "USA"
    },
    "currency": "USD",
    "occupation": "Software Engineer",
    "employer_name": "Google",
    "income_range": {
      "currency": "GBP",
      "min_value": 10000,
      "max_value": 20000
    }
  }
}
```

**Response**

```json
{
  "client_customer_ref": "SKYLINE-CLIENT-001",
  "status": "PENDING"
}
```

**SDK Code**

```python Complete Customer information
import requests

url = "https://sandbox.currenciesdirect.com/v1/customers/020123456789/third-parties"

payload = { "client_customer_details": {
        "client_customer_ref": "SKYLINE-CLIENT-001",
        "first_name": "Sarah",
        "last_name": "Johnson",
        "email": "sarah.johnson@example.com",
        "mobile_phone": "+14155552671",
        "country": "USA",
        "date_of_birth": "1985-03-15",
        "address": {
            "address_line": "123 Main St, Apt 4B",
            "city": "New York",
            "state": "NY",
            "post_code": "10001",
            "country": "USA"
        },
        "currency": "USD",
        "occupation": "Software Engineer",
        "employer_name": "Google",
        "income_range": {
            "currency": "GBP",
            "min_value": 10000,
            "max_value": 20000
        }
    } }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript Complete Customer information
const url = 'https://sandbox.currenciesdirect.com/v1/customers/020123456789/third-parties';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"client_customer_details":{"client_customer_ref":"SKYLINE-CLIENT-001","first_name":"Sarah","last_name":"Johnson","email":"sarah.johnson@example.com","mobile_phone":"+14155552671","country":"USA","date_of_birth":"1985-03-15","address":{"address_line":"123 Main St, Apt 4B","city":"New York","state":"NY","post_code":"10001","country":"USA"},"currency":"USD","occupation":"Software Engineer","employer_name":"Google","income_range":{"currency":"GBP","min_value":10000,"max_value":20000}}}'
};

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

```go Complete Customer information
package main

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

func main() {

	url := "https://sandbox.currenciesdirect.com/v1/customers/020123456789/third-parties"

	payload := strings.NewReader("{\n  \"client_customer_details\": {\n    \"client_customer_ref\": \"SKYLINE-CLIENT-001\",\n    \"first_name\": \"Sarah\",\n    \"last_name\": \"Johnson\",\n    \"email\": \"sarah.johnson@example.com\",\n    \"mobile_phone\": \"+14155552671\",\n    \"country\": \"USA\",\n    \"date_of_birth\": \"1985-03-15\",\n    \"address\": {\n      \"address_line\": \"123 Main St, Apt 4B\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"post_code\": \"10001\",\n      \"country\": \"USA\"\n    },\n    \"currency\": \"USD\",\n    \"occupation\": \"Software Engineer\",\n    \"employer_name\": \"Google\",\n    \"income_range\": {\n      \"currency\": \"GBP\",\n      \"min_value\": 10000,\n      \"max_value\": 20000\n    }\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

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

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

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

}
```

```ruby Complete Customer information
require 'uri'
require 'net/http'

url = URI("https://sandbox.currenciesdirect.com/v1/customers/020123456789/third-parties")

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

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"client_customer_details\": {\n    \"client_customer_ref\": \"SKYLINE-CLIENT-001\",\n    \"first_name\": \"Sarah\",\n    \"last_name\": \"Johnson\",\n    \"email\": \"sarah.johnson@example.com\",\n    \"mobile_phone\": \"+14155552671\",\n    \"country\": \"USA\",\n    \"date_of_birth\": \"1985-03-15\",\n    \"address\": {\n      \"address_line\": \"123 Main St, Apt 4B\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"post_code\": \"10001\",\n      \"country\": \"USA\"\n    },\n    \"currency\": \"USD\",\n    \"occupation\": \"Software Engineer\",\n    \"employer_name\": \"Google\",\n    \"income_range\": {\n      \"currency\": \"GBP\",\n      \"min_value\": 10000,\n      \"max_value\": 20000\n    }\n  }\n}"

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

```java Complete Customer information
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://sandbox.currenciesdirect.com/v1/customers/020123456789/third-parties")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"client_customer_details\": {\n    \"client_customer_ref\": \"SKYLINE-CLIENT-001\",\n    \"first_name\": \"Sarah\",\n    \"last_name\": \"Johnson\",\n    \"email\": \"sarah.johnson@example.com\",\n    \"mobile_phone\": \"+14155552671\",\n    \"country\": \"USA\",\n    \"date_of_birth\": \"1985-03-15\",\n    \"address\": {\n      \"address_line\": \"123 Main St, Apt 4B\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"post_code\": \"10001\",\n      \"country\": \"USA\"\n    },\n    \"currency\": \"USD\",\n    \"occupation\": \"Software Engineer\",\n    \"employer_name\": \"Google\",\n    \"income_range\": {\n      \"currency\": \"GBP\",\n      \"min_value\": 10000,\n      \"max_value\": 20000\n    }\n  }\n}")
  .asString();
```

```php Complete Customer information
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://sandbox.currenciesdirect.com/v1/customers/020123456789/third-parties', [
  'body' => '{
  "client_customer_details": {
    "client_customer_ref": "SKYLINE-CLIENT-001",
    "first_name": "Sarah",
    "last_name": "Johnson",
    "email": "sarah.johnson@example.com",
    "mobile_phone": "+14155552671",
    "country": "USA",
    "date_of_birth": "1985-03-15",
    "address": {
      "address_line": "123 Main St, Apt 4B",
      "city": "New York",
      "state": "NY",
      "post_code": "10001",
      "country": "USA"
    },
    "currency": "USD",
    "occupation": "Software Engineer",
    "employer_name": "Google",
    "income_range": {
      "currency": "GBP",
      "min_value": 10000,
      "max_value": 20000
    }
  }
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Complete Customer information
using RestSharp;

var client = new RestClient("https://sandbox.currenciesdirect.com/v1/customers/020123456789/third-parties");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"client_customer_details\": {\n    \"client_customer_ref\": \"SKYLINE-CLIENT-001\",\n    \"first_name\": \"Sarah\",\n    \"last_name\": \"Johnson\",\n    \"email\": \"sarah.johnson@example.com\",\n    \"mobile_phone\": \"+14155552671\",\n    \"country\": \"USA\",\n    \"date_of_birth\": \"1985-03-15\",\n    \"address\": {\n      \"address_line\": \"123 Main St, Apt 4B\",\n      \"city\": \"New York\",\n      \"state\": \"NY\",\n      \"post_code\": \"10001\",\n      \"country\": \"USA\"\n    },\n    \"currency\": \"USD\",\n    \"occupation\": \"Software Engineer\",\n    \"employer_name\": \"Google\",\n    \"income_range\": {\n      \"currency\": \"GBP\",\n      \"min_value\": 10000,\n      \"max_value\": 20000\n    }\n  }\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Complete Customer information
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["client_customer_details": [
    "client_customer_ref": "SKYLINE-CLIENT-001",
    "first_name": "Sarah",
    "last_name": "Johnson",
    "email": "sarah.johnson@example.com",
    "mobile_phone": "+14155552671",
    "country": "USA",
    "date_of_birth": "1985-03-15",
    "address": [
      "address_line": "123 Main St, Apt 4B",
      "city": "New York",
      "state": "NY",
      "post_code": "10001",
      "country": "USA"
    ],
    "currency": "USD",
    "occupation": "Software Engineer",
    "employer_name": "Google",
    "income_range": [
      "currency": "GBP",
      "min_value": 10000,
      "max_value": 20000
    ]
  ]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox.currenciesdirect.com/v1/customers/020123456789/third-parties")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```