> This page is for Enterprise.

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

# WorldLink FX Booking

POST /v3/fx/bookfx
Content-Type: application/json

The CitiConnect WorldLink FX Booking endpoint allows you to book FX deals according to rate quotes received through CitiConnect FX Rate Inquiry for available currency combinations.

**Content Type:** Supports application/xml or application/json.

**Authorization:** The OAuth Token prefixed with Bearer and space in between.

**Request:**  For more information on specific field mappings, please refer to Customized IFX XML standards.

Reference: https://citi-demo.ferndocs.com/enterprise/enterprises/api-reference/payment-services/world-link/world-link-fx/world-link-fx-booking

## Authentication

- `Authorization` header (bearer token, required) — All CitiConnect APIs use the oAuth2 authentication scheme, which requires a bearer token to authenticate your API call. The Token URL includes the version of authentication used by this API. See the Citi Authentication API reference for information on requesting a token.

## Request

### Query parameters

- `client_id` (string, required) — Unique identifier created during the onboarding process.

### Headers

- `Authorization` (string, required) — The OAuth Token prefixed with "Bearer" and space in between.

### Body (application/json)

This endpoint expects an IFXRequest-Book-FX.

- `SignonRq` (IfxRequestBookFxSignonRq, required)
- `BankSvcRq` (list of IfxRequestBookFxBankSvcRqItems, required) — Bank Service Request for Book FX

## Response

### 200

OK

- `BankSvcRs` (IfxResponseBookFxBankSvcRs, optional)

## Errors

### 400 Bad Request Error

Bad Request

- `correlationId` (string, optional) — Object identifiers in the IFX specification are of the data type "Identifier." This is a narrow character data type with a maximum length of 36.
- `message` (string, optional)
- `status` (string, optional) — Error response code

### 401 Unauthorized Error

Unauthorized

- `correlationId` (string, optional) — Object identifiers in the IFX specification are of the data type "Identifier." This is a narrow character data type with a maximum length of 36.
- `message` (string, optional)
- `status` (string, optional) — Error response code

### 403 Forbidden Error

Forbidden

- `correlationId` (string, optional) — Object identifiers in the IFX specification are of the data type "Identifier." This is a narrow character data type with a maximum length of 36.
- `message` (string, optional)
- `status` (string, optional) — Error response code

### 404 Not Found Error

Not Found.

- `correlationId` (string, optional) — Object identifiers in the IFX specification are of the data type "Identifier." This is a narrow character data type with a maximum length of 36.
- `message` (string, optional)
- `status` (string, optional) — Error response code

### 500 Internal Server Error

Internal Server Error

- `correlationId` (string, optional) — Object identifiers in the IFX specification are of the data type "Identifier." This is a narrow character data type with a maximum length of 36.
- `message` (string, optional)
- `status` (string, optional) — Error response code

## Types

### IfxRequestBookFxSignonRq

- `ClientDt` (string, required) — Customer date and time for the message. Format: Header -Date/Time 'yyyy-mm-ddThh:mm:ss'. Will be stored for use in service related issues.
- `CustLangPref` (string, required) — Always set to "ENGLISH". Only English language is supported. Value in this parameter will be ignored.
- `ClientApp` (IfxRequestBookFxSignonRqClientApp, required)

### IfxRequestBookFxBankSvcRqItems

- `RqUID` (string, required) — Customer Ref No for the BankSvcRq request.Needs to be unique.
- `ForExRateDealAddRq` (list of IfxRequestBookFxBankSvcRqItemsForExRateDealAddRqItems, required) — Book FX Deal Add request array.
- `PrefPrice` (string, optional) — Preferred pricing indicator.N - Default value for standard pricing. Value must be 'W' for Alipay Wallet payments and 'E' for UPI Cards payment.
- `BaseNo` (string, optional) — FXLM Base Number. If provided this base number will be passed to FXLM for pricing and settlement. Only one of \<BaseNo> or \<FXLMEntity> may be provided. If neither is present the OLR to base number configuration will be used. Echoed from customer request.
- `FXLMEntity` (string, optional) — FXLM Entity. If provided this Entity will be passed to FXLM for pricing and settlement. Only one of \<BaseNo> or \<FXLMEntity> may be provided. If neither is present the OLR to base number configuration will be used. Echoed from customer request.
- `WLFlag` (string, optional) — Account processing and settlement. W - Standard WorldLink account processing and settlementN- Bypass all WorldLink account processing and settlement. Pass the numeric detail TRN to FXLM.O - Bypass all WorldLink account processing and settlement. Pass the OLR numeric sequence number as the TRN to FXLM.If not provided default will be W.
- `DealType` (string, optional) — Deal type. Deal type- 'B' for all bench deals for bench fixing ratesDeal type- `Q` for all real time quoted rate deals This must be coordinated with QUOTED fixing typeDeal Type- 'O' book per OLR parametersDefault value will be O, if not provided.

