Skip to content

Partner API — v2.5.0

Type: Minor Release  ·  Previous version: v2.0.0


✅ 8 New ✏️ 7 Modified 🚫 1 Deprecated

✅ New Endpoints

GET /offchainTransaction/transfer-method

Tag: Off Chain Transactions
Summary: fetch transfer methods

Query Parameters

Parameter Type Required Description
type string Yes e.g. ach
namespace string No e.g. fourthunicorn.raju1bh4.ul
blockchainAddress string No e.g. 0x8262f83b50e933677a89c854ba7dc64d3ae52001

Response Codes

Code Description
200 will fetch transfer methods via identityId
400 Bad request response if transfer methods fetching get failed

200 — will fetch transfer methods via identityId

{
  "data": {
    "id": "string",
    "bankDetails": "string",
    "type": "string",
    "createdAt": "string"
  },
  "message": "Successfully fetched from transfer methods"
}

400 — Bad request response if transfer methods fetching get failed

{
  "errors": [
    {
      "type": "catch",
      "message": "shows the error message while API failed in execution"
    },
    {
      "type": "Transfer Method",
      "message": "Please provide either namespace or blockchain address"
    },
    {
      "type": "Transfer Method",
      "message": "Tenant Id is missing in Headers"
    },
    {
      "message": "Please provide valid namespace",
      "type": "No data found"
    },
    {
      "type": "Transfer Method",
      "message": "Couldn't allow the transaction, customer doesn't belong to Tenant"
    },
    {
      "type": "Transfer Method",
      "message": "isTenantAuthorized?.message"
    },
    {
      "message": "Please provide valid namespace",
      "type": "No data found"
    },
    {
      "data": [],
      "message": "No Transfer Method Available For : namespace"
    },
    {
      "type": "Transfer Method",
      "message": "Couldn't allow the transaction, customer doesn't belong to Tenant"
    },
    {
      "type": "Transfer Method",
      "message": "isTenantAuthorized?.message"
    },
    {
      "message": "Please provide valid namespace",
      "type": "No data found"
    },
    {
      "message": "Failed to fetch the transfer method",
      "type": "catch"
    }
  ]
}

GET /tenant/badge

Tag: Badge Management
Summary: fetch all badges

Query Parameters

Parameter Type Required Description
page number Yes Page index e.g. 1
pagesize number Yes Page size
filters string No
search string No search key

Response Codes

Code Description
200 will list all the badges
400 Bad request response if list all badges

200 — will list all the badges

{
  "data": [
    {
      "badgeId": "36d166e5-c9d9-445b-8458-281546dd8171",
      "badgeName": "BRONZE-IDENTIFICATION-BADGE",
      "badgeType": "FIN",
      "badgeDescription": null,
      "userGroup": "WALLET-USER",
      "badgeSymbolRef": null,
      "createdBy": null,
      "createdAt": "2023-12-11T07:05:22.0000000+00:00",
      "updatedAt": "2023-12-11T07:05:22.0000000+00:00"
    }
  ],
  "pageNumber": 1,
  "pagesize": 10
}

400 — Bad request response if list all badges

{
  "errors": [
    {
      "type": "catch",
      "message": "shows the error message while API failed in execution"
    },
    {
      "message": "Page or pagesize should be positive value or atleast 1",
      "type": "page"
    },
    {
      "type": "catch",
      "message": "err.message"
    }
  ]
}

GET /tenant/badge/assign/fetch-all/{identificationBadgeId}

Tag: Badge Management
Summary: Get all assigned financial badge & identification badge & information badge & Token List

Path Parameters

Parameter Type Required Description
identificationBadgeId string Yes

Response Codes

Code Description
200

GET /tenant/badge/{badgeId}

Tag: Badge Management
Summary: fetch badges details by badgeId

Path Parameters

Parameter Type Required Description
badgeId string Yes badge Id

Response Codes

Code Description
200 Success response
400 Bad request response if badge detail update get failed

200 — Success response

{
  "data": [
    {
      "badgeId": "2cbfdc48-072c-40e5-8976-7ade3586faf6",
      "badgeName": "Qamar Khan",
      "badgeType": "IDENTIFICATION",
      "badgeDescription": "bronze identification badge",
      "userGroup": "WALLET_USER",
      "badgeSymbolRef": "https://ulcheckpointstaging.blob.core.windows.net/staging-blob-container/Sheetal%20Kumar",
      "createdBy": "dff33fea-b456-4cfa-b2a1-0cbf9071aefe",
      "storageProvider": "abc",
      "createdAt": "2022-12-07T00:00:00.0000000+00:00",
      "updatedAt": "2022-12-07T00:00:00.0000000+00:00",
      "financial_badge_token": [
        {
          "financialBadgeId": "2cbfdc48-072c-40e5-8976-7ade3586faf6",
          "tokenSymbol": "USBC",
          "createdAt": "2022-12-07T00:00:00.0000000+00:00",
          "updatedAt": "2022-12-07T00:00:00.0000000+00:00"
        }
      ],
      "badge_rules": [
        {
          "ruleId": "2cbfdc48-072c-40e5-8976-7ade3586faf6",
          "badgeId": "2cbfdc48-072c-40e5-8976-7ade3586faf6",
          "tenantId": "2cbfdc48-072c-40e5-8976-7ade3586faf6",
          "isActive": "true",
          "startDate": "2023-12-18T18:30:00.0000000+00:00",
          "endDate": "2023-12-18T18:30:00.0000000+00:00",
          "ruleGroup": "wallet-user",
          "ruleVersion": "1",
          "isDefaultRule": "false",
          "createdBy": "dff33fea-b456-4cfa-b2a1-0cbf9071aefe",
          "status": "pending",
          "inactiveDate": "2022-12-07T00:00:00.0000000+00:00",
          "createdAt": "2022-12-07T00:00:00.0000000+00:00",
          "updatedAt": "2022-12-07T00:00:00.0000000+00:00"
        }
      ]
    }
  ],
  "message": "Badge details fetched successfully"
}

