Release 1.32.0

We’ve updated developer endpoints, simplified customer onboarding, and changed how supporting documents are attached to transfers.

⚠️

Existing Endpoints Support ends on 30th October.

Existing endpoints and deprecated fields will remain supported during the transition period. Support ends on 30 October. Update your integration before this date.


Summary:

1. Customer onboarding changes - POST /api/v1/customers

BEFORE (supports end on 30th October)
{
  "businessLegalName": "string",
  "businessTradeName": "string",
  "taxIdentificationNumber": "string",
  "website": "string",
  "incorporationDate": "1999-03-21",
  "companyRegistrationNumber": "string",
  "businessIndustries": ["AccountFunding"],
  "businessModel": "string",
  "customerJurisdictions": ["NG", "GB"],
  "regulatedEntity": "string",
  "notRegulatedReason": "string",
  "sourceOfFunds": "string",
  "accountPurpose": "string",
  "email": "string",
  "transactionOriginCountries": ["GB"],
  "transactionDestinationCountries": ["GB", "NG"],
  "companySourceOfWealthExplanation": "string",
  "shareholdersSourceOfWealthExplanation": "string",
  "fundingSourceExplanation": "string",
  "countryOfIncorporation": "GA",
  "registeredAddress": {
    "street1": "string",
    "city": "string",
    "country": "CA"
  },
  "operationalAddress": {
    "street1": "string",
    "city": "string",
    "country": "CA"
  },
  "contactPerson": {
    "firstName": "string",
    "lastName": "string",
    "phoneNumber": "+44791234560",
    "email": "string"
  },
  "businessIndustryType": "CorporateOrMerchant",
  "withLivenessCheck": true,
  "termsOfServiceAcceptance": {
    "date": "2025-07-28T20:00:44.191Z",
    "ipAddress": "201.221.240.218"
  },
  "customerBaseBreakdown": "Retail",
  "isBusinessRegulated": true,
  "compliance": {
    "hasFinancialCrimeHistoryLast5Years": false,
    "isNegativeNewsAndSanctionsScreeningPerformed": false,
    "isTransactionMonitoringOrBlockchainAnalyticsPerformed": true,
    "isKYCPerformed": true,
    "financialCrimeProceedingsDescription": "string",
    "negativeNewsAndSanctionsVendor": "string",
    "transactionMonitoringOrBlockchainAnalyticsVendor": "string",
    "kycVendor": "string"
  },
  "transactionBreakdown": {
    "stablecoinTxCountMonthly": "Range1To10",
    "incomingStablecoinAvgUsdValue": "Usd15kTo50k",
    "outgoingStablecoinTxCountMonthly": "Range1To10",
    "outgoingStablecoinAvgUsdValue": "Usd15kTo50k",
    "incomingAchTxCountMonthly": "Range1To10",
    "incomingAchAvgUsdValue": "Usd15kTo50k",
    "outgoingAchTxCountMonthly": "Range1To10",
    "outgoingAchAvgUsdValue": "Usd15kTo50k",
    "incomingDomesticWireTxCountMonthly": "Range1To10",
    "incomingDomesticWireAvgUsdValue": "Usd15kTo50k",
    "outgoingDomesticWireTxCountMonthly": "Range1To10",
    "outgoingDomesticWireAvgUsdValue": "Usd15kTo50k",
    "incomingInternationalWireTxCountMonthly": "Range1To10",
    "incomingInternationalWireAvgUsdValue": "Usd15kTo50k",
    "outgoingInternationalWireTxCountMonthly": "Range1To10",
    "outgoingInternationalWireAvgUsdValue": "Usd15kTo50k",
    "estimatedMonthlyVolumeUsd": "Usd500kTo1m",
    "transactionTypes": ["StablecoinTransactions"],
    "preferredSettlementCurrencies": ["USD"]
  }
}
AFTER
{
  "businessLegalName": "string",
  "businessTradeName": "string",
  "taxIdentificationNumber": "string",
  "website": "https://example.com",
  "incorporationDate": "1999-03-21",
  "countryOfIncorporation": "GB",
  "companyRegistrationNumber": "string",
  "registeredAddress": {
    "street1": "string",
    "postalCode": "string",
    "city": "string",
    "state": "string",
    "country": "GB"
  },
  "operationalAddress": {
    "street1": "string",
    "postalCode": "string",
    "city": "string",
    "state": "string",
    "country": "GB"
  },
  "contactPerson": {
    "firstName": "string",
    "lastName": "string",
    "phoneNumber": "+`44791234560`",
    "email": "[email protected]"
  },
  "businessIndustries": ["VirtualDigitalGoods"],
  "withLivenessCheck": true,
  "businessModel": "string",
  "termsOfServiceAcceptance": {
    "date": "2025-07-28T20:00:44.191Z",
    "ipAddress": "201.221.240.218"
  },
  "customerJurisdictions": ["GB", "NG", "US"],
  "accountPurpose": "string",
  "email": "string",
  "transactionOriginCountries": ["GB", "NG"],
  "transactionDestinationCountries": ["GB", "NG"],
  "transactionBreakdown": {
    "estimatedMonthlyVolumeUsd": "Usd500kTo1m",
    "averageUsdValueIncomingPayments": "Usd100kTo250k",
    "averageUsdValueOutgoingPayments": "Usd100kTo250k",
    "estimatedIncomingPaymentsPerMonth": "Range1To15",
    "estimatedOutgoingPaymentsPerMonth": "Range30To50"
  },
  "naicsCode": "423620",
  "companySourceOfWealth": "BusinessProfits",
  "accountFundingSource": "OperatingIncome"
}

