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

# Add Contact

POST https://sandbox.currenciesdirect.com/v1/customers/{customerId}/contacts
Content-Type: application/json

Create one or more contact records for an existing customer account. This endpoint allows you to add authorized individuals or company representatives who can:

- Manage the customer's account
- Receive account updates and notifications
- Execute trades on behalf of the customer

Use this when a customer needs additional people with account access permissions.

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


Reference: https://docs.redpincompany.com/api-reference/customers/api-integration/contacts/add-customer-contact

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

- `customerId` (string, required) — The unique identifier you received from the [Get Customer's ID](/api-reference/customers/api-integration/customers/get-customer-id) API response.

### Body (application/json)

This endpoint expects a list of ContactDetails.

- `list of ContactDetails`

## Response

### 201

Created. Contact added successfully.

- `customer_id` (string, optional) — Identifier of the customer this contact belongs to.

## Errors

### 400 Bad Request Error

Bad Request. Malformed request. You will receive this error if the request query parameters are not found or the request body does not validate with the schema. The error code will help you determine the cause of the issue.

- `code` (string, required) — Machine-readable error code.
- `description` (string, required) — Human-readable error description.

### 401 Unauthorized Error

Unauthorized. You have not included a valid Access token, it has expired, or you entered incorrect credentials.

- `code` (string, required) — Machine-readable error code.
- `description` (string, required) — Human-readable error description.

### 404 Not Found Error

Not Found. Resource was not found.

- `code` (string, required) — Machine-readable error code.
- `description` (string, required) — Human-readable error description.

### 500 Internal Server Error

Internal Server Error. Something has gone wrong on the website's server, but the server could not be more specific on what the exact problem is.

- `code` (string, required) — Machine-readable error code.
- `description` (string, required) — Human-readable error description.

## Types

### ContactDetails

- `first_name` (string, required) — First name of this contact person
- `last_name` (string, required) — Last name of this contact person
- `date_of_birth` (date, required) — DOB of contact person in ISO 8601 format (YYYY-MM-DD)
- `email` (string, required) — Email address of the contact person
- `mobile_number` (string, required) — Contact mobile number in E.164 international format (e.g., +14155552671).
- `primary_contact` (boolean, required) — Primary contact for the customer account
- `authorize_to_trade` (boolean, required) — Whether the customer is authorised to trade with us
- `address` (ContactAddress, required)
- `middle_name` (string, optional) — Middle name of this contact person
- `employment_status` (string, optional) — Employment status of the contact. See [Employment Status API](/api-reference/customers/api-integration/references/get-employment-statuses#response) for a list of supported values.
- `industry` (string, optional) — Employment industry of the contact. See [Employment Industry API](/api-reference/customers/api-integration/references/get-employment-industries#response) for a list of supported values.
- `nationality` (string, optional) — Nationality of the contact
- `phone_number` (string, optional) — Contact phone number
- `proof_of_identity` (ProofOfIdentity, optional) — Supporting identification documents for the contact. Provide exactly one document type per contact.

### ContactAddress

- `post_code` (string, required) — Postcode or zip code
- `city` (string, required) — City name
- `country` (string, required) — Three-letter [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code for the contact's address (e.g., USA, GBR, ARE).
- `unit_number` (string, optional) — Unit number
- `street_number` (string, optional) — Street number
- `street` (string, optional) — Street name
- `street_type` (string, optional) — Street type
- `civic_number` (string, optional) — Civic number
- `state` (string, optional) — State

### ProofOfIdentity

Supporting identification documents for the contact. Provide exactly one document type per contact.

- `passport` (PassportDetails, optional)
- `medicare` (MedicareDetails, optional)
- `nationalId` (NationalIdDetails, optional)
- `drivingLicence` (DrivingLicenseDetails, optional)

### PassportDetails

- `number` (string, required) — Passport number
- `place_of_birth` (string, required) — Place of birth
- `expiry_date` (date, required) — Expiry date
- `issuing_country` (string, required) — Passport issuing country
- `name_at_citizenship` (string, optional) — Name as per citizenship
- `family_name_at_birth` (string, optional) — Family name at the time of birth

### MedicareDetails

- `card_number` (string, required) — Medicare card number
- `reference_number` (string, required) — Medicare reference number

### NationalIdDetails

- `id` (string, required) — National id number
- `type` (string, required) — National id type

### DrivingLicenseDetails

- `number` (string, required) — Driving licence number
- `expiry_date` (date, required) — Driving license expiry date
- `issuing_country` (string, required) — Driving license issuing country
- `card_number` (string, optional) — Driving license card number
- `state_code` (string, optional) — Driving license state code
- `version` (string, optional) — Driving license version number

## Examples

### Contact Added

**Response**

```json
{
  "customer_id": "0005924291"
}
```

**SDK Code**

```python Contact Added
import requests

url = "https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts"

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

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

print(response.json())
```

```javascript Contact Added
const url = 'https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts';
const options = {method: 'POST', 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 Contact Added
package main

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

func main() {

	url := "https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts"

	req, _ := http.NewRequest("POST", 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 Contact Added
require 'uri'
require 'net/http'

url = URI("https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts")

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

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

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

```java Contact Added
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Contact Added
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

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

```csharp Contact Added
using RestSharp;

var client = new RestClient("https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Contact Added
import Foundation

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

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
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()
```

### Add Contact Request (single entry array)

**Request**

```json
[
  {
    "first_name": "Carlos",
    "last_name": "Lopez",
    "date_of_birth": "1980-02-14",
    "email": "carlos@hotmail.com",
    "mobile_number": "+44-987654321",
    "primary_contact": true,
    "authorize_to_trade": true,
    "address": {
      "post_code": "77023",
      "city": "Houston",
      "country": "USA",
      "unit_number": "",
      "street_number": "468",
      "street": "Bissonnet Plaza, El Campo",
      "street_type": "Plaza",
      "civic_number": "",
      "state": "Texas"
    },
    "middle_name": "",
    "employment_status": "Full-time",
    "industry": "Technology and Software",
    "nationality": "United States of America",
    "phone_number": "(020)123456789",
    "proof_of_identity": {
      "passport": {
        "number": "12345",
        "place_of_birth": "Houston, USA",
        "expiry_date": "2025-09-30",
        "issuing_country": "USA",
        "name_at_citizenship": "Lopez",
        "family_name_at_birth": "Lopez"
      }
    }
  }
]
```

**Response**

```json
{
  "customer_id": "0005924291"
}
```

**SDK Code**

```python Add Contact Request (single entry array)
import requests

url = "https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts"

payload = [
    {
        "first_name": "Carlos",
        "last_name": "Lopez",
        "date_of_birth": "1980-02-14",
        "email": "carlos@hotmail.com",
        "mobile_number": "+44-987654321",
        "primary_contact": True,
        "authorize_to_trade": True,
        "address": {
            "post_code": "77023",
            "city": "Houston",
            "country": "USA",
            "unit_number": "",
            "street_number": "468",
            "street": "Bissonnet Plaza, El Campo",
            "street_type": "Plaza",
            "civic_number": "",
            "state": "Texas"
        },
        "middle_name": "",
        "employment_status": "Full-time",
        "industry": "Technology and Software",
        "nationality": "United States of America",
        "phone_number": "(020)123456789",
        "proof_of_identity": { "passport": {
                "number": "12345",
                "place_of_birth": "Houston, USA",
                "expiry_date": "2025-09-30",
                "issuing_country": "USA",
                "name_at_citizenship": "Lopez",
                "family_name_at_birth": "Lopez"
            } }
    }
]
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Add Contact Request (single entry array)
const url = 'https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '[{"first_name":"Carlos","last_name":"Lopez","date_of_birth":"1980-02-14","email":"carlos@hotmail.com","mobile_number":"+44-987654321","primary_contact":true,"authorize_to_trade":true,"address":{"post_code":"77023","city":"Houston","country":"USA","unit_number":"","street_number":"468","street":"Bissonnet Plaza, El Campo","street_type":"Plaza","civic_number":"","state":"Texas"},"middle_name":"","employment_status":"Full-time","industry":"Technology and Software","nationality":"United States of America","phone_number":"(020)123456789","proof_of_identity":{"passport":{"number":"12345","place_of_birth":"Houston, USA","expiry_date":"2025-09-30","issuing_country":"USA","name_at_citizenship":"Lopez","family_name_at_birth":"Lopez"}}}]'
};

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

```go Add Contact Request (single entry array)
package main

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

func main() {

	url := "https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts"

	payload := strings.NewReader("[\n  {\n    \"first_name\": \"Carlos\",\n    \"last_name\": \"Lopez\",\n    \"date_of_birth\": \"1980-02-14\",\n    \"email\": \"carlos@hotmail.com\",\n    \"mobile_number\": \"+44-987654321\",\n    \"primary_contact\": true,\n    \"authorize_to_trade\": true,\n    \"address\": {\n      \"post_code\": \"77023\",\n      \"city\": \"Houston\",\n      \"country\": \"USA\",\n      \"unit_number\": \"\",\n      \"street_number\": \"468\",\n      \"street\": \"Bissonnet Plaza, El Campo\",\n      \"street_type\": \"Plaza\",\n      \"civic_number\": \"\",\n      \"state\": \"Texas\"\n    },\n    \"middle_name\": \"\",\n    \"employment_status\": \"Full-time\",\n    \"industry\": \"Technology and Software\",\n    \"nationality\": \"United States of America\",\n    \"phone_number\": \"(020)123456789\",\n    \"proof_of_identity\": {\n      \"passport\": {\n        \"number\": \"12345\",\n        \"place_of_birth\": \"Houston, USA\",\n        \"expiry_date\": \"2025-09-30\",\n        \"issuing_country\": \"USA\",\n        \"name_at_citizenship\": \"Lopez\",\n        \"family_name_at_birth\": \"Lopez\"\n      }\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 Add Contact Request (single entry array)
require 'uri'
require 'net/http'

url = URI("https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts")

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  {\n    \"first_name\": \"Carlos\",\n    \"last_name\": \"Lopez\",\n    \"date_of_birth\": \"1980-02-14\",\n    \"email\": \"carlos@hotmail.com\",\n    \"mobile_number\": \"+44-987654321\",\n    \"primary_contact\": true,\n    \"authorize_to_trade\": true,\n    \"address\": {\n      \"post_code\": \"77023\",\n      \"city\": \"Houston\",\n      \"country\": \"USA\",\n      \"unit_number\": \"\",\n      \"street_number\": \"468\",\n      \"street\": \"Bissonnet Plaza, El Campo\",\n      \"street_type\": \"Plaza\",\n      \"civic_number\": \"\",\n      \"state\": \"Texas\"\n    },\n    \"middle_name\": \"\",\n    \"employment_status\": \"Full-time\",\n    \"industry\": \"Technology and Software\",\n    \"nationality\": \"United States of America\",\n    \"phone_number\": \"(020)123456789\",\n    \"proof_of_identity\": {\n      \"passport\": {\n        \"number\": \"12345\",\n        \"place_of_birth\": \"Houston, USA\",\n        \"expiry_date\": \"2025-09-30\",\n        \"issuing_country\": \"USA\",\n        \"name_at_citizenship\": \"Lopez\",\n        \"family_name_at_birth\": \"Lopez\"\n      }\n    }\n  }\n]"

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

```java Add Contact Request (single entry array)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("[\n  {\n    \"first_name\": \"Carlos\",\n    \"last_name\": \"Lopez\",\n    \"date_of_birth\": \"1980-02-14\",\n    \"email\": \"carlos@hotmail.com\",\n    \"mobile_number\": \"+44-987654321\",\n    \"primary_contact\": true,\n    \"authorize_to_trade\": true,\n    \"address\": {\n      \"post_code\": \"77023\",\n      \"city\": \"Houston\",\n      \"country\": \"USA\",\n      \"unit_number\": \"\",\n      \"street_number\": \"468\",\n      \"street\": \"Bissonnet Plaza, El Campo\",\n      \"street_type\": \"Plaza\",\n      \"civic_number\": \"\",\n      \"state\": \"Texas\"\n    },\n    \"middle_name\": \"\",\n    \"employment_status\": \"Full-time\",\n    \"industry\": \"Technology and Software\",\n    \"nationality\": \"United States of America\",\n    \"phone_number\": \"(020)123456789\",\n    \"proof_of_identity\": {\n      \"passport\": {\n        \"number\": \"12345\",\n        \"place_of_birth\": \"Houston, USA\",\n        \"expiry_date\": \"2025-09-30\",\n        \"issuing_country\": \"USA\",\n        \"name_at_citizenship\": \"Lopez\",\n        \"family_name_at_birth\": \"Lopez\"\n      }\n    }\n  }\n]")
  .asString();
```

```php Add Contact Request (single entry array)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts', [
  'body' => '[
  {
    "first_name": "Carlos",
    "last_name": "Lopez",
    "date_of_birth": "1980-02-14",
    "email": "carlos@hotmail.com",
    "mobile_number": "+44-987654321",
    "primary_contact": true,
    "authorize_to_trade": true,
    "address": {
      "post_code": "77023",
      "city": "Houston",
      "country": "USA",
      "unit_number": "",
      "street_number": "468",
      "street": "Bissonnet Plaza, El Campo",
      "street_type": "Plaza",
      "civic_number": "",
      "state": "Texas"
    },
    "middle_name": "",
    "employment_status": "Full-time",
    "industry": "Technology and Software",
    "nationality": "United States of America",
    "phone_number": "(020)123456789",
    "proof_of_identity": {
      "passport": {
        "number": "12345",
        "place_of_birth": "Houston, USA",
        "expiry_date": "2025-09-30",
        "issuing_country": "USA",
        "name_at_citizenship": "Lopez",
        "family_name_at_birth": "Lopez"
      }
    }
  }
]',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Add Contact Request (single entry array)
using RestSharp;

var client = new RestClient("https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "[\n  {\n    \"first_name\": \"Carlos\",\n    \"last_name\": \"Lopez\",\n    \"date_of_birth\": \"1980-02-14\",\n    \"email\": \"carlos@hotmail.com\",\n    \"mobile_number\": \"+44-987654321\",\n    \"primary_contact\": true,\n    \"authorize_to_trade\": true,\n    \"address\": {\n      \"post_code\": \"77023\",\n      \"city\": \"Houston\",\n      \"country\": \"USA\",\n      \"unit_number\": \"\",\n      \"street_number\": \"468\",\n      \"street\": \"Bissonnet Plaza, El Campo\",\n      \"street_type\": \"Plaza\",\n      \"civic_number\": \"\",\n      \"state\": \"Texas\"\n    },\n    \"middle_name\": \"\",\n    \"employment_status\": \"Full-time\",\n    \"industry\": \"Technology and Software\",\n    \"nationality\": \"United States of America\",\n    \"phone_number\": \"(020)123456789\",\n    \"proof_of_identity\": {\n      \"passport\": {\n        \"number\": \"12345\",\n        \"place_of_birth\": \"Houston, USA\",\n        \"expiry_date\": \"2025-09-30\",\n        \"issuing_country\": \"USA\",\n        \"name_at_citizenship\": \"Lopez\",\n        \"family_name_at_birth\": \"Lopez\"\n      }\n    }\n  }\n]", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Add Contact Request (single entry array)
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  [
    "first_name": "Carlos",
    "last_name": "Lopez",
    "date_of_birth": "1980-02-14",
    "email": "carlos@hotmail.com",
    "mobile_number": "+44-987654321",
    "primary_contact": true,
    "authorize_to_trade": true,
    "address": [
      "post_code": "77023",
      "city": "Houston",
      "country": "USA",
      "unit_number": "",
      "street_number": "468",
      "street": "Bissonnet Plaza, El Campo",
      "street_type": "Plaza",
      "civic_number": "",
      "state": "Texas"
    ],
    "middle_name": "",
    "employment_status": "Full-time",
    "industry": "Technology and Software",
    "nationality": "United States of America",
    "phone_number": "(020)123456789",
    "proof_of_identity": ["passport": [
        "number": "12345",
        "place_of_birth": "Houston, USA",
        "expiry_date": "2025-09-30",
        "issuing_country": "USA",
        "name_at_citizenship": "Lopez",
        "family_name_at_birth": "Lopez"
      ]]
  ]
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://sandbox.currenciesdirect.com/v1/customers/0005924291/contacts")! 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()
```