400 — Bad request response if badge detail update get failed

{
  "CatchError": {
    "errors": [
      {
        "type": "Identification Badge",
        "message": "Updating identification badge got failed"
      }
    ]
  }
}

POST /digital-wallet/deposit

Tag: Digital Wallet
Summary: Deposit via digital wallet in wallet user account

Request Body

Field Type Required Description
amount number Yes amount
namespace string Yes Fund user namespace e.g. test.jones1.ul
successUrl string No success redirect url e.g. https://example.com/payments/success
failureUrl string No failure redirect url e.g. https://example.com/payments/failure
cancelUrl string No cancel redirect url e.g. https://example.com/payments/cancel
ipAddress string Yes Ip Address e.g. 127.0.0.1
token string Yes Token Symbol e.g. THAI

Example Request

{
  "amount": 0,
  "namespace": "test.jones1.ul",
  "successUrl": "https://example.com/payments/success",
  "failureUrl": "https://example.com/payments/failure",
  "cancelUrl": "https://example.com/payments/cancel",
  "ipAddress": "127.0.0.1",
  "token": "THAI"
}

Response Codes

Code Description
201 Success Response when url is fetched successfully
400 Error response for all possible cases when calling add fund api gets failed.

201 — Success Response when url is fetched successfully

{
  "data": {
    "url": "https://www.sandbox.paypal.com/checkoutnow?token=6KY73853N7081953X",
    "fiatTransactionId": "dca665ae-ffae-4249-9b5b-31439d470258",
    "fiatStatus": "PENDING",
    "namespace": "digit.sheetalku55.ul",
    "amount": 87,
    "fiatTransactionHistory": {
      "fiatTxnHistoryId": "be02917c-c515-4579-9e99-a159f81bb333",
      "status": "PENDING",
      "description": "Digital wallet transaction status is initiated, default status is pending.",
      "createdAt": "2024-07-19T07:48:20.0000000+00:00"
    }
  }
}

400 — Error response for all possible cases when calling add fund api gets failed.

{
  "errors": [
    {
      "type": "Add Fund",
      "message": "please enter namespace of user"
    },
    {
      "type": "Add Fund ",
      "message": "no payment provider detail found"
    },
    {
      "type": "Add Fund",
      "message": "Something went wrong, please try again"
    }
  ]
}

POST /offchainTransaction/transfer-method

Tag: Off Chain Transactions
Summary: create a transfer for tenant or customer

Request Body

Field Type Required Description
namespace string Yes Transfer method identity owner
blockchainAddress string Yes Blockchain Address
type string Yes Transfer method type One of: card, ach e.g. ['card', 'ach']
bankName string Yes bank Name of User e.g. Royal bank
bankAccountName string Yes bank Account Name of User e.g. foobar
bankAccountNumber string Yes bank Account Number of User e.g. GB94BARC10201530093459
routingNumber string Yes routingNumber e.g. 011401533
accountType string Yes Account type checking | saving e.g. checking

Example Request

{
  "namespace": "string",
  "blockchainAddress": "string",
  "type": [
    "card",
    "ach"
  ],
  "bankName": "Royal bank",
  "bankAccountName": "foobar",
  "bankAccountNumber": "GB94BARC10201530093459",
  "routingNumber": "011401533",
  "accountType": "checking"
}

Response Codes

Code Description
400 Bad request response if transfer methods fetching get failed

400 — Bad request response if transfer methods fetching get failed

{
  "errors": [
    {
      "type": "catch",
      "message": "shows the error message while API failed in execution"
    },
    {
      "type": "Transfer Method",
      "message": "Please provide either namespace or blockchain address"
    },
    {
      "type": "Transfer Method",
      "message": "Tenant Id is missing in Headers"
    },
    {
      "message": "Please provide valid namespace",
      "type": "No data found"
    },
    {
      "type": "Transfer Method",
      "message": "Couldn't allow the transaction, customer doesn't belong to Tenant"
    },
    {
      "type": "Transfer Method",
      "message": "isTenantAuthorized?.message"
    },
    {
      "message": "Please provide valid namespace",
      "type": "No data found"
    },
    {
      "data": [],
      "message": "No Transfer Method Available For : namespace"
    },
    {
      "type": "Transfer Method",
      "message": "Couldn't allow the transaction, customer doesn't belong to Tenant"
    },
    {
      "type": "Transfer Method",
      "message": "isTenantAuthorized?.message"
    },
    {
      "message": "Please provide valid namespace",
      "type": "No data found"
    },
    {
      "message": "Failed to fetch the transfer method",
      "type": "catch"
    }
  ]
}

POST /tenant/customer/update

Tag: Tenant Customers
Summary: update tenant customer | Modifier - Gurumoorthy

Request Body