### IfxResponseBookFxBankSvcRs

- `Status` (IfxResponseBookFxBankSvcRsStatus, optional)
- `RqUID` (string, optional) — Customer Ref No for the request.
- `PrefPrice` (string, optional) — Preferred pricing indicator.N - Default value for standard pricing. Value must be 'W' for Alipay Wallet payments and 'E' for UPI Cards payment.
- `BaseNo` (string, optional) — FXLM Base Number. If provided this base number will be passed to FXLM for pricing and settlement. Only one of \<BaseNo> or \<FXLMEntity> may be provided. If neither is present the OLR to base number configuration will be used. Echoed from customer request.
- `FXLMEntity` (string, optional) — FXLM Entity. If provided this Entity will be passed to FXLM for pricing and settlement. Only one of \<BaseNo> or \<FXLMEntity> may be provided. If neither is present the OLR to base number configuration will be used. Echoed from customer request.
- `WLFlag` (string, optional) — Account processing and settlement. W - Standard WorldLink account processing and settlementN- Bypass all WorldLink account processing and settlement. Pass the numeric detail TRN to FXLM.O - Bypass all WorldLink account processing and settlement. Pass the OLR numeric sequence number as the TRN to FXLM.If not provided default will be W.
- `DealType` (string, optional) — Deal type. Deal type- 'B' for all bench deals for bench fixing ratesDeal type- `Q` for all real time quoted rate deals This must be coordinated with QUOTED fixing typeDeal Type- 'O' book per OLR parametersDefault value will be O, if not provided.
- `ForExRateDealAddRs` (IfxResponseBookFxBankSvcRsForExRateDealAddRs, optional)

### IfxRequestBookFxSignonRqClientApp

- `Name` (string, required) — Customer System application name. CTSI INTERFACE/ GPP would map this as default - GPP
- `Org` (string, required) — Customer System application manufacturer. CTSI INTERFACE/ GPP would map this as default - GPP
- `Version` (string, required) — Customer system application version.

### IfxRequestBookFxBankSvcRqItemsForExRateDealAddRqItems

- `RqUID` (string, required) — Customer Ref No for this ForExRateDealAddRq block. Can be the same as reference for Rate request.
- `CustId` (IfxRequestBookFxBankSvcRqItemsForExRateDealAddRqItemsCustId, required)
- `ForExDealInfo` (IfxRequestBookFxBankSvcRqItemsForExRateDealAddRqItemsForExDealInfo, required) — Deal Info request.

### IfxResponseBookFxBankSvcRsStatus

- `StatusCode` (string, optional) — StatusCode as Per IFX XML. PROCESSED for code 000 and 120 (Rate returned and value date changed) FAILED for all other codes (Rejects)
- `Severity` (string, optional) — Error,Warn,Info. NONE for code 000, HIGH for all the other status codes.
- `StatusDesc` (string, optional) — Text description for status code. 991 : Application program abend has occurred 000 : Rate Returned

### IfxResponseBookFxBankSvcRsForExRateDealAddRs

- `Status` (IfxResponseBookFxBankSvcRsForExRateDealAddRsStatus, optional)
- `RqUID` (string, optional) — Customer Ref No for the request. Header - Client Reference Number. Echoed from customer request.
- `CustId` (IfxResponseBookFxBankSvcRsForExRateDealAddRsCustId, optional)
- `ResTime` (string, optional) — Date & Time when the response is generated
- `ForExDealInfo` (IfxResponseBookFxBankSvcRsForExRateDealAddRsForExDealInfo, optional)
- `ForExDealRec` (IfxResponseBookFxBankSvcRsForExRateDealAddRsForExDealRec, optional)

### IfxRequestBookFxBankSvcRqItemsForExRateDealAddRqItemsCustId

- `SPName` (string, required) — Always set to "CTSI".
- `CustPermId` (string, required) — WL Client Number + WorldLink Branch Number. It is used to validate client id. Please note this will be same for all requests in a single message as per existing CMX flow.

### IfxRequestBookFxBankSvcRqItemsForExRateDealAddRqItemsForExDealInfo

Deal Info request.

- `CurConvertRule` (enum, required) — Currency conversion method Direct/Indirect
  - Allowed values: `DIRECT`, `INDIRECT`, `INTERBANK`
