Skip to main content

API Migration Guide

Breaking Changes​

1. Base URL Changed​

OldNew
/transfer_agent_api/v1//api/v1/

2. Authentication Headers Renamed​

Old HeaderNew Header
X-Request-Sk-Base64 / X-Request-Signature-Base64X-Request-Sig-B64
X-Api-Key-Base64X-Api-Key

3. Endpoint Paths Changed​

OldNew
POST /transfer_agent_api/v1/approve_investorPOST /api/v1/investor/whitelist
GET /transfer_agent_api/v1/check_whitelist/{address}GET /api/v1/investor/whitelist_status/{wallet_address}

4. Endpoints Removed​

EndpointDescription
POST /transfer_agent_api/v1/propose_txSafe transaction proposal
POST /transfer_agent_api/v1/get_nonceTransaction queue slot

5. Response Field Renamed​

Check whitelist status:

OldNew
whitelistedisWhitelisted

6. Required Request Fields​

The new API enforces validation on investor fields:

  • id, first_name, last_name, email, dob, full_address, blockchain_wallet, primary_phone are required
  • tin is optional — the sentinel value UPSIDE00 is accepted and normalised to null
  • full_address requires: street, city, countryCode, postalCode

New Features​

1. New Endpoints​

EndpointPurposeAuth Required
POST /api/v1/investor/kycSubmit KYC data without whitelistingYes
GET /api/v1/callback_pkGet public key for callback signature verificationNo
GET /api/v1/healthHealth checkNo

2. File Upload Support​

New optional fields on investor object:

{
"identityDocument": {
"fileName": "passport.jpg",
"contentType": "image/jpeg",
"size": 102400,
"data": "base64-encoded-content"
},
"proofOfAddress": {
"fileName": "utility_bill.pdf",
"contentType": "application/pdf",
"size": 204800,
"data": "base64-encoded-content"
}
}

3. Additional Investor Fields (Optional)​

FieldTypeDescription
accreditation"accredited" | "non_accredited" | "pending"Accreditation status
ssnstringSocial Security Number (US investors)
passportNumberstringPassport number (non-US investors)
identityDocumentCountrystringISO 3166-1 alpha-2 country code

All fields above are optional and can be omitted from requests.

4. External KYC Verification Status​

New optional fields on request body:

FieldTypeDescription
verifiedStatusbooleanWhether KYC verification passed (default: true)
verifiedAtISO 8601 stringWhen verification was completed (default: current timestamp)

5. Enhanced Response Structure​

Whitelist/KYC response now includes:

{
"requestId": "550e8400-e29b-41d4-a716-446655440000",
"status": "QUEUED",
"message": "Whitelisting request accepted and queued for processing"
}

Check whitelist response now includes:

{
"requestId": "uuid",
"address": "wallet_address",
"isWhitelisted": true,
"whitelistGroupId": 1,
"walletGroup": 1
}

6. Standardized Status Enum​

StatusDescription
QUEUEDRequest accepted, awaiting processing
PENDINGProcessing in progress
SUCCESSCompleted successfully
FAILEDProcessing failed

7. Detailed Failure Reasons​

When status: "FAILED", the reason field contains:

ReasonDescription
INVALID_MESSAGERequest validation failed
PII_STORAGE_ERRORFailed to store investor data
ALREADY_WHITELISTEDWallet already whitelisted
SIGNING_NOT_ALLOWEDSigning permission denied
SIGNING_ERRORTransaction signing failed
BROADCAST_SUBMIT_ERRORFailed to submit transaction
BROADCAST_FAILEDTransaction broadcast failed
CALLBACK_DELIVERY_FAILEDCallback delivery failed

8. Standardized Error Response​

All errors now return:

{
"error": "BAD_REQUEST|UNAUTHORIZED|FORBIDDEN|NOT_FOUND|INTERNAL_ERROR",
"details": "Human-readable error message",
"requestId": "uuid (if available)"
}

Edge Case Handling Differences​

Already Whitelisted Wallets​

AspectOld APINew API
Pre-checkNo pre-check before submittingChecks on-chain status before signing
BehaviorMay attempt duplicate transactionReturns ALREADY_WHITELISTED via callback
ResponseTransaction would fail on-chainFails early, no wasted gas

New API behavior: Before signing a whitelist transaction, the new API checks if the wallet is already in the target whitelist group. If so, it immediately returns a FAILED callback with reason: "ALREADY_WHITELISTED" without attempting the transaction.

Whitelist Status Response​

Old APINew API
{ whitelisted: boolean }{ isWhitelisted, whitelistGroupId, walletGroup }

The new API returns the expected group (whitelistGroupId from config) and the actual on-chain group (walletGroup), allowing clients to detect group mismatches.

Request Ordering (FIFO)​

Old APINew API
No ordering guaranteesFIFO queue per investor ID

The new API uses investor.id as the message group ID, ensuring requests for the same investor are processed in order.

File Upload Validation​

New API validates file uploads synchronously and returns specific error codes:

Error CodeDescription
INVALID_REQUESTMissing required file metadata (fileName, contentType, size, data)
INVALID_DATAFile data is not valid base64
SIZE_MISMATCHDeclared size doesn't match decoded file size

Server Configuration​

EnvironmentURL
Productionhttps://ta.upside.gg
Staginghttps://ta-staging.upside.gg