Field Type Required Description
identificationBadgeId string Yes identification badge id
customerAccountId string Yes customer account id of customer e.g. cbf2f17a-d0d1-42da-a6cc-cb28f99484ea
firstName string No tenant customer first name e.g. Jone
middleName string No tenant customer middle name
lastName string No tenant customer last name e.g. Doe
fullName string No tenant customer Full name e.g. Jone Doe
address object Yes
additionalAddress object No
maritalStatus string No marital status One of: MARRIED, UNMARRIED e.g. ['MARRIED', 'UNMARRIED']
email string Yes tenant email e.g. lorem@mygmail.com
gender string No please give every letter in CAPS One of: male, female, others, unknown e.g. unknown
phoneNumber string Yes phone number of tenant customer e.g. +91123456789
nationality string No Nationality of user
ip_address string Yes ip address
ssn string No ssn details
lat_long object No
selfieContent string Yes selfie of user
additionalLatLong object No
metroLocationDetails object No
geoLocationDetails object No
metroAreaDetails object No
countryDetails object No
tax object No
tin string No Tin Id
stateLicenseId string No state license id
governmentDocuments array[string] No
proofOfAddress array[object] No
verifiedName string No GID Name
verifiedDOB string No GID DOB e.g. 2012-12-12
verifiedPhoto string No GID Photo
verifiedIDNumber string No GID ID Number
verifiedCountry string No GID Country
verifiedState string No GID State
verifiedIDIssueDate string No GID Issue Date e.g. 2012-12-12
verifiedIDExpirationDate string No GID Expiration Date e.g. 2012-12-12
verifiedAddress object No
verifiedGender string No GID Gender
reRunComplianceCheck boolean No Re - Run Compliance Check
bankAccount boolean No bank account e.g. false
bankAccountDetails object Yes
plaidDetails object Yes

Example Request

{
  "identificationBadgeId": "string",
  "customerAccountId": "cbf2f17a-d0d1-42da-a6cc-cb28f99484ea",
  "firstName": "Jone",
  "middleName": "string",
  "lastName": "Doe",
  "fullName": "Jone Doe",
  "address": {
    "city": "Lorem",
    "state": "KY",
    "address1": "address1 ",
    "country": "BO",
    "postalCode": "Lorem",
    "isoCountryCode": "US"
  },
  "additionalAddress": {
    "fullName": "United States of America",
    "nameISO3": "USA"
  },
  "maritalStatus": [
    "MARRIED",
    "UNMARRIED"
  ],
  "email": "lorem@mygmail.com",
  "gender": "unknown",
  "phoneNumber": "+91123456789",
  "nationality": "string",
  "ip_address": "string",
  "ssn": "string",
  "lat_long": {
    "lat_long_data": "Lorem",
    "lat_long_country": "US",
    "lat_long_city": "address1 "
  },
  "selfieContent": "string",
  "additionalLatLong": {
    "lat": "37.8888888",
    "long": "-122.1777777"
  },
  "metroLocationDetails": {
    "shortName": "San Francisco",
    "fullName": "San Francisco, California",
    "code": "USA-SFO"
  },
  "geoLocationDetails": {
    "declaredAddress": "San Francisco",
    "phoneNumber": "+91-9876676556",
    "iPAddress": "127.0.0.1"
  },
  "metroAreaDetails": {
    "deviceData": "example",
    "declaredAddress": "San Francisco, California",
    "phoneNumber": "+91-987765566",
    "iPAddress": "127.0.0.1"
  },
  "countryDetails": {
    "deviceData": "example",
    "declaredAddress": "San Francisco, California",
    "phoneNumber": "+91-9876665654",
    "iPAddress": "127.0.0.1"
  },
  "tax": {
    "country": "BO",
    "idNumber": "134567890",
    "state": "US"
  },
  "tin": "string",
  "stateLicenseId": "string",
  "governmentDocuments": [
    {
      "description": "national id card of user",
      "fileName": "idCard.png",
      "side": "front",
      "type": "DriversLicense",
      "content": "string",
      "number": "123455",
      "issuedCountry": "INDIA",
      "expired": false,
      "validFromDate": "2012-12-12",
      "validTillDate": "2012-02-02"
    },
    {
      "description": "national id card of user",
      "fileName": "idCard.png",
      "side": "back",
      "type": "DriversLicense",
      "content": "string",
      "number": "123455",
      "issuedCountry": "INDIA",
      "expired": false,
      "validFromDate": "2012-12-12",
      "validTillDate": "2012-02-02"
    }
  ],
  "proofOfAddress": [
    {
      "description": "credit card statement for Sep2024",
      "fileName": "cc1.png",
      "side": "front",
      "type": "front",
      "content": "string",
      "number": "123455",
      "issuedCountry": "INDIA",
      "expired": false,
      "validFromDate": "2012-12-12",
      "validTillDate": "2012-02-02"
    }
  ],
  "verifiedName": "string",
  "verifiedDOB": "2012-12-12",
  "verifiedPhoto": "string",
  "verifiedIDNumber": "string",
  "verifiedCountry": "string",
  "verifiedState": "string",
  "verifiedIDIssueDate": "2012-12-12",
  "verifiedIDExpirationDate": "2012-12-12",
  "verifiedAddress": {
    "fullAddress": "Lorem Ipsum 30, 13612 Tallinn, Estonia"
  },
  "verifiedGender": "string",
  "reRunComplianceCheck": true,
  "bankAccount": "false",
  "bankAccountDetails": {
    "bankLegalName": "US Bank",
    "bankAccountHolderName": "John Doe",
    "bankAccountType": "Savings",
    "bankAccountNumber": "Ul22440412",
    "bankAccountHolderPhoneNumber": "+917347634906",
    "bankAccountHolderEmail": "unknown@gmail.com",
    "bankAccountHolderAddress": "Lorem Ipsum 30, 13612 Tallinn, Estonia"
  },
  "plaidDetails": {
    "plaidToken": "token",
    "plaidConsentTimestamp": "2024-09-25T10:51:39.1788210+00:00"
  }
}

Response Codes

Code Description
202 Success response
400 Error response

202 — Success response

{
  "type": "Success",
  "message": "Customer updated to silver Successfully"
}

400 — Error response