- `IssueCurCode` (string, required) — Issue Currency. It is an ISO currency code. It is mandatory field for rate request if issueAmt is provided and will be used for validating currency code.
- `RemitCurCode` (string, required) — Remit Currency. It is an ISO currency code. It is mandatory field for rate request if RemitAmt is provided and will be used for validating currency code.
- `SPRefId` (string, required) — Object identifiers in the IFX specification are of the data type "Identifier." This is a narrow character data type with a maximum length of 36.
- `ForExRateDealType` (string, optional) — Buy or Sell. Default is Buy.
- `ForExValDtType` (string, optional) — Daily, Spot or Future. Default value is Spot, if no value is provided.
- `ForExTnr` (string, optional) — Tenor value from frontend. Two Alphanumeric code for tenor.0 SP, TN, SD & BA. Conditional when FX request has Tenor listed as SD or TN or SP, OLR will book the FX and respond with the same requested tenor value. If the request is having BA as tenor value, OLR will determine tenor value either as SD or TN or SP based on FX availablity.
- `ForExValDt` (string, optional) — Value date required only if ForExValDtType is Future. Data type is "Date" as defined in IFX XML. FX contract Value Date mapped as yyyy-mm-dd. Value date is required if ForExValDtType is Future GPP to map the value date if Client profile is set up for FX Request type as Value date
- `IssueAmt` (string, optional) — Amount to Buy or Sell. If IssueAmt is provided it means you are buying the currency.
- `RemitAmt` (string, optional) — Amount to Buy or Sell. If RemitAmt is provided it means you are selling the currency.
- `ForExUnw` (string, optional) — Unwind time.
- `DeliveryMethod` (string, optional) — DEALID6 or DEALID16

### IfxResponseBookFxBankSvcRsForExRateDealAddRsStatus

- `StatusCode` (string, optional) — StatusCode as Per IFX XML. PROCESSED for code 000 and 120 (Rate returned and value date changed) FAILED for all other codes (Rejects)
- `ServerStatusCode` (string, optional) — Backend Status Code
- `Severity` (string, optional) — Error,Warn,Info. NONE for code 000, HIGH for all the other status codes.
- `StatusDesc` (string, optional) — Text description for status code. 991 : Application program abend has occurred 000 : Rate Returned

### IfxResponseBookFxBankSvcRsForExRateDealAddRsCustId

- `SPName` (string, optional) — Always set to "CTSI".
- `CustPermId` (string, optional) — WL Client Number + WorldLink Branch Number. It is used to validate client id. Please note this will be same for all requests in a single message as per existing CMX flow.

### IfxResponseBookFxBankSvcRsForExRateDealAddRsForExDealInfo

- `ForExRateDealType` (string, optional) — Buy or Sell. Default is Buy. Echoed from Customer Request.
- `ForExValDtType` (string, optional) — Daily, Spot or Future. Default value is Spot, if no value is provided.
- `ForExTnr` (string, optional) — Tenor value from frontend. Two Alphanumeric code for tenor.0 SP, TN, SD & BA. Conditional when FX request has Tenor listed as SD or TN or SP, OLR will book the FX and respond with the same requested tenor value. If the request is having BA as tenor value, OLR will determine tenor value either as SD or TN or SP based on FX availablity.
- `ForExValDt` (string, optional) — Value date required only if ForExValDtType is Future. Data type is "Date" as defined in IFX XML. FX contract Value Date mapped as yyyy-mm-dd. Value date is required if ForExValDtType is Future GPP to map the value date if Client profile is set up for FX Request type as Value date
- `CurConvertRule` (enum, optional) — Currency conversion method Direct/Indirect
  - Allowed values: `DIRECT`, `INDIRECT`, `INTERBANK`
- `IssueAmt` (string, optional) — Amount to Buy or Sell. If IssueAmt is provided it means you are buying the currency.
- `IssueCurCode` (string, optional) — Issue Currency. It is an ISO currency code. It is mandatory field for rate request if issueAmt is provided and will be used for validating currency code.
- `RemitAmt` (string, optional) — Amount to Buy or Sell. If RemitAmt is provided it means you are selling the currency.
- `RemitCurCode` (string, optional) — Remit Currency. It is an ISO currency code. It is mandatory field for rate request if RemitAmt is provided and will be used for validating currency code.
- `SPRefId` (string, optional) — Object identifiers in the IFX specification are of the data type "Identifier." This is a narrow character data type with a maximum length of 36.
- `DeliveryMethod` (string, optional) — DEALID6 or DEALID16

### IfxResponseBookFxBankSvcRsForExRateDealAddRsForExDealRec

