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, tin, blockchain_wallet, primary_phone are required
  • 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