{
  "errors": [
    {
      "type": "Customer",
      "message": "There is no account for the given customer Id"
    },
    {
      "type": "Upgrade",
      "message": "Customer cannot able to upgrade while ONBOARDING status is PENDING"
    },
    {
      "type": "Upgrade",
      "message": "Customer cannot able to upgrade while ONBOARDING status is REJECTED"
    },
    {
      "type": "Documents",
      "message": "There are no sufficient documents"
    },
    {
      "type": "Finclusive",
      "message": "messages"
    },
    {
      "type": "Rule failed",
      "message": "ruleCheck.errors"
    },
    {
      "type": "Upgrade customer",
      "message": "Customer is already upgraded to silver"
    },
    {
      "type": "catch",
      "message": "err[1]"
    },
    {
      "type": "catch",
      "message": "error"
    }
  ]
}

PUT /transaction/redeem/fiat-transfer/{transactionHash}

Tag: Redeem
Summary: Updates fiat transaction details for the redeem transactions

Request Body

Field Type Required Description
referenceId string Yes A unique identifier used to track the transaction journey for the initiator. e.g. 12345_abcd
fiatAmount number Yes fiat Amount
tokenSymbol string Yes Representing the token that corresponds to the initiated fiat redeem request e.g. USBC
fiatSymbol string Yes Representing the fiat currency for which the redeem request was initiated e.g. USD
type string Yes Representing the type for which the redeem request was initiated e.g. BANK-BOOK

Example Request

{
  "referenceId": "12345_abcd",
  "fiatAmount": 0,
  "tokenSymbol": "USBC",
  "fiatSymbol": "USD",
  "type": "BANK-BOOK"
}

Path Parameters

Parameter Type Required Description
transactionHash string Yes

Response Codes

Code Description
200 Success Response
400 Error response

200 — Success Response

{
  "data": {
    "transactionId": "5ea3eb51-8a02-415d-bf74-add22ed74803",
    "referenceId": "5",
    "tokenSymbol": "USBC",
    "fiatSymbol": "USD",
    "fiatAmount": 5,
    "tokenAmount": 1,
    "type": "BANK-BOOK"
  },
  "message": "fiat transaction status updated successfully."
}

400 — Error response

{
  "errors": [
    {
      "type": "redeem",
      "message": "please enter correct amount"
    },
    {
      "type": "redeem",
      "message": "token symbol is incorrect"
    },
    {
      "type": "redeem",
      "message": "Something went wrong, please try again"
    }
  ]
}

✏️ Modified Endpoints

GET /consent/consent-message/{tenantId}

Tag: Consent
Summary: get consent message

Updated Query Parameters

subCategory (string)

  • Example updated: Deposits

type (string)

  • Example updated: ACH

Response Examples

Code Description
200 Get consent message
400 Error response when consent-message api gets failed.
404 No data response if there is no details for the given vendor

200 — Get consent message

{
  "data": {
    "vendorName": "string",
    "currentActiveVersion": "string",
    "consentMessage": "string",
    "dssId": "string"
  },
  "message": "Vendor consent details fetched successfully"
}

400 — Error response when consent-message api gets failed.

{
  "errors": {
    "type": "catch",
    "message": "Something went wrong, please try again"
  }
}

404 — No data response if there is no details for the given vendor

{
  "type": "Consent",
  "message": "No data found"
}

GET /consent/consent-status

Tag: Consent
Summary: check consent status

Updated Query Parameters

subCategory (string)

  • Example updated: Deposits

type (string)

  • Example updated: ACH

Response Examples

Code Description
200 Check consent status
400 Error response when consent-status api gets failed.
404 will give you the error response when no consent is present for the customer

200 — Check consent status

{
  "data": {
    "latestConsentVersion": "string"
  },
  "message": [
    "Consent is accepted",
    "Consent is not valid. Please accept the consent"
  ]
}

400 — Error response when consent-status api gets failed.

{
  "errors": {
    "type": "catch",
    "message": "Something went wrong, please try again"
  }
}

404 — will give you the error response when no consent is present for the customer

{
  "errors": {
    "type": "No data found",
    "message": "No consent is available, please accept the consent"
  }
}

GET /consent/fetch-tnc

Tag: Consent
Summary: Get latest active version of Terms & Condition or Privacy Policy

Updated Query Parameters

type (string)

  • Example updated: PRIVACY_POLICY / TERMS_CONDITIONS

Response Examples

Code Description
200 Fetch the latest version of Terms & Condition or Privacy Policy by Id
400 Error response while fetching the Terms & Condition or Privacy Policy failed
401 Only the universal leger can able to execute the operations

200 — Fetch the latest version of Terms & Condition or Privacy Policy by Id

{
  "message": " PRIVACY_POLICY / TERMS_CONDITIONS html content fetched successfully",
  "content": "string"
}

400 — Error response while fetching the Terms & Condition or Privacy Policy failed

{
  "errors": [
    {
      "type": "catch",
      "message": "error[1]"
    },
    {
      "message": "err.message",
      "type": "catch"
    }
  ]
}

401 — Only the universal leger can able to execute the operations

{
  "errors": [
    {
      "type": "Not Authorized",
      "message": "This tenant has no access / unauthorized."
    }
  ]
}

GET /transactions/identifier/{identifier}/type/{type}/history

Tag: chaincore
Summary: API endpoint to fetch the on chain or off chain transactions history

Added Query Params

Parameter Type Description
memo string search the memo field for on-chain transfer

Deprecated Query Params

None

Response Examples

Code Description
200 Fetch on chain or off chain transactions history
400 Error : 400 response

200 — Fetch on chain or off chain transactions history