2. Customer onboarding documents - POST /api/v1/customers/customerId/documents

BEFORE (supports end on 30th October)

The following file types have been removed:

  • OrganizationChart
  • OwnershipChart
  • ComplianceOfficerCV
  • IndependentAmlAudit
  • AmlPolicy
  • RegulatoryLicenses
AFTER

New required file type introduced - BankStatements

3. Current tenant renamed to developer

BEFORE (supports end on 30th October)
  • GET /api/v1/current-tenant
  • GET /api/v1/current-tenant/webhook-config
  • GET /api/v1/current-tenant/balances
  • PATCH /api/v1/current-tenant/webhook-config
  • GET /api/v1/current-tenant/crypto-instruction/{network}/{asset}
After
  • GET /api/v1/developer

  • GET /api/v1/developer/webhook-config

  • GET /api/v1/developer/balances

  • PATCH /api/v1/developer/webhook-config

  • GET /api/v1/developer/crypto-instruction/{network}/{asset}

4. Transfers supporting documents - POST /api/v1/transfers

BEFORE (supports end on 30th October)
{
  "customerId": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "source": {
    "currency": "USDC",
    "network": "ethereum",
    "walletId": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
  },
  "destination": {
    "currency": "GBP",
    "externalAccountId": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
  },
  "purposeOfPayment": "PaymentForGoods",
  "receiverAmount": 15000.00, // this is the amount in destination currency
  "memo": "test payment",
  "useDeveloperFunds": true,
  "requireApproval": false,
  "documents": [
   "data:application/pdf;base64,abdcxxxx", // << BEFORE
   "data:application/pdf;base64,abdcxxxx" // << BEFORE
  ]
}
AFTER

Firstly, upload supporting document

curl --request POST \
     --url https://api.sandbox.keyrails.com/api/v1/transfers/documents \
     --header 'accept: application/json' \
     --header 'content-type: application/*+json' \
     --header 'Authorization: Bearer {{AccessToken}}' \
     --data '
{
  "fileBlob": "data:application/pdf;base64,abdcxxxx"
}
'

Then add the documentId returned in the documents field

curl --request POST \
     --url https://api.sandbox.keyrails.com/api/v1/transfers \
     --header 'accept: application/json' \
     --header 'content-type: application/*+json' \
     --header 'Authorization: Bearer {{AccessToken}}' \
     --data '{
  "customerId": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "source": {
    "currency": "USDC",
    "network": "ethereum",
    "walletId": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
  },
  "destination": {
    "currency": "GBP",
    "externalAccountId": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
  },
  "purposeOfPayment": "PaymentForGoods",
  "receiverAmount": 15000.00, // this is the amount in destination currency
  "memo": "test payment",
  "useDeveloperFunds": true,
  "requireApproval": false,
  "documents": [
   "3fa85f64-5717-4562-b3fc-2c963f66afa6",
   "9f8802d2-366f-466e-b8c0-09b9d3ced282"
  ]
}
'

5. Transfers now supports funding payments using developers wallet - POST /api/v1/transfers

Changes

useDeveloperFunds set it to TRUE

