🚨 IMPORTANT: Action required by 30 Jan 2026

Starting 30 Jan 2026, we are enforcing stricter API validations to ensure SWIFT/ISO 20022 compliance. Please update your integration to the new field requirements before the deadline to avoid failures.

Overview

We are updating our API to align with downstream banking networks and introduce new withdrawal capabilities. These changes are divided into two parts:

  1. Validation Updates: Stricter character and length limits for Customer Profiles.
  2. New Features: Enhanced logic for Blockchain Withdrawals.

Part 1: Validation & Compliance Updates

  • Goal: Reduce downstream rejections and meet ISO 20022 standards.
  • Change: Stricter Regex patterns (SWIFT characters) and reduced field lengths.

1. Business CP Configuration

Endpoints:

  • POST /v1/kyc/customer_profiles

  • PUT /v1/kyc/customer_profiles/:unique_id

  • PATCH /v1/sandbox/kyc/customer_profiles/:unique_id Includes updates to general business details and standard address fields.

    ParameterOld ValidationNew Validation
    customerNameMax 191 (Any chars)SWIFT Chars (Max 50)
    /^(?=.{1,50}$)[a-zA-Z0-9 ]+$/
    address.streetMax 180 (Any chars)SWIFT Chars (Max 180)
    /^(?=.{1,180}$)[a-zA-Z0-9\-?:().,' +]+$/
    address.cityMax 100 (Specific chars)
    (Optional field)
    SWIFT Chars (Max 20)
    /^(?=.{1,20}$)[a-zA-Z0-9\-?:().,' +]+$/
    (Mandatory field)
    address.stateMax 35 (SWIFT chars)SWIFT Chars (Max 15)
    /^(?=.{1,15}$)[a-zA-Z0-9\-?:().,' +]+$/
    placeOfBizMax 255 (Any chars)SWIFT Chars (Max 255)
    /^(?=.{1,255}$)[a-zA-Z0-9\-?:().,' +]+$/

2. Personal CP+ Configuration

Endpoints:

  • POST /v1/kyc/customer_profiles

  • PUT /v1/kyc/customer_profiles/:unique_id

  • PATCH /v1/sandbox/kyc/customer_profiles/:unique_id Includes updates to personal identity fields and standard address fields.

    ParameterOld ValidationNew Validation
    customerFirstNameMax 191 (Any chars)SWIFT Chars (Max 50)
    /^(?=.{1,50}$)[a-zA-Z0-9 ]+$/
    customerLastNameMax 191 (Any chars)SWIFT Chars (Max 50)
    /^(?=.{1,50}$)[a-zA-Z0-9 ]+$/
    address.streetMax 180 (Any chars)SWIFT Chars (Max 180)
    /^(?=.{1,180}$)[a-zA-Z0-9\-?:().,' +]+$/
    address.cityMax 100 (Specific chars)
    (Optional field)
    SWIFT Chars (Max 20)
    /^(?=.{1,20}$)[a-zA-Z0-9\-?:().,' +]+$/
    (Mandatory field)
    address.stateMax 35 (SWIFT chars)SWIFT Chars (Max 15)
    /^(?=.{1,15}$)[a-zA-Z0-9\-?:().,' +]+$/

3. Business CP+ Configuration

Endpoints:

  • POST /v1/kyc/customer_profiles

  • PUT /v1/kyc/customer_profiles/:unique_id

  • PATCH /v1/sandbox/kyc/customer_profiles/:unique_id Includes updates to operating addresses, beneficial owners, and trader details.

    ParameterOld ValidationNew Validation
    customerNameMax 191 (Any chars)SWIFT Chars (Max 50)
    /^(?=.{1,50}$)[a-zA-Z0-9 ]+$/
    address.streetMax 180 (Any chars)SWIFT Chars (Max 180)
    /^(?=.{1,180}$)[a-zA-Z0-9\-?:().,' +]+$/
    address.cityMax 100 (Specific chars)SWIFT Chars (Max 20)
    /^(?=.{1,20}$)[a-zA-Z0-9\-?:().,' +]+$/
    address.stateMax 35 (SWIFT chars)SWIFT Chars (Max 15)
    /^(?=.{1,15}$)[a-zA-Z0-9\-?:().,' +]+$/
    operatingAddress.streetMax 180 (Any chars)SWIFT Chars (Max 180)
    /^(?=.{1,180}$)[a-zA-Z0-9\-?:().,' +]+$/
    operatingAddress.cityMax 100 (Specific chars)
    (Optional field)
    SWIFT Chars (Max 20)
    /^(?=.{1,20}$)[a-zA-Z0-9\-?:().,' +]+$/
    (Mandatory field)
    operatingAddress.stateMax 35 (SWIFT chars)SWIFT Chars (Max 15)
    /^(?=.{1,15}$)[a-zA-Z0-9\-?:().,' +]+$/
    beneficialOwners[].address.streetMax 180 (Any chars)SWIFT Chars (Max 180)
    /^(?=.{1,180}$)[a-zA-Z0-9\-?:().,' +]+$/
    beneficialOwners[].address.cityMax 180 (Any chars)SWIFT Chars (Max 20)
    /^(?=.{1,20}$)[a-zA-Z0-9\-?:().,' +]+$/
    beneficialOwners[].address.stateMax 180 (Any chars)SWIFT Chars (Max 15)
    /^(?=.{1,15}$)[a-zA-Z0-9\-?:().,' +]+$/
    trader.address.streetMax 180 (Any chars)SWIFT Chars (Max 180)
    /^(?=.{1,180}$)[a-zA-Z0-9\-?:().,' +]+$/
    trader.address.cityMax 180 (Any chars)SWIFT Chars (Max 20)
    /^(?=.{1,20}$)[a-zA-Z0-9\-?:().,' +]+$/
    trader.address.stateMax 180 (Any chars)SWIFT Chars (Max 15)
    /^(?=.{1,15}$)[a-zA-Z0-9\-?:().,' +]+$/

Part 2: New Features (Blockchain Withdrawals)

  • Goal: Allow users to keep funds in fiat (SGD/USD) without auto-conversion.

1. Blockchain Withdrawal Improvements

Endpoint:

  • POST /v1/blockchain_transfer/withdrawals/

    We've introduced a new field when creating a blockchain withdrawal request. Depositing SGD/USD into the Dashboard VAs will now go towards your SGD/USD balances instead of being auto-converted to XSGD/XUSD. You can now select which balances to deduct for each blockchain withdrawal.
    Note: Once you've made the necessary changes, please let our internal team know for us to roll out the new dashboard updates.

    New ParameterDescriptionAccepted Values
    wallet_sourceThe source of funds the deduction will be made from. If no value is specified for this field, XSGD and XUSD withdrawals will, by default, be deducted from the XSGD and XUSD balances respectively.

    This field is Optional
    XSGD
    XUSD
    USD
    SGD

We have published three new endpoints to support user withdrawals from their StraitsX account via API

  • GET /v1/withdrawals/bank-accounts
  • POST /v1/withdrawals
  • GET /v1/withdrawals/:withdrawal_id

You will be able to make a withdrawal from your XSGD or XUSD wallet to a verified bank account on your StraitsX account easily with these two new endpoints.

We are now supporting both the SHA and OUR charge option for USD first party withdrawals (SWIFT) via POST /v1/customer_profile/{customer_profile_id}/withdrawals. The default charge option will be SHA if the attribute is not provided in the request.

We have now introduced the ability to create a customer profile bank account that's meant for SWIFT transactions. This means that the POST /v1/customer_profile/{customer_profile_id}/bank_accounts now supports the following optional fields:

  • swift_bic
  • intermediary_swift_bic
  • routing_code

We released a new endpoint GET /v1/payout-recipients/requirements that allows you to query for the recipient's data requirements depending on the recipient's country, currency, the disbursement method, the proxy type (when disbursement method is paynow) and the entity type. The data requirements are returned in regex and you can apply the same validation on your platforms to support recipient creation.

Note that if you are using the regex in a programming language that requires double backslashes (like Ruby or Java), then the response is already the correct regex. However, if you are using it directly in a regex engine (like JavaScript or Python), you would need to replace the double backslashes \\ with single backslash \.

For added convenience, you can now also query and update webhooks for the various supported events directly via the following endpoints:

  • GET /v1/webhooks
  • PATCH /v1/webhooks

Updating webhooks via the StraitsX dashboard continues to be available to you.

When creating a payout recipient via POST /payout-recipients you now also have to pass in the following required fields:

  • recipientInformation.entityType
  • recipientInformation.currency

We now also support creating a SWIFT payout recipient (with additional required fields) to allow for payouts in USD.

For more information, check out the API reference here.

We are excited to announce that we now support passing in purpose code for all SGD withdrawals and payouts via FAST. This field is optional and will be defaulted to OTHR (Others) if omitted. Full list of supported purpose codes can be found here.

Enhanced Endpoints:

  • POST /customer_profile/{customer_profile_id}/withdrawals
  • POST /customer_profile/{customer_profile_id}/payouts
  • POST /payouts

StraitsX API v1.1.0

by Lim Zi Xuan

We’re thrilled to announce the launch of StraitsX API v1.1.0, a new version that introduces the highly requested third party and regular transfers capabilities to our API suite. With this release, we now officially support three different integration models, depending on your business profile and requirements:

Detailed integration flows are now included in the revamped Guides section and all relevant endpoints have been updated in the API Reference section. If you are unsure or need clarification, contact us.


Other changes

  • We have made some underlying improvements on how we handle FX rates and network fee estimation for our Blockchain and Swap API and removed the rate limit error on these endpoints
  • Added two optional fields for POST /v1/customer_profile/{customer_profile_id}/withdrawals to support overseas withdrawals:
    • routing_code: Maximum 31 char alphanumeric
    • intermediary_swift_bic: Maximum 11 char alphanumeric

We now support two more swap pairs on our Swap API! You can now access the following swap pairs:

  • XSGDXUSD
  • XSGDUSDC
  • XUSDUSDC
  • USDCUSDT