{
  "data": [
    {
      "trxId": "0xca6ede3c859f76289f2da6cdf5774645eb155795b685c20b28ee9a4e74445d82",
      "blockHash": "0xc24cf427119c9d125490782468368e6c06c47eec842f904b2fa0baaf27c754c5",
      "blockNumber": "362839",
      "amount": "2000000000000000000",
      "paymentType": "credit",
      "from": "itech.sheetalus.ul",
      "to": "itech.punitus.ul",
      "status": "Completed",
      "timestamp": "1672925586",
      "isError": "0",
      "revertReason": null,
      "navigationURL": "https://rpc.tst.ent.universalledger.publicmint.io:8545/tx/0xca6ede3c859f76289f2da6cdf5774645eb155795b685c20b28ee9a4e74445d82/internal-transactions"
    },
    {
      "trxId": "0xd55658107bf03b592064204f90457fd61ad0109f9f09e43eeb4ce003d351288b",
      "blockHash": "0x88555a433ff5891771daa097f5824cd54ae44e7531f60bb2cd27c2e05bf34a07",
      "blockNumber": "362830",
      "amount": "1000000000000000000",
      "paymentType": "credit",
      "from": "itech.sheetalus.ul",
      "to": "itech.punitus.ul",
      "status": "Completed",
      "timestamp": "1672925550",
      "isError": "0",
      "revertReason": null,
      "navigationURL": "https://rpc.tst.ent.universalledger.publicmint.io:8545/tx/0xd55658107bf03b592064204f90457fd61ad0109f9f09e43eeb4ce003d351288b/internal-transactions"
    },
    {
      "trxId": "0xc2c415def09cb7bbaa9b8d419f917bb7e7e20d345447dadeac04a0a40c730269",
      "blockHash": "0x74f1beb868586e1047b1fc72044ed31f0490261875cefa4004278704f57c09e8",
      "blockNumber": "362823",
      "amount": "500000000000000000000",
      "paymentType": "credit",
      "from": "itech.sheetalus.ul",
      "to": "itech.punitus.ul",
      "status": "Completed",
      "timestamp": "1672925522",
      "isError": "0",
      "revertReason": null,
      "navigationURL": "https://rpc.tst.ent.universalledger.publicmint.io:8545/tx/0xc2c415def09cb7bbaa9b8d419f917bb7e7e20d345447dadeac04a0a40c730269/internal-transactions"
    }
  ]
}

400 — Error : 400 response

{
  "errors": [
    {
      "type": "Transaction error",
      "error": "No address found for namespace john.ul"
    },
    {
      "type": "Transaction error",
      "error": "Identifier does not belong to tenant_id"
    },
    {
      "type": "filterError",
      "message": "Start date can not be greater than the End date"
    },
    {
      "type": "filterError",
      "message": "type can only be on-chain || off-chain"
    },
    {
      "type": "filterError",
      "message": "Error in fetchOnChainTransactionHistory: ${error.message}"
    },
    {
      "type": "filterError",
      "message": "Error in fetchOffChainTransactionHistory: ${error.message}"
    }
  ]
}

POST /tenant/business-user

Tag: Business User
Summary: Onboard business user

Added Fields

+ badgeId                                  string  # Identification badge Id with business user group

Deprecated Fields

None

Current Request Example