curl --request POST \
     --url https://api.sandbox.keyrails.com/api/v1/transfers \
     --header 'accept: application/json' \
     --header 'content-type: application/*+json' \
     --header 'Authorization: Bearer {{AccessToken}}' \
     --data '{
  "customerId": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
  "source": {
    "currency": "USDC",
    "network": "ethereum",
    "walletId": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
  },
  "destination": {
    "currency": "GBP",
    "externalAccountId": "497f6eca-6276-4993-bfeb-53cbbbba6f08"
  },
  "purposeOfPayment": "PaymentForGoods",
  "receiverAmount": 15000.00, // this is the amount in destination currency
  "memo": "test payment",
  "useDeveloperFunds": true,
  "requireApproval": false,
  "documents": [
   "3fa85f64-5717-4562-b3fc-2c963f66afa6",
   "9f8802d2-366f-466e-b8c0-09b9d3ced282"
  ]
}
'


Fund customer payments from your developer wallet

A new field, useDeveloperFunds, allows you to fund customer payments directly from your developer wallet.

You no longer need to transfer funds internally to the customer’s wallet before making the payment.

Current tenant endpoints renamed to developer endpoints

Current tenant endpoints have been rename from /api/v1/current-tenant to /api/v1/developer.

MethodPrevious endpointNew endpoint
GET/api/v1/current-tenant/api/v1/developer/
GET/api/v1/current-tenant/webhook-config/api/v1/developer/webhook-config
GET/api/v1/current-tenant/balances/api/v1/developer/balances
PATCH/api/v1/current-tenant/webhook-config/api/v1/developer/webhook-config
GET/api/v1/current-tenant/crypto-instruction/{network}/{asset}/api/v1/developer/crypto-instruction/{network}/{asset}

Action required: Update your requests to use the new endpoint paths. Support ends on 30th October

Customer onboarding

The request body for POST /api/v1/customers has been updated.

Deprecated fields

The following fields are being removed and will no longer be supported from 30 October.

FieldScope
businessIndustryOtherTop-level field
businessIndustryTypeTop-level field
customerBaseBreakdownTop-level field
isBusinessRegulatedTop-level field
complianceEntire object, including all nested fields
isNamedAccountRequiredTop-level field
regulatedEntityTop-level field
notRegulatedReasonTop-level field
sourceOfFundsTop-level field
companySourceOfWealthExplanationTop-level field

The following fields within transactionBreakdown are also being removed:

Field
transactionTypes
stablecoinTxCountMonthly
incomingStablecoinAvgUsdValue
outgoingStablecoinTxCountMonthly
outgoingStablecoinAvgUsdValue
incomingAchTxCountMonthly
incomingAchAvgUsdValue
outgoingAchTxCountMonthly
outgoingAchAvgUsdValue
incomingDomesticWireTxCountMonthly
incomingDomesticWireAvgUsdValue
outgoingDomesticWireTxCountMonthly
outgoingDomesticWireAvgUsdValue
incomingInternationalWireTxCountMonthly
incomingInternationalWireAvgUsdValue
outgoingInternationalWireTxCountMonthly
outgoingInternationalWireAvgUsdValue
preferredSettlementCurrencies

New fields

The following fields have been introduced:

FieldLocation
naicsCodeTop level
companySourceOfWealthTop level
companySourceOfWealthOtherTop level
accountFundingSourceTop level
accountFundingSourceOtherTop level
estimatedMonthlyVolumeUsdtransactionBreakdown
averageUsdValueIncomingPaymentstransactionBreakdown
averageUsdValueOutgoingPaymentstransactionBreakdown
estimatedIncomingPaymentsPerMonthtransactionBreakdown
estimatedOutgoingPaymentsPerMonthtransactionBreakdown

Action required: Update your customer creation requests to use the revised onboarding fields.

Document types

The following document types have been removed from the onboarding requirements:

Document type
OrganizationChart
OwnershipChart
ComplianceOfficerCV
IndependentAmlAudit
AmlPolicy
RegulatoryLicenses

A new document type, BankStatements, has been introduced.

Transfer supporting documents

The documents array in POST /api/v1/transfers is changing from accepting Base64-encoded files to accepting document IDs only.

Use the new endpoint to upload supporting documents:

POST /api/v1/transfers/documents

Each upload returns a documentId, which you then include in the documents array when creating a transfer.

Action required:

  1. Upload each supporting document using POST /api/v1/transfers/documents.
  2. Collect the returned document IDs.
  3. Pass those IDs in the documents array of your POST /api/v1/transfers request.

Support for passing Base64 encode file in documents field ends on 30th October