- `ForExDealId` (string, optional) — The commited FX contract ID. This element is present if the deal was ssuccessfully booked. Deal Id should be combination of Deal Number(6x) & OLR Deal Sequence number(9n).
- `ForExDealInfo` (IfxResponseBookFxBankSvcRsForExRateDealAddRsForExDealRecForExDealInfo, optional)

### IfxResponseBookFxBankSvcRsForExRateDealAddRsForExDealRecForExDealInfo

- `ExpDt` (string, optional) — Contract Expiry Datetime. This is the expiry datetime for this contract. This may be a few minutes for a rate offer and may be few days for a committed rate.
- `CurRate` (double, optional) — FX Rate
- `CurConvertRule` (enum, optional) — Currency conversion method Direct/Indirect
  - Allowed values: `DIRECT`, `INDIRECT`, `INTERBANK`
- `IssueAmt` (string, optional) — Amount to Buy or Sell. If IssueAmt is provided it means you are buying the currency.
- `IssueCurCode` (string, optional) — Issue Currency. It is an ISO currency code. It is mandatory field for rate request if issueAmt is provided and will be used for validating currency code.
- `RemitAmt` (string, optional) — Amount to Buy or Sell. If RemitAmt is provided it means you are selling the currency.
- `RemitCurCode` (string, optional) — Remit Currency. It is an ISO currency code. It is mandatory field for rate request if RemitAmt is provided and will be used for validating currency code.
- `SPRefId` (string, optional) — Object identifiers in the IFX specification are of the data type "Identifier." This is a narrow character data type with a maximum length of 36.
- `BenchFixing` (string, optional) — Bench Fixing. Required only for Bench Deals

## Examples

### Book-Fx-Request-Json (application/json)

**Request**

```json
{
  "SignonRq": {
    "ClientDt": "2025-12-17T05:21:02",
    "CustLangPref": "ENGLISH",
    "ClientApp": {
      "Name": "ABCDBANK",
      "Org": "CTSI INTERFACE",
      "Version": "1.0"
    }
  },
  "BankSvcRq": [
    {
      "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
      "ForExRateDealAddRq": [
        {
          "RqUID": "99dc17a3-6bbf-4310-973a-a369e50",
          "CustId": {
            "SPName": "CTSI",
            "CustPermId": "85370001"
          },
          "ForExDealInfo": {
            "CurConvertRule": "DIRECT",
            "IssueCurCode": "INR",
            "RemitCurCode": "USD",
            "SPRefId": "XML56EQB",
            "ForExRateDealType": "SELL",
            "RemitAmt": "3"
          }
        }
      ],
      "PrefPrice": "N",
      "WLFlag": "W",
      "DealType": "O"
    }
  ]
}
```

**Response**

```json
{
  "IFX": {
    "BankSvcRs": {
      "DealType": "O",
      "ForExRateDealAddRs": {
        "ForExDealInfo": {
          "CurConvertRule": "Direct",
          "ForExRateDealType": "SELL",
          "IssueCurCode": "INR",
          "RemitAmt": "3",
          "RemitCurCode": "USD",
          "SPRefId": "XML56HEG"
        },
        "ForExDealRec": {
          "ForExDealId": "AA6594101242034",
          "ForExDealInfo": {
            "CurConvertRule": "Direct",
            "CurRate": 89.83,
            "ForExUnw": "2026-01-15-05.00.00",
            "IssueAmt": 269.49,
            "IssueCurCode": "INR",
            "RemitAmt": 3,
            "RemitCurCode": "USD",
            "SPRefId": "XML56HEG"
          }
        },
        "RqUID": "99dc17a3-6bbf-4310-973a-a369e50",
        "Status": {
          "Severity": "NONE",
          "StatusCode": "PROCESSED",
          "StatusDesc": "000 : Rate returned"
        }
      },
      "PrefPrice": "N",
      "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
      "Status": {
        "Severity": "NONE",
        "StatusCode": "PROCESSED",
        "StatusDesc": "000 : Rate returned"
      },
      "WLFlag": "W"
    }
  }
}
```

**SDK Code**