{
  "businessUserLegalName": "Jone Doe",
  "domain": "jonedoe",
  "accountAddress": "0x5179ba651a8ab0d2da5dc3e54ee6c8aa73272f5eac1",
  "businessUserName": "Jone Doe",
  "customNamespace": "jonedoebusiness",
  "provider": "ens",
  "businessUserAddress": {
    "address1": "Mr John Smith. 132, 40ft Street, Kingston",
    "city": "San Francisco",
    "state": "CA",
    "isoCountryCode": "US",
    "postalCode": "90213"
  },
  "businessEntityName": "Not Applicable",
  "incorporationDocs": {
    "documentType": "8",
    "fileName": "filename.png",
    "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
    "countryCode": "US"
  },
  "jurisdictionDocs": {
    "documentType": "8",
    "fileName": "filename.png",
    "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
    "countryCode": "US"
  },
  "otherDocs": [
    {
      "documentType": "8",
      "fileName": "filename.png",
      "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
      "countryCode": "US"
    }
  ],
  "entityBeneficialOwners": [
    {
      "ownershipPercentage": 20,
      "ownershipType": 1,
      "entityBeneficialOwners": [
        {}
      ],
      "individualBeneficialOwners": [
        {
          "ownershipPercentage": 20,
          "ownershipType": 1,
          "title": "<string>",
          "identification": {
            "documentType": "8",
            "fileName": "filename.png",
            "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
            "countryCode": "US"
          },
          "isControlPerson": "<boolean>",
          "otherDocs": {
            "documentType": "8",
            "fileName": "filename.png",
            "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
            "countryCode": "US"
          },
          "dob": "<string>",
          "email": "<string>",
          "firstName": "<string>",
          "lastName": "<string>",
          "phoneNumber": "9822222",
          "phoneType": "<string>",
          "taxIdNumber": "122-22-2332",
          "taxCountry": "US",
          "taxState": "California",
          "address": {
            "address1": "Lorem Ipsum is simply dummy text",
            "city": "Lorem",
            "state": "CA",
            "isoCountryCode": "US",
            "postalCode": "90213"
          },
          "bankVerificationNumber": "<string>",
          "proofOfAddress": {
            "documentType": "8",
            "fileName": "filename.png",
            "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
            "countryCode": "US"
          }
        }
      ],
      "controlPersons": [
        {
          "title": "supervisor",
          "identification": {
            "documentType": "8",
            "fileName": "filename.png",
            "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
            "countryCode": "US"
          },
          "documents": [
            {
              "documentType": "8",
              "fileName": "filename.png",
              "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
              "countryCode": "US"
            }
          ],
          "dateOfBirth": "2000-12-01",
          "emailAddress": "test@test.com",
          "firstName": "First name",
          "lastName": "Last name",
          "phoneNumber": "9100000000",
          "phoneNumberType": "0",
          "taxIdNumber": "122-22-2332",
          "address": {
            "address1": "Lorem Ipsum is simply dummy text",
            "city": "Lorem",
            "state": "CA",
            "isoCountryCode": "US",
            "postalCode": "90213"
          },
          "bvn": "bn01910190",
          "customAttributes": [
            {
              "name": "name",
              "value": "value"
            }
          ],
          "proofOfAddress": {
            "documentType": "8",
            "fileName": "filename.png",
            "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
            "countryCode": "US"
          }
        }
      ],
      "incorporationDocs": {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      },
      "jurisdictionDocs": {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      },
      "legalName": "<string>",
      "taxIdNumber": "12-3123123",
      "taxCountry": "US",
      "taxState": "California",
      "phoneNumber": "9800000",
      "address": {
        "address1": "Lorem Ipsum is simply dummy text",
        "city": "Lorem",
        "state": "CA",
        "isoCountryCode": "US",
        "postalCode": "90213"
      },
      "bvn": "<string>",
      "proofOfAddress": {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      }
    }
  ],
  "individualBeneficialOwners": [
    {
      "ownershipPercentage": 20,
      "ownershipType": 1,
      "title": "<string>",
      "identification": {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      },
      "isControlPerson": "<boolean>",
      "otherDocs": {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      },
      "dob": "<string>",
      "email": "<string>",
      "firstName": "<string>",
      "lastName": "<string>",
      "phoneNumber": "9822222",
      "phoneType": "<string>",
      "taxIdNumber": "122-22-2332",
      "taxCountry": "US",
      "taxState": "California",
      "address": {
        "address1": "Lorem Ipsum is simply dummy text",
        "city": "Lorem",
        "state": "CA",
        "isoCountryCode": "US",
        "postalCode": "90213"
      },
      "bankVerificationNumber": "<string>",
      "proofOfAddress": {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      }
    }
  ],
  "memoFields": {
    "name": "<string>",
    "value": "<string>"
  },
  "bankVerificationNumber": "bnk009198",
  "businessUserEmail": "lorem@mygmail.com",
  "taxIdNumber": "122-22-2332",
  "phoneNumber": "123456789",
  "controlPersons": {
    "title": "supervisor",
    "identification": {
      "documentType": "8",
      "fileName": "filename.png",
      "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
      "countryCode": "US"
    },
    "documents": [
      {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      }
    ],
    "dateOfBirth": "2000-12-01",
    "emailAddress": "test@test.com",
    "firstName": "First name",
    "lastName": "Last name",
    "phoneNumber": "9100000000",
    "phoneNumberType": "0",
    "taxIdNumber": "122-22-2332",
    "gender": "Male",
    "address": {
      "address1": "Mr John Smith. 132, 40ft Street, Kingston",
      "city": "San Francisco",
      "state": "CA",
      "isoCountryCode": "US",
      "postalCode": "90213"
    },
    "bvn": "bn01910199",
    "customAttributes": [
      {
        "name": "name",
        "value": "value"
      }
    ],
    "proofOfAddress": {
      "documentType": "8",
      "fileName": "filename.png",
      "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
      "countryCode": "US"
    },
    "tax": {
      "idNumber": "134567890",
      "country": "US",
      "state": "NY"
    }
  },
  "registeredOfficeAddress": {
    "address1": "Lorem Ipsum is simply dummy text",
    "address2": "Lorem Ipsum is simply dummy text",
    "city": "Lorem",
    "state": "CA",
    "isoCountryCode": "US",
    "postalCode": "90213"
  },
  "proofOfAddress": {
    "documentType": "8",
    "fileName": "filename.png",
    "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
    "countryCode": "US"
  },
  "signatories": [
    {
      "title": "supervisor",
      "identification": {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      },
      "documents": [
        {
          "documentType": "8",
          "fileName": "filename.png",
          "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
          "countryCode": "US"
        }
      ],
      "dateOfBirth": "2000-12-01",
      "emailAddress": "test@test.com",
      "firstName": "First name",
      "lastName": "Last name",
      "phoneNumber": "9100000000",
      "phoneNumberType": "0",
      "taxIdNumber": "122-22-2332",
      "gender": "Male",
      "address": {
        "address1": "Mr John Smith. 132, 40ft Street, Kingston",
        "city": "San Francisco",
        "state": "CA",
        "isoCountryCode": "US",
        "postalCode": "90213"
      },
      "bvn": "bn01910199",
      "customAttributes": [
        {
          "name": "name",
          "value": "value"
        }
      ],
      "proofOfAddress": {
        "documentType": "8",
        "fileName": "filename.png",
        "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
        "countryCode": "US"
      },
      "tax": {
        "idNumber": "134567890",
        "country": "US",
        "state": "NY"
      }
    }
  ],
  "governingDocuments": [
    {
      "documentType": "8",
      "fileName": "filename.png",
      "content": "base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAAEDCAYAAAAFhGKSAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA",
      "countryCode": "US"
    }
  ],
  "clientToken": "CLT",
  "badgeId": "2852ea54-b77d-4853-96bb-e9e484765b35"
}

Response Examples

Code Description
201 Created Response after business user onboard
400 Bad request response if business user onboarding get failed

201 — Created Response after business user onboard

