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.
| Method | Previous endpoint | New 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.
| Field | Scope |
|---|---|
businessIndustryOther | Top-level field |
businessIndustryType | Top-level field |
customerBaseBreakdown | Top-level field |
isBusinessRegulated | Top-level field |
compliance | Entire object, including all nested fields |
isNamedAccountRequired | Top-level field |
regulatedEntity | Top-level field |
notRegulatedReason | Top-level field |
sourceOfFunds | Top-level field |
companySourceOfWealthExplanation | Top-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:
| Field | Location |
|---|---|
naicsCode | Top level |
companySourceOfWealth | Top level |
companySourceOfWealthOther | Top level |
accountFundingSource | Top level |
accountFundingSourceOther | Top level |
estimatedMonthlyVolumeUsd | transactionBreakdown |
averageUsdValueIncomingPayments | transactionBreakdown |
averageUsdValueOutgoingPayments | transactionBreakdown |
estimatedIncomingPaymentsPerMonth | transactionBreakdown |
estimatedOutgoingPaymentsPerMonth | transactionBreakdown |
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/documentsEach upload returns a documentId, which you then include in the documents array when creating a transfer.
Action required:
- Upload each supporting document using
POST /api/v1/transfers/documents. - Collect the returned document IDs.
- Pass those IDs in the
documentsarray of yourPOST /api/v1/transfersrequest.
Support for passing Base64 encode file in documents field ends on 30th October