```python Book-Fx-Request-Json (application/json)
import requests

url = "https://api.example.com/v3/fx/bookfx"

payload = {
    "SignonRq": {
        "ClientDt": "2025-12-17T05:21:02",
        "CustLangPref": "ENGLISH",
        "ClientApp": {
            "Name": "ABCDBANK",
            "Org": "CTSI INTERFACE",
            "Version": "1.0"
        }
    },
    "BankSvcRq": [
        {
            "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
            "ForExRateDealAddRq": [
                {
                    "RqUID": "99dc17a3-6bbf-4310-973a-a369e50",
                    "CustId": {
                        "SPName": "CTSI",
                        "CustPermId": "85370001"
                    },
                    "ForExDealInfo": {
                        "CurConvertRule": "DIRECT",
                        "IssueCurCode": "INR",
                        "RemitCurCode": "USD",
                        "SPRefId": "XML56EQB",
                        "ForExRateDealType": "SELL",
                        "RemitAmt": "3"
                    }
                }
            ],
            "PrefPrice": "N",
            "WLFlag": "W",
            "DealType": "O"
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Book-Fx-Request-Json (application/json)
const url = 'https://api.example.com/v3/fx/bookfx';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"SignonRq":{"ClientDt":"2025-12-17T05:21:02","CustLangPref":"ENGLISH","ClientApp":{"Name":"ABCDBANK","Org":"CTSI INTERFACE","Version":"1.0"}},"BankSvcRq":[{"RqUID":"99dc17a3-6bbf-4310-973a-a369e5","ForExRateDealAddRq":[{"RqUID":"99dc17a3-6bbf-4310-973a-a369e50","CustId":{"SPName":"CTSI","CustPermId":"85370001"},"ForExDealInfo":{"CurConvertRule":"DIRECT","IssueCurCode":"INR","RemitCurCode":"USD","SPRefId":"XML56EQB","ForExRateDealType":"SELL","RemitAmt":"3"}}],"PrefPrice":"N","WLFlag":"W","DealType":"O"}]}'
};

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

```go Book-Fx-Request-Json (application/json)
package main

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