{
  "data": {
    "domain": "jonedoe",
    "business_user_name": "jone doe",
    "business_user_metadata": {
      "email": "lorem@mygmail.com",
      "phone": "9540217306",
      "legal_name": "jone doe",
      "tax_id": "12345",
      "businessUserId": "57b99458-f481-4822-b8b3-516d6bd611ca",
      "businessUserMetadataId": "57b99458-f481-4822-b8b3-516d6bd611ca",
      "business_entity_name": "Not Applicable",
      "company_address": {
        "address1": "Mr John Smith. 132, 40ft Street, Kingston",
        "city": "San Francisco",
        "state": "CA",
        "isoCountryCode": "US",
        "postalCode": "90213"
      }
    },
    "is_active": true,
    "created_at": "2022-11-11T09:47:44.0070000+00:00",
    "start_date": "2022-11-11T09:47:44.0070000+00:00",
    "end_date": "2022-11-11T09:47:44.0070000+00:00",
    "tenant_id": "57b99458-f481-4822-b8b3-516d6bd611ca"
  },
  "message": "Tenant onboarded successfully"
}

400 — Bad request response if business user onboarding get failed

[
  {
    "type": [
      {
        "type": "Duplicate",
        "message": "Business domain already exists"
      },
      {
        "message": "Business user is already registered with provided email id",
        "type": "Duplicate"
      },
      {
        "message": "Business's control person is already registered with provided email id",
        "type": "Duplicate"
      },
      {
        "type": "onboard",
        "message": "error"
      },
      {
        "type": "onboard",
        "message": "Business name already exists"
      },
      {
        "type": "onboard",
        "message": "Not able to create account"
      },
      {
        "type": "onboard/Identity",
        "message": "publicMint.errors[0].message"
      },
      {
        "type": "onboard",
        "message": "Not able to onboard business"
      }
    ],
    "message": "some error message"
  }
]

POST /tenant/customer

Tag: Tenant Customers
Summary: onboard tenant customer

Added Fields

+ plaidDetails                             object
+ proofOfAddress                           array[object]

Deprecated Fields

- bankAccount                              boolean  # bank account

Updated Request Body Fields

phoneNumber (string)

  • Example updated: +91123456789

Current Request Example

{
  "identificationBadgeId": "string",
  "firstName": "Jone",
  "middleName": "string",
  "lastName": "Doe",
  "fullName": "Jone Doe",
  "accountAddress": "string",
  "customerMetaData": {},
  "tenantId": "e1e9adb4-d3bd-4ba5-98b8-011c03a9d2b1",
  "customNamespace": "jonedoe",
  "provider": "ens",
  "ulNamespace": "digit.sam.ul",
  "maritalStatus": [
    "married",
    "unmarried"
  ],
  "dateOfBirth": "1997-02-02",
  "email": "lorem@mygmail.com",
  "gender": "unknown",
  "phoneNumber": "+91123456789",
  "nationality": "string",
  "ip_address": "string",
  "ssn": "string",
  "stateLicenseId": "string",
  "tin": "string",
  "address": {
    "city": "Lorem",
    "state": "KY",
    "address1": "address1 ",
    "country": "BO",
    "postalCode": "Lorem",
    "isoCountryCode": "US"
  },
  "lat_long": {
    "lat_long_data": "Lorem",
    "lat_long_country": "US",
    "lat_long_city": "address1 "
  },
  "tax": {
    "country": "BO",
    "idNumber": "122-22-2332",
    "state": "string"
  },
  "governmentDocuments": [
    {
      "description": "national id card of user",
      "fileName": "idCard.png",
      "side": "front",
      "type": "DriversLicense",
      "content": "string",
      "number": "123455",
      "issuedCountry": "INDIA",
      "expired": false,
      "validFromDate": "2012-12-12",
      "validTillDate": "2012-02-02"
    }
  ],
  "proofOfAddress": [
    {
      "description": "credit card statement for Sep2024",
      "fileName": "cc1.png",
      "side": "front",
      "type": "front",
      "content": "string",
      "number": "123455",
      "issuedCountry": "INDIA",
      "expired": false,
      "validFromDate": "2012-12-12",
      "validTillDate": "2012-02-02"
    }
  ],
  "passport": {
    "description": "national id card of user",
    "fileName": "idCard.png",
    "side": "front",
    "type": "DriversLicense",
    "content": "string",
    "number": "123455",
    "issuedCountry": "INDIA",
    "expired": false,
    "validFromDate": "2012-12-12",
    "validTillDate": "2012-02-02"
  },
  "others": {
    "stateIdLicense": "321",
    "proofOfAddress": "321",
    "alienIdCard": "321"
  },
  "selfieContent": "string",
  "metroLocationDetails": {
    "shortName": "San Francisco",
    "fullName": "San Francisco, California",
    "code": "USA-SFO"
  },
  "additionalLatLong": {
    "lat": "37.8888888",
    "long": "-122.1777777"
  },
  "additionalAddress": {
    "fullName": "United States of America",
    "nameISO3": "USA"
  },
  "geoLocationDetails": {
    "declaredAddress": "San Francisco",
    "phoneNumber": "+91-9876676556",
    "iPAddress": "127.0.0.1"
  },
  "metroAreaDetails": {
    "deviceData": "example",
    "declaredAddress": "San Francisco, California",
    "phoneNumber": "+91-987765566",
    "iPAddress": "127.0.0.1"
  },
  "countryDetails": {
    "deviceData": "example",
    "declaredAddress": "San Francisco, California",
    "phoneNumber": "+91-9876665654",
    "iPAddress": "127.0.0.1"
  },
  "verifiedName": "string",
  "verifiedDOB": "2012-12-12",
  "verifiedPhoto": "string",
  "verifiedIDNumber": "string",
  "verifiedCountry": "string",
  "verifiedState": "string",
  "verifiedIDIssueDate": "2012-12-12",
  "verifiedIDExpirationDate": "2012-12-12",
  "verifiedAddress": {
    "fullAddress": "Lorem Ipsum 30, 13612 Tallinn, Estonia"
  },
  "verifiedGender": "string",
  "bankAccountDetails": {
    "bankLegalName": "US Bank",
    "bankAccountHolderName": "John Doe",
    "bankAccountType": "Savings",
    "bankAccountNumber": "Ul22440412",
    "bankAccountHolderPhoneNumber": "+917347634906",
    "bankAccountHolderEmail": "unknown@gmail.com",
    "bankAccountHolderAddress": "Lorem Ipsum 30, 13612 Tallinn, Estonia"
  },
  "plaidDetails": {
    "plaidToken": "token",
    "plaidConsentTimestamp": "2024-09-25T10:51:39.1788210+00:00"
  }
}