func main() {

	url := "https://api.example.com/v3/fx/bookfx"

	payload := strings.NewReader("{\n  \"SignonRq\": {\n    \"ClientDt\": \"2025-12-17T05:21:02\",\n    \"CustLangPref\": \"ENGLISH\",\n    \"ClientApp\": {\n      \"Name\": \"ABCDBANK\",\n      \"Org\": \"CTSI INTERFACE\",\n      \"Version\": \"1.0\"\n    }\n  },\n  \"BankSvcRq\": [\n    {\n      \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n      \"ForExRateDealAddRq\": [\n        {\n          \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e50\",\n          \"CustId\": {\n            \"SPName\": \"CTSI\",\n            \"CustPermId\": \"85370001\"\n          },\n          \"ForExDealInfo\": {\n            \"CurConvertRule\": \"DIRECT\",\n            \"IssueCurCode\": \"INR\",\n            \"RemitCurCode\": \"USD\",\n            \"SPRefId\": \"XML56EQB\",\n            \"ForExRateDealType\": \"SELL\",\n            \"RemitAmt\": \"3\"\n          }\n        }\n      ],\n      \"PrefPrice\": \"N\",\n      \"WLFlag\": \"W\",\n      \"DealType\": \"O\"\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 Book-Fx-Request-Json (application/json)
require 'uri'
require 'net/http'

url = URI("https://api.example.com/v3/fx/bookfx")

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  \"SignonRq\": {\n    \"ClientDt\": \"2025-12-17T05:21:02\",\n    \"CustLangPref\": \"ENGLISH\",\n    \"ClientApp\": {\n      \"Name\": \"ABCDBANK\",\n      \"Org\": \"CTSI INTERFACE\",\n      \"Version\": \"1.0\"\n    }\n  },\n  \"BankSvcRq\": [\n    {\n      \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n      \"ForExRateDealAddRq\": [\n        {\n          \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e50\",\n          \"CustId\": {\n            \"SPName\": \"CTSI\",\n            \"CustPermId\": \"85370001\"\n          },\n          \"ForExDealInfo\": {\n            \"CurConvertRule\": \"DIRECT\",\n            \"IssueCurCode\": \"INR\",\n            \"RemitCurCode\": \"USD\",\n            \"SPRefId\": \"XML56EQB\",\n            \"ForExRateDealType\": \"SELL\",\n            \"RemitAmt\": \"3\"\n          }\n        }\n      ],\n      \"PrefPrice\": \"N\",\n      \"WLFlag\": \"W\",\n      \"DealType\": \"O\"\n    }\n  ]\n}"

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

```java Book-Fx-Request-Json (application/json)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.example.com/v3/fx/bookfx")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"SignonRq\": {\n    \"ClientDt\": \"2025-12-17T05:21:02\",\n    \"CustLangPref\": \"ENGLISH\",\n    \"ClientApp\": {\n      \"Name\": \"ABCDBANK\",\n      \"Org\": \"CTSI INTERFACE\",\n      \"Version\": \"1.0\"\n    }\n  },\n  \"BankSvcRq\": [\n    {\n      \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n      \"ForExRateDealAddRq\": [\n        {\n          \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e50\",\n          \"CustId\": {\n            \"SPName\": \"CTSI\",\n            \"CustPermId\": \"85370001\"\n          },\n          \"ForExDealInfo\": {\n            \"CurConvertRule\": \"DIRECT\",\n            \"IssueCurCode\": \"INR\",\n            \"RemitCurCode\": \"USD\",\n            \"SPRefId\": \"XML56EQB\",\n            \"ForExRateDealType\": \"SELL\",\n            \"RemitAmt\": \"3\"\n          }\n        }\n      ],\n      \"PrefPrice\": \"N\",\n      \"WLFlag\": \"W\",\n      \"DealType\": \"O\"\n    }\n  ]\n}")
  .asString();
```

```php Book-Fx-Request-Json (application/json)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.example.com/v3/fx/bookfx', [
  'body' => '{
  "SignonRq": {
    "ClientDt": "2025-12-17T05:21:02",
    "CustLangPref": "ENGLISH",
    "ClientApp": {
      "Name": "ABCDBANK",
      "Org": "CTSI INTERFACE",
      "Version": "1.0"
    }
  },
  "BankSvcRq": [
    {
      "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
      "ForExRateDealAddRq": [
        {
          "RqUID": "99dc17a3-6bbf-4310-973a-a369e50",
          "CustId": {
            "SPName": "CTSI",
            "CustPermId": "85370001"
          },
          "ForExDealInfo": {
            "CurConvertRule": "DIRECT",
            "IssueCurCode": "INR",
            "RemitCurCode": "USD",
            "SPRefId": "XML56EQB",
            "ForExRateDealType": "SELL",
            "RemitAmt": "3"
          }
        }
      ],
      "PrefPrice": "N",
      "WLFlag": "W",
      "DealType": "O"
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Book-Fx-Request-Json (application/json)
using RestSharp;

var client = new RestClient("https://api.example.com/v3/fx/bookfx");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"SignonRq\": {\n    \"ClientDt\": \"2025-12-17T05:21:02\",\n    \"CustLangPref\": \"ENGLISH\",\n    \"ClientApp\": {\n      \"Name\": \"ABCDBANK\",\n      \"Org\": \"CTSI INTERFACE\",\n      \"Version\": \"1.0\"\n    }\n  },\n  \"BankSvcRq\": [\n    {\n      \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n      \"ForExRateDealAddRq\": [\n        {\n          \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e50\",\n          \"CustId\": {\n            \"SPName\": \"CTSI\",\n            \"CustPermId\": \"85370001\"\n          },\n          \"ForExDealInfo\": {\n            \"CurConvertRule\": \"DIRECT\",\n            \"IssueCurCode\": \"INR\",\n            \"RemitCurCode\": \"USD\",\n            \"SPRefId\": \"XML56EQB\",\n            \"ForExRateDealType\": \"SELL\",\n            \"RemitAmt\": \"3\"\n          }\n        }\n      ],\n      \"PrefPrice\": \"N\",\n      \"WLFlag\": \"W\",\n      \"DealType\": \"O\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Book-Fx-Request-Json (application/json)
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "SignonRq": [
    "ClientDt": "2025-12-17T05:21:02",
    "CustLangPref": "ENGLISH",
    "ClientApp": [
      "Name": "ABCDBANK",
      "Org": "CTSI INTERFACE",
      "Version": "1.0"
    ]
  ],
  "BankSvcRq": [
    [
      "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
      "ForExRateDealAddRq": [
        [
          "RqUID": "99dc17a3-6bbf-4310-973a-a369e50",
          "CustId": [
            "SPName": "CTSI",
            "CustPermId": "85370001"
          ],
          "ForExDealInfo": [
            "CurConvertRule": "DIRECT",
            "IssueCurCode": "INR",
            "RemitCurCode": "USD",
            "SPRefId": "XML56EQB",
            "ForExRateDealType": "SELL",
            "RemitAmt": "3"
          ]
        ]
      ],
      "PrefPrice": "N",
      "WLFlag": "W",
      "DealType": "O"
    ]
  ]
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.example.com/v3/fx/bookfx")! 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()
```

### Book-Fx-Request-Xml (application/xml)

**Request**

```json
{
  "SignonRq": {
    "ClientDt": "2017-08-30T05:21:02",
    "CustLangPref": "ENGLISH",
    "ClientApp": {
      "Name": "string",
      "Org": "string",
      "Version": "string"
    }
  },
  "BankSvcRq": [
    {
      "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
      "ForExRateDealAddRq": [
        {
          "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
          "CustId": {
            "SPName": "string",
            "CustPermId": "string"
          },
          "ForExDealInfo": {
            "CurConvertRule": "DIRECT",
            "IssueCurCode": "string",
            "RemitCurCode": "string",
            "SPRefId": "string"
          }
        }
      ]
    }
  ]
}
```

**Response**

```json
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n  <IFX>\n    <BankSvcRs>\n      <Status>\n        <Severity>NONE</Severity>\n        <StatusCode>PROCESSED</StatusCode>\n        <StatusDesc>000 : Rate returned</StatusDesc>\n      </Status>\n      <RqUID>696f88f1-71f1-4ba5-abe4-ff98166d7861</RqUID>\n      <PrefPrice>N</PrefPrice>\n      <WLFlag>W</WLFlag>\n      <DealType>O</DealType>\n      <ForExRateDealAddRs>\n        <Status>\n          <Severity>NONE</Severity>\n          <StatusCode>PROCESSED</StatusCode>\n          <StatusDesc>000 : Rate returned</StatusDesc>\n        </Status>\n        <RqUID>ec1553fe-bca8-43f9-8da1-fa324b661c0c</RqUID>\n        <ForExDealInfo>\n          <ForExRateDealType>SELL</ForExRateDealType>\n          <CurConvertRule>Direct</CurConvertRule>\n          <IssueCurCode>NOK</IssueCurCode>\n          <RemitAmt>200</RemitAmt>\n          <RemitCurCode>CAD</RemitCurCode>\n          <SPRefId>XML56HE5</SPRefId>\n        </ForExDealInfo>\n        <ForExDealRec>\n          <ForExDealId>AA6560101241970</ForExDealId>\n          <ForExDealInfo>\n            <CurRate>7.25350000</CurRate>\n            <CurConvertRule>Direct</CurConvertRule>\n            <IssueAmt>1450.700</IssueAmt>\n            <IssueCurCode>NOK</IssueCurCode>\n            <RemitAmt>200.000</RemitAmt>\n            <RemitCurCode>CAD</RemitCurCode>\n            <SPRefId>XML56HE5</SPRefId>\n          </ForExDealInfo>\n        </ForExDealRec>\n      </ForExRateDealAddRs>\n    </BankSvcRs>\n  </IFX>\n"
```

**SDK Code**

```python Book-Fx-Request-Xml (application/xml)
import requests

url = "https://api.example.com/v3/fx/bookfx"

payload = {
    "SignonRq": {
        "ClientDt": "2017-08-30T05:21:02",
        "CustLangPref": "ENGLISH",
        "ClientApp": {
            "Name": "string",
            "Org": "string",
            "Version": "string"
        }
    },
    "BankSvcRq": [
        {
            "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
            "ForExRateDealAddRq": [
                {
                    "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
                    "CustId": {
                        "SPName": "string",
                        "CustPermId": "string"
                    },
                    "ForExDealInfo": {
                        "CurConvertRule": "DIRECT",
                        "IssueCurCode": "string",
                        "RemitCurCode": "string",
                        "SPRefId": "string"
                    }
                }
            ]
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Book-Fx-Request-Xml (application/xml)
const url = 'https://api.example.com/v3/fx/bookfx';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"SignonRq":{"ClientDt":"2017-08-30T05:21:02","CustLangPref":"ENGLISH","ClientApp":{"Name":"string","Org":"string","Version":"string"}},"BankSvcRq":[{"RqUID":"99dc17a3-6bbf-4310-973a-a369e5","ForExRateDealAddRq":[{"RqUID":"99dc17a3-6bbf-4310-973a-a369e5","CustId":{"SPName":"string","CustPermId":"string"},"ForExDealInfo":{"CurConvertRule":"DIRECT","IssueCurCode":"string","RemitCurCode":"string","SPRefId":"string"}}]}]}'
};

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

```go Book-Fx-Request-Xml (application/xml)
package main

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

func main() {

	url := "https://api.example.com/v3/fx/bookfx"

	payload := strings.NewReader("{\n  \"SignonRq\": {\n    \"ClientDt\": \"2017-08-30T05:21:02\",\n    \"CustLangPref\": \"ENGLISH\",\n    \"ClientApp\": {\n      \"Name\": \"string\",\n      \"Org\": \"string\",\n      \"Version\": \"string\"\n    }\n  },\n  \"BankSvcRq\": [\n    {\n      \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n      \"ForExRateDealAddRq\": [\n        {\n          \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n          \"CustId\": {\n            \"SPName\": \"string\",\n            \"CustPermId\": \"string\"\n          },\n          \"ForExDealInfo\": {\n            \"CurConvertRule\": \"DIRECT\",\n            \"IssueCurCode\": \"string\",\n            \"RemitCurCode\": \"string\",\n            \"SPRefId\": \"string\"\n          }\n        }\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 Book-Fx-Request-Xml (application/xml)
require 'uri'
require 'net/http'

url = URI("https://api.example.com/v3/fx/bookfx")

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  \"SignonRq\": {\n    \"ClientDt\": \"2017-08-30T05:21:02\",\n    \"CustLangPref\": \"ENGLISH\",\n    \"ClientApp\": {\n      \"Name\": \"string\",\n      \"Org\": \"string\",\n      \"Version\": \"string\"\n    }\n  },\n  \"BankSvcRq\": [\n    {\n      \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n      \"ForExRateDealAddRq\": [\n        {\n          \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n          \"CustId\": {\n            \"SPName\": \"string\",\n            \"CustPermId\": \"string\"\n          },\n          \"ForExDealInfo\": {\n            \"CurConvertRule\": \"DIRECT\",\n            \"IssueCurCode\": \"string\",\n            \"RemitCurCode\": \"string\",\n            \"SPRefId\": \"string\"\n          }\n        }\n      ]\n    }\n  ]\n}"

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

```java Book-Fx-Request-Xml (application/xml)
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.example.com/v3/fx/bookfx")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"SignonRq\": {\n    \"ClientDt\": \"2017-08-30T05:21:02\",\n    \"CustLangPref\": \"ENGLISH\",\n    \"ClientApp\": {\n      \"Name\": \"string\",\n      \"Org\": \"string\",\n      \"Version\": \"string\"\n    }\n  },\n  \"BankSvcRq\": [\n    {\n      \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n      \"ForExRateDealAddRq\": [\n        {\n          \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n          \"CustId\": {\n            \"SPName\": \"string\",\n            \"CustPermId\": \"string\"\n          },\n          \"ForExDealInfo\": {\n            \"CurConvertRule\": \"DIRECT\",\n            \"IssueCurCode\": \"string\",\n            \"RemitCurCode\": \"string\",\n            \"SPRefId\": \"string\"\n          }\n        }\n      ]\n    }\n  ]\n}")
  .asString();
```

```php Book-Fx-Request-Xml (application/xml)
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.example.com/v3/fx/bookfx', [
  'body' => '{
  "SignonRq": {
    "ClientDt": "2017-08-30T05:21:02",
    "CustLangPref": "ENGLISH",
    "ClientApp": {
      "Name": "string",
      "Org": "string",
      "Version": "string"
    }
  },
  "BankSvcRq": [
    {
      "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
      "ForExRateDealAddRq": [
        {
          "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
          "CustId": {
            "SPName": "string",
            "CustPermId": "string"
          },
          "ForExDealInfo": {
            "CurConvertRule": "DIRECT",
            "IssueCurCode": "string",
            "RemitCurCode": "string",
            "SPRefId": "string"
          }
        }
      ]
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Book-Fx-Request-Xml (application/xml)
using RestSharp;

var client = new RestClient("https://api.example.com/v3/fx/bookfx");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"SignonRq\": {\n    \"ClientDt\": \"2017-08-30T05:21:02\",\n    \"CustLangPref\": \"ENGLISH\",\n    \"ClientApp\": {\n      \"Name\": \"string\",\n      \"Org\": \"string\",\n      \"Version\": \"string\"\n    }\n  },\n  \"BankSvcRq\": [\n    {\n      \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n      \"ForExRateDealAddRq\": [\n        {\n          \"RqUID\": \"99dc17a3-6bbf-4310-973a-a369e5\",\n          \"CustId\": {\n            \"SPName\": \"string\",\n            \"CustPermId\": \"string\"\n          },\n          \"ForExDealInfo\": {\n            \"CurConvertRule\": \"DIRECT\",\n            \"IssueCurCode\": \"string\",\n            \"RemitCurCode\": \"string\",\n            \"SPRefId\": \"string\"\n          }\n        }\n      ]\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Book-Fx-Request-Xml (application/xml)
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "SignonRq": [
    "ClientDt": "2017-08-30T05:21:02",
    "CustLangPref": "ENGLISH",
    "ClientApp": [
      "Name": "string",
      "Org": "string",
      "Version": "string"
    ]
  ],
  "BankSvcRq": [
    [
      "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
      "ForExRateDealAddRq": [
        [
          "RqUID": "99dc17a3-6bbf-4310-973a-a369e5",
          "CustId": [
            "SPName": "string",
            "CustPermId": "string"
          ],
          "ForExDealInfo": [
            "CurConvertRule": "DIRECT",
            "IssueCurCode": "string",
            "RemitCurCode": "string",
            "SPRefId": "string"
          ]
        ]
      ]
    ]
  ]
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://api.example.com/v3/fx/bookfx")! 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()
```