Response Examples

Code Description
201 Created response after tenant customer successfully onboard
400 Error response after tenant customer onboarding gets failed

201 — Created response after tenant customer successfully onboard

{
  "data": {
    "firstName": "Jone",
    "middleName": "string",
    "lastName": "Doe",
    "accountAddress": "string",
    "tenantId": "e1e9adb4-d3bd-4ba5-98b8-011c03a9d2b1",
    "dateOfBirth": "1997-02-02",
    "email": "lorem@mygmail.com",
    "gender": "male",
    "phoneNumber": "123455656789",
    "address": {
      "city": "Lorem",
      "state": "KY",
      "address1": "address1 ",
      "country": "BO",
      "postalCode": "Lorem",
      "isoCountryCode": "US"
    },
    "tax": {
      "country": "BO",
      "idNumber": "122-22-2332",
      "state": "string"
    },
    "documents": [
      {
        "description": "national id card of user",
        "fileName": "idCard.png",
        "side": "front",
        "type": "DriversLicense",
        "content": "string",
        "number": "123455",
        "issuedCountry": "INDIA",
        "expired": false,
        "validFromDate": "2012-12-12",
        "validTillDate": "2012-02-02"
      }
    ],
    "faceImage": "string",
    "complianceStatus": "PENDING",
    "customerAccountId": "11167c62-b6b4-4031-ac92-6ef56e9648bd",
    "domainNamespace": "allahabad.amitp.ul"
  },
  "message": "Customer's profile submitted for review"
}

400 — Error response after tenant customer onboarding gets failed

{
  "errors": [
    {
      "type": "catch",
      "message": "Please provide valid tenant id"
    },
    {
      "type": "Onboard Customer",
      "message": "Please provide a valid ISO 3166-1 alpha-2 country and state code"
    },
    {
      "type": "Onboard Customer",
      "message": "Custom namespace is taken"
    },
    {
      "type": "Duplicate",
      "message": "Account address already taken"
    },
    {
      "type": "Tenant",
      "message": "Tenant's account has been blocked. You will be not able to onboard any user. Please get in touch with support team"
    },
    {
      "type": "Duplicate",
      "message": "No data found with given tenant Id"
    },
    {
      "type": "Tenant",
      "message": "Tenant onboarding status is isTenantAvailableCheck?.onboardingStatus"
    },
    {
      "type": "onboard",
      "message": "A user is already been registered with provided email id"
    },
    {
      "type": "onboard",
      "message": "Wallet user already exists inside tenant"
    },
    {
      "message": "There are no sufficient documents",
      "type": "Documents"
    },
    {
      "message": "A user is already been registered with provided email id",
      "type": "Duplicate"
    },
    {
      "type": "Finclusive",
      "message": "messages"
    },
    {
      "type": "catch",
      "message": "err[1]"
    },
    {
      "type": "catch",
      "message": "error.message"
    },
    {
      "type": "Identity",
      "message": "error in deleting identity"
    },
    {
      "type": "Rule Error",
      "errors": "axiosResponse.errors"
    }
  ]
}

POST /tenant/customer/add-wallet

Tag: Tenant Customers
Summary: Add wallet to wallet user

Added Fields

+ financialBadgeId                         string  # financial badge to assign on the wallet level
+ tokenSymbol                              string  # token symbol to assign financial badge

Deprecated Fields

None

Current Request Example

{
  "customerAccountId": "e1e9adb4-d3bd-4ba5-98b8-011c03a9d2b1",
  "tenantId": "e1e9adb4-d3bd-4ba5-98b8-011c03a9d2b1",
  "customNamespace": "jonedoe",
  "provider": "ens",
  "accountAddress": "walletUserAccountAddress",
  "financialBadgeId": "d573926e-358f-482d-8375-6842477ce736",
  "tokenSymbol": "USBC"
}

Response Examples

Code Description
201 Success Response when wallet is added successfully
400 Error response for all possible cases when adding wallet api gets failed.

201 — Success Response when wallet is added successfully

{
  "data": {
    "customerAccountId": "1a310d45-0f5f-4f44-bc1d-6ddfd9547787e",
    "namespace": "tenantDomain.sheetalku1.ul"
  },
  "message": "wallet added successfully"
}

400 — Error response for all possible cases when adding wallet api gets failed.

{
  "errors": [
    {
      "type": "Add Wallet ",
      "message": "Multi wallet feature has been disabled by tenant name"
    },
    {
      "type": "Add Wallet",
      "message": "Not able to fetch basic details of wallet user"
    },
    {
      "type": "Add Wallet",
      "message": "Wallet user details not found"
    },
    {
      "type": "Add Wallet",
      "message": "Please use unique account address"
    },
    {
      "type": "Add Wallet",
      "message": "Custom namespace is already taken"
    },
    {
      "type": "Add Wallet",
      "message": "Something went wrong, please try again"
    }
  ]
}

🚫 Deprecated Endpoints

Deprecated in this version

  • POST /tenant/customer/upgrade — update tenant customer | Modifier - Gurumoorthy