This document outlines the required steps to integrate with Zodia using our API.
Document created on April 20th, 2021. Last updated on September 9th, 2024.
Contact: customerservice@zodia.io
pip install cryptography
pip install requests
Your company must be onboarded before you can invoking the APIs.
To complete this setup, generate a key pair for your company. We will refer to these keys as:
These keys must be RSA keys (encoded in base 64) with a minimum size of 2048 bits.
Once generated, share the public key company_pub_key with customerservice@zodia.io
WARNING: You must never share the private key company_pri_key with anyone including Zodia staff. This private key must be stored securely
Below is an example of how to generate a key pair for the company named ZTEST:
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
def generate_rsa_keypair(company):
rsa_private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048, backend=default_backend())
private_key_pem = rsa_private_key.private_bytes(serialization.Encoding.PEM,
serialization.PrivateFormat.PKCS8,
serialization.NoEncryption())
with open(os.path.join("keys", company + ".private.pem"), "wb") as private_key_out:
private_key_out.write(private_key_pem)
rsa_public_key = rsa_private_key.public_key()
public_key_pem = rsa_public_key.public_bytes(serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo)
with open(os.path.join("keys", company + ".public.pem"), "wb") as public_key_out:
public_key_out.write(public_key_pem)
if __name__ == '__main__':
generate_rsa_keypair("ZTEST")
# Private key "company_pri_key" can be found in the file "ZTEST.private.pem"
# Public key "company_pub_key" can be found in the file "ZTEST.public.pem"
At least two API users must be added to your company's account.
Important note
If the company has already been set up as explained above in the document, then Zodia customer service cannot create any API accounts on the created company. Only your company user maker will be able to create these two required API accounts.
However, if the company has not already been set up on Zodia UI, then Zodia onboarding team can create the company with the two required API accounts. Other user accounts can also be created by Zodia team at the time of the new company creation.
By convention, the API users should have an id starting with api-. Examples: api-maker and api-checker
To onboard these users, you must generate a key pair for each API user. We will refer to these keys as:
Each API user is composed of three pieces of information:
Share these 2 pieces of information with customerservice@zodia.io
Applying the two "How-to" steps below results in the following example:
WARNING: You must never share the private key api_user_pri_key with anyone including Zodia staff. This private key must be stored securely
Please note that the Elliptic Curve that must be used to generate those keys is SECP256R1
Below is an example of how to generate a key pair for the user whose email is api-maker@zodia.io:
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import ec
def generate_ec_keypair(user):
ec_private_key = ec.generate_private_key(ec.SECP256R1(), default_backend())
private_key_pem = ec_private_key.private_bytes(serialization.Encoding.PEM,
serialization.PrivateFormat.PKCS8,
serialization.NoEncryption())
with open(os.path.join("keys", user + ".private.pem"), "wb") as private_key_out:
private_key_out.write(private_key_pem)
ec_public_key = ec_private_key.public_key()
public_key_pem = ec_public_key.public_bytes(serialization.Encoding.PEM,
serialization.PublicFormat.SubjectPublicKeyInfo)
with open(os.path.join("keys", user + ".public.pem"), "wb") as public_key_out:
public_key_out.write(public_key_pem)
if __name__ == "__main__":
generate_ec_keypair("[email protected]")
# Private key "api_user_pri_key" can be found in the file "[email protected]"
# Private key "api_user_pub_key" can be found in the file "[email protected]"
Alternatively, you can also generate the user keys using below shell commands,
$ openssl ecparam -name prime256v1 -genkey -noout -out ./private-key.pem
$ openssl ec -in ./private-key.pem -pubout -out ./public-key.pem
In order to provide a high-quality service, Zodia's API is rate limited. The default limits are:
Please reach out to Zodia if you wish to adjust the rate limit for given endpoints.
If the rate limit is exceeded, the API will respond with the status code HTTP 429 Too Many Requests
. Please refer to the section Error codes.
The retrieve list APIs respond with total
number of records in the response.
You can use paginationLimit
& paginationOffset
in the request payload to work with pagination.
For example to retrieve the wallets, (2nd Page)
{
"currencies": ["BTC"],
"paginationLimit" : 10,
"paginationOffset" : 1 // 0 - First Page, 1 - Second Page so on...
}
Throughout any request or a transaction life cycle, Zodia produces a variety of status change events such as incoming transfer, outgoing transfer, wallet creation. Zodia can assist you in subscribing to relevant events so that you are informed when you need to take any action on your end.
Zodia currently support two types of subscriptions,
ethereum-testnet-sepolia
and bitcoin-testnet
Zodia's API authentication requires each request to be signed.
These requests must be signed using company_pri_key, the private key of your company.
All REST requests must contain the following headers:
All request bodies should have content type application/json
and be valid JSON.
We mandate that all requests are signed. Concatenate the following values using :
as a separator:
POST
requests only)Note GET
requests will end with a :
, for example
ZTEST:c730a02f-105d-4899-87aa-b1b8280e4a7e:1620141458133:https://dummy.server/v3/api/servicedesk/create:
The content of the header signature
is generated by signing the string above with company_pri_key.
Example of code showing how to sign the request:
import os, base64, time, uuid, requests
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
def sign(data_to_sign, private_key):
data_bytes = str.encode(data_to_sign)
signature = private_key.sign(data_bytes, padding.PKCS1v15(), hashes.SHA256())
return base64.b64encode(signature).decode('UTF-8')
def sign_for_zodia(company_identifier, url, payload):
request_identifier = str(uuid.uuid4())
request_timestamp = str(int(time.time() * 1000))
data_to_sign = ":".join([company_identifier, request_identifier, request_timestamp, url, payload])
print(data_to_sign) # ZTEST:c730a02f-105d-4899-87aa-b1b8280e4a7e:1620141458133:https://dummy.server/v3/api/servicedesk/create:{}
with open(os.path.join("keys", company_identifier + ".private.pem"), "rb") as private_key_in:
rsa_private_key = serialization.load_pem_private_key(private_key_in.read(),
password=None,
backend=default_backend())
signature = sign(data_to_sign, rsa_private_key)
return company_identifier, request_identifier, request_timestamp, signature
if __name__ == "__main__":
full_url = "https://dummy.server/v3/api/servicedesk/create"
payload = json.dumps({})
headers = sign_for_zodia("ZTEST", full_url, "{}")
response = requests.post(full_url, headers={
"company-identifier": headers[0], # ZTEST
"request-identifier": headers[1], # c730a02f-105d-4899-87aa-b1b8280e4a7e
"request-timestamp": headers[2], # 1620141458133
"signature": headers[3] # aZBZNDeDJomgRBZFhV24MbdlyfSiqJuCMgz5mSl+dpxtDDgbadTuin0z920eBD2YFP5g3ccakguQUXPMuLp4Umyet3hGYXb2GiMkKSIA8XocdF8uG2xReSZq+JSbuDSO7yQcxXVK10A6mL2f/zJuTFBRl20jegiHOBcbDlAOUkWS3Vam3KRLA/Nd8ZwOhK6XZbtZWGz0AW9obE7cpEwqUEposucx7J462XAaM9Duh+CF1ALhuo67G0hLYAtwqryRVhUdBvVrqoWgGu3quxfIYgG/8okYv2hHjzBtIfo2VREi4TlgsRXvGPQpSI534S8o9laa5Ddq1f6N2u1sXkE97g==
}, data = payload)
This section describes an end-to-end flow to create a wallet, whitelist a beneficiary, whitelist an address for a beneficiary and instruct a transfer.
The APIs aim to be self service, you can check the list of available products and services to fetch the request payload templates based on your account's permissions.
Here is an example :
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/products'
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data-raw
'{
"products": [
],
"productIds": [
"0x0013"
],
"serviceIds": [
"0x0013-001"
],
"serviceNames": [
],
"requestTypes": [
]
}'
HTTP 200
{
"items": [
{
"product": "CUSTODY",
"productId": "0x0013",
"serviceId": "0x0013-001",
"serviceName": "Custody Wallet Management",
"requestType": "CREATE",
"description": "Custody Wallet",
"template": {
"name": "Wallet_Name",
"currency": "ETH | BTC",
"walletOwnerId": "Wallet_Beneficiary_ID"
}
}
]
}
The template object you see on the response above is what will be requested for any service request creation.
The sample APIs calls below omit authentication information for simplicity, see more about Signing requests.
Create an Ethereum
wallet with name FUND123
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/create'
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data-raw
'{
"serviceId": "0x0013-001",
"payload": {
"name": "FUND123",
"currency": "ETH"
}
}'
HTTP 200
{
"requestId": "SERV-REQ-0RV7UQ2D56",
"pluginDetail": {
"entityId": "ZODCS-NOBENF-E3WB8MB4EI",
"details": [
{
"name": "FUND123",
"currency": "ETH",
"isDeFi": false
}
]
}
}
Use the request ID obtained in the previous request to submit the instruction.
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/submit' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-0RV7UQ2D56"
}'
HTTP 200
Retrieve the HSM instruction to be signed by the maker
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/pending' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-0RV7UQ2D56",
}'
HTTP 200
{
"request": {
...
},
"signature": "$$REPLACE$$"
}
Sign the 'request' element with the maker private key and insert the resulting string in 'signature'. The signed instruction is submitted directly to the HSM.
curl --location 'https://hostname.zodia.io/v3/api/servicedesk/approve' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-0RV7UQ2D56",
"request": {
...
},
"signature": "MEUCIQDqOsThmTIPlSyqPt2bWYC5FsahAxby/wUjOfdOpnATBgIgdszq9Gnbx8SyTYUcSjTW2OPmnB1a7PPxFO1ReKMWFo0="
}'
HTTP 200
curl --location 'https://hostname.zodia.io/v3/api/servicedesk/pending' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-0RV7UQ2D56"
}'
{
"request": {
...,
"type": "Approve|Reject"
},
"signature": "$$REPLACE$$"
}
To approve an instruction set type
to Approve
. To reject an instruction, set type
to Reject
and set a rejectReason
.
curl --location 'https://hostname.zodia.io/v3/api/servicedesk/approve' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-0RV7UQ2D56",
"request": {
...,
"type": "Approve"
},
"signature": "MEUCIQCP9Sqzh0jBj0WW++7oVwQyxpSTPfjhB2G7lNjjvom+LwIgcfU521JS3sUFVRHyUhjQGCgQbkb4P4IP/zzcGOxfUEA="
}'
HTTP 200
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/create'
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data-raw
'{
"serviceId": "0x0007-004",
"payload": {
"entityType": "INDIVIDUAL",
"beneficiaryName": "John Smith",
"registeredAddress": {
"line1": "10 Downing Street",
"city": "London",
"country": "United Kingdom"
},
"operatingAddress": {
"line1": "10 Downing Street",
"city": "London",
"country": "United Kingdom"
}
}
}'
HTTP 200
{
"requestId": "SERV-REQ-Y3S874B6IC",
"pluginDetail": {
"entityId": "BNF-T20046-JQAPQMNOYA",
"details": [
{
"entityType": "INDIVIDUAL",
"legalName": "John Smith",
"registeredAddress": {
"line1": "10 Downing Street",
"city": "London",
"country": "United Kingdom"
},
"operatingAddress": {
"line1": "10 Downing Street",
"city": "London",
"country": "United Kingdom"
}
}
]
}
}
Use the request id obtained in the previous request to submit the instruction
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/submit' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-Y3S874B6IC",
}'
HTTP 200
Retrieve the HSM instruction to be signed by the maker
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/pending' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-Y3S874B6IC",
}'
HTTP 200
{
"request": {
...
},
"signature": "$$REPLACE$$"
}
Sign the 'request' element with the API maker private key, insert the string in 'signature'. The signed instruction is submitted directly to the HSM.
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/approve' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-Y3S874B6IC",
"request": {
...
},
"signature": "MEQCIAkTlKFSm8IDOS7o0eklI7aU9MvmS6vQUM6NElw9R3ebAiAPd8TMNh6g3QtzDYEPOFxa1EYCr3o+a5ypHa8/RLrN2w=="
}'
HTTP 200
NOTE: Authoriser approval is not required when whitelisting beneficiaries
Whitelist an ETH address linked with beneficiary John Smith which will be use for deposit and withdrawal
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/create' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"serviceId": "0x0007-007",
"payload": {
"address": "0x8dC847Af872947Ac18d5d63fA646EB65d4D99560",
"blockchain": "ETH",
"beneficiaryId": "BNF-T20046-WGG997I15N",
"notes": "Fund A",
"hostedAddress": true,
"vaspId": "06ea2d8f-fa02-48f6-87af-c71ea58452as",
"addressPurpose": [
"INCOMING, OUTGOING"
]
}
}'
HTTP 200
{
"requestId": "SERV-REQ-99WPBB0FAG",
"pluginDetail": {
"entityId": "467f0fbf-7cd0-4196-b8be-7a33ac66f4f6",
"details": [
{
"cryptoAddress": "0x8dC847Af872947Ac18d5d63fA646EB65d4D99560",
"currency": "ETH",
"managingVasp": "06ea2d8f-fa02-48f6-87af-c71ea58452as",
"beneficiaryId": "BNF-T20046-WGG997I15N",
"notes": "Fund A",
"addressPurpose": "INCOMING, OUTGOING"
},
{
"beneficiaryId": "BNF-T20046-WGG997I15N",
"entityType": "INDIVIDUAL",
"legalName": "John Smith",
"legalEntityName": "John Smith",
"registeredAddress": {
"line1": "10 Downing Street",
"city": "London",
"country": "United Kingdom"
},
"operatingAddress": {
"line1": "10 Downing Street",
"city": "London",
"country": "United Kingdom"
}
}
]
}
}
Use the request ID obtained in the previous request to submit the instruction.
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/submit' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-99WPBB0FAG"
}'
HTTP 200
Retrieve the HSM instruction to be signed by the maker
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/pending' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-99WPBB0FAG",
}'
HTTP 200
{
"request": {
...
},
"signature": "$$REPLACE$$"
}
Sign the 'request' element with the API maker private key, insert the string in 'signature'. The signed instruction is submitted directly to the HSM.
curl --location 'https://hostname.zodia.io/v3/api/servicedesk/approve' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-99WPBB0FAG",
"request": {
...
},
"signature": "MEUCIHlH4Zs4zPrhofU9+KsLVLEEcfw6ENHgk7OHLRXhKVJmAiEA8TfaVVjc0XCdnGa8TrRtdmkVQWA5WwJCDNq0CWH02mY="
}'
HTTP 200
curl --location 'https://hostname.zodia.io/v3/api/servicedesk/pending' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-99WPBB0FAG"
}'
{
"request": {
...,
"type": "Approve|Reject"
},
"signature": "$$REPLACE$$"
}
To approve an instruction set type
to Approve
. To reject an instruction, set type
to Reject
and set a rejectReason
.
curl --location 'https://hostname.zodia.io/v3/api/servicedesk/approve' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-99WPBB0FAG",
"request": {
...,
"type": "Approve"
},
"signature": "MEYCIQCkuiFDtdtl+cbeMewrGgwRycTNuRHmHVrhzR3MlDqX0AIhALIiT+KoYjxlDKtVpwcvXQbL0MuXE/wAeXl4DIulMp3m"
}'
HTTP 200
We assumed the wallet has been funded prior to initiating the transfer.
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/create'
--header 'Content-Type: application/json' \
--data-raw
'{
"serviceId": "0x0014-007",
"payload": {
"sender": {
"type": "WALLETID",
"value": "ZODCS-NOBENF-E3WB8MB4EI"
},
"destination": {
"type": "BENEFICIARYADDRESSID",
"value": "467f0fbf-7cd0-4196-b8be-7a33ac66f4f6"
},
"amount": "50000",
"subtractFee": false
}
}'
HTTP 200
{
"requestId": "SERV-REQ-A02R2928OC",
"pluginDetail": {
"entityId": "TRO-LUXOR-P01HT6O1UT",
"details": [
{
"sender": {
"type": "WALLETID",
"value": "ZODCS-NOBENF-E3WB8MB4EI"
},
"destination": {
"type": "BENEFICIARYADDRESSID",
"value": "467f0fbf-7cd0-4196-b8be-7a33ac66f4f6"
},
"amount": "50000",
"subtractFee": false
}
]
}
}
Use the request id obtained in the previous request to submit the instruction.
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/submit' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-A02R2928OC"
}'
HTTP 200
Retrieve the HSM instruction to be signed by the maker
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/pending' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-A02R2928OC",
}'
HTTP 200
{
"request": {
...
},
"signature": "$$REPLACE$$"
}
Sign the 'request' element with the API maker private key, insert the string in 'signature'
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/approve'
--header 'Content-Type: application/json' \
--data-raw
{
"requestId": "SERV-REQ-A02R2928OC",
"request": {
...
},
"signature": "MEYCIQDgag6BsAjQoKe7BPObXUsCC09X2gk0yrLYtxp8qg+R9QIhAJOT+fD3MrjmHHOKD1PO9nLcKhnUrQYSx/w022fO1z9p"
}
HTTP 200
curl --location 'https://hostname.zodia.io/v3/api/servicedesk/pending' \
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data '{
"requestId": "SERV-REQ-A02R2928OC"
}'
{
"requestId": "SERV-REQ-A02R2928OC",
"request": {
...,
"type": "Approve|Reject"
},
"signature": "MEQCIA/KgOFOxWQzeTpyZerRjcxucXBgdWBFzBdcczEqurkOAiAwcTIFg2XLgE5pfvV+decUKLEzejk1zYe/DFVxW55pdg=="
}
To approve an instruction set type
to Approve
. To reject an instruction, set type
to Reject
and set a rejectReason
.
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/approve'
--header 'Content-Type: application/json' \
--data-raw
{
"requestId": "SERV-REQ-A02R2928OC",
"request": {
...,
"type": "Approve"
},
"signature": "MEQCID0XsCYDvVpo2eLD88LH4CpygowzUVAQGpkqhjbMZuMNAiB6rypnraKaKwRsarWSKJGYnx31NfrBQGekUj6yc7wfTg=="
}
HTTP 200
To reject any type of instruction, set type
to Reject
and specify a rejectReason
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/approve'
--header 'Content-Type: application/json' \
--data-raw
{
"requestId": "SERV-REQ-A02R2928OC",
"request": {
...,
"type": "Reject",
"rejectReason": "Unknown request"
},
"signature": "MEQCID0XsCYDvVpo2eLD88LH4CpygowzUVAQGpkqhjbMZuMNAiB6rypnraKaKwRsarWSKJGYnx31NfrBQGekUj6yc7wfTg=="
}
HTTP 200
Zodia's API offers a number of error codes to facilitate your usage and troubleshooting.
Zodia uses HTTP response codes to indicate the success or failure of an API request. In general:
200
indicate success4xx
range indicate a failure given the information provided(e.g. a required parameter was omitted, etc...)500
indicate an error with Zodia's serversIn addition to these HTTP response codes, Zodia provides in the response payload:
ER-
that should be shared with Zodia for troubleshootingThe table below describes some errors you may encounter:
HTTP status code | Error code | Error message | Description |
---|---|---|---|
400 | ER-101 | Missing mandatory field: field_name | A mandatory field is missing in the payload received by Zodia |
400 | ER-102 | Entity with id: entity_id does not exist | You are trying to use an entity (company, wallet, transaction, etc…) that does not exist |
400 | ER-103 | Size of the field: field_name must be between min_value and max_value | Length of the value provided does not match the expected size |
400 | ER-104 | Entity with id: entity_id already exists | You are trying to create an entity (company, wallet, transaction, etc…) which already exists |
400 | ER-107 | Field: field_name must not be blank |
|
400 | ER-108 | Field: field_name does not match the expected pattern: regexp_value | You sent a value that does not match the pattern expected by Zodia |
400 | ER-111 | Value of the field: field_name is not a supported cryptocurrency | The cryptocurrency provided is not currently supported by Zodia |
400 | ER-112 | Field: field_name must not be empty | You sent an empty value/list while Zodia is expecting at least one value |
400 | ER-113 | Entity with id: entity_id is deactivated | You are trying to use a deactivated entity |
400 | ER-114 | Field: field_name does not match with user's company | The value you provided for the field (usually "domainId") does not match your company's identifier |
400 | ER-115 | Field: field_name does not match with resource parameter: path_parameter | The value you provided in the payload does not match the path parameter used in the resource |
400 | ER-116 | Value of the field: field_name must contain only digits | You sent a value that is not a numeric value |
400 | ER-117 | Value of the field: field_name must be equal to value | You must send a value strictly equal to the value expected by Zodia |
400 | ER-121 | Field: field_name must be greater than or equal to value | You must send a value greater than or equal to the value expected by Zodia |
400 | ER-122 | Field: field_name must be less than or equal to value | You must send a value lesser than or equal to the value expected by Zodia |
400 | ER-124 | Only max_value minutes of drift are allowed | Zodia allows 5 minute of drift between the signed timestamp provided and the instant that Zodia receives the query |
500 | ER-128 | currency_value is not a known currency | Zodia was not able to verify the provided currency |
500 | ER-200 | Internal Error | Internal service error |
400 | ER-202 | Header: header must not be blank |
|
500 | ER-206 | Unable to fetch data | Zodia was not able to fetch the data requested |
400 | ER-212 | Approval timeout | Transaction approval expires |
400 | ER-214 | Transaction amount greater than available amount or fee amount | The transfer instruction cannot be created as there are not sufficient funds to pay for the amount and/or fee |
400 | ER-234 | Entity with id: value is not ready to be submitted | The id provided not allowed to be submitted |
400 | ER-253 | Not enough funds | The transfer instruction cannot be created as there are not sufficient funds to pay for the amount and/or fee |
400 | ER-255 | Insufficient funds available to cover transfer and fee | The transfer instruction cannot be created as there are not sufficient funds to pay for the amount and/or fee |
400 | ER-260 | You are attempting to send to an invalid address | The transfer instruction has been rejected due to sender or recipient details |
400 | ER-501 | Transaction creation is rejected | The transfer instruction has been rejected due to sender or recipient details |
400 | ER-502 | Mismatch between transaction's wallet currency and field: field_name | The cryptocurrency you provided for the field is not consistent with the wallet used for the transaction |
400 | ER-503 | Value of the field: field_name is not adapted to this endpoint | You provided a value that is not supported by the endpoint you used. Example: "preburn" while using the endpoint "/api/core/transactions" |
400 | ER-504 | Mismatch between field: field1_name and field: field2_name | The fields "field1" and "field2" must have the same value |
400 | ER-505 | Mismatch between transaction's wallet and field: field_name | The value you provided for the field does not match the wallet used for the transaction |
400 | ER-506 | Mismatch between transaction's company and field: field_name | The value you provided does not match the company used for the transaction |
400 | ER-512 | Eth transaction fee-included not allowed | You can't submit a transaction ETH included fees |
400 | ER-601 | Ledger wallet is not compatible with this operation | You are trying to initiate a contract-related transaction while using a wallet that does not support this operation |
400 | ER-604 | Error retrieving the wallet address | Zodia was not able to retrieve the address associated to this wallet |
400 | ER-615 | The sender and recipient cannot be the same | The provided transfer sender and transfer recipient cannot be the same |
401 | ER-210 | Signature verification failed | Zodia was not able to verify the signature you provided. Either because:
Please refer to the section Authentication |
401 | ER-211 | Access to this resource is denied | The entitlements defined by Zodia don’t allow you to access this resource |
404 | Endpoint doesn't exist | You are trying to reach an endpoint that does not exist | |
405 | ER-204 | Available methods : available_methods | You must choose from the available methods for an endpoint. Example: GET,POST |
429 | ER-208 | Rate limit or daily quota exceeded | Too many request submitted in a given time period, exceeded the number of requests allowed |
400 | ER-903 | Invalid parameter: filter | You must provide a valid filter value |
400 | ER-1123 | This user is already link to a group change : value | You must provide a different group for this user |
401 | ER-1200 | Invalid company Id | The value you provided does not match the any valid company Id |
400 | ER-1201 | Invalid notification Id | The value you provided does not match the any valid notification Id |
400 | ER-1650 | Invalid entity ID | The value you provided does not match the any valid entity Id |
400 | ER-1902 | You need to deactivate all active addresses before deactivating the beneficiary | All active addresses must be deactivated first |
500 | ER-001 | Unexpected error: error | Zodia encountered an unexpected error and can not fulfill the request Please contact Zodia with the error's identifier beginning with the keyword "ERR" |
The table below describes some errors you may encounter in interchange settlement:
HTTP status code | Error code | Error message | Description |
---|---|---|---|
400 | ER-TRA-003 | Request time too different from current time | The value of the field "requestDateTime" is too different from current time |
400 | ER-TRA-004 | Instruction count is different from the number of settlement instructions | The value of the field "instructionCount" is different from the actual number of "settlements" |
400 | ER-TRA-005 | Settlement ID settlement_id is already used by another settlement | The value of the field "settlementRequestId" was already used by another settlement |
400 | ET-TRA-007 | An error occurred while validating settlement request settlement request_id | An unexpected error occurred while validating settlement request |
400 | ET-2352 | Settlement instruction with id: tracking_id does not exist | The Settlement instruction was not found on the database when procesing the event |
400 | ET-2353 | Trading venue: venue_id does not support trading vault | The venue doesn't have a settlement wallet |
400 | ET-2354 | Trading address for wallet_id: currency_id does not exist | The address was not found on the database for that wallet |
400 | ET-2355 | Settlement Wallet for venue : venue_id not found | The Settlement Wallet for venue was not found on the database |
400 | ET-2356 | Entity already exists, Trading vault attributes have to be unique for name wallet_name and account reference account_ref | The vault already exists; wallet name and account reference should be unique |
400 | ET-2357 | Transfers not allowed while settlement in progress | There is an existing settlement request for that venue that is still In-progress |
400 | ET-2358 | Receivable settlement is not allowed from a trading vault | Receivable settlement is not allowed from a trading vault |
400 | ET-2359 | Fee Buffer for wallet wallet_id with account ref: account_ref and currency id: currency_id, is less than fiat_buffer | The fee buffer from an address under the wallet is less than the allowed fiat buffer |
400 | ET-2360 | Error trying to retrieve trading wallets for: wallet_refs | Error trying to retrieve trading wallets |
400 | ET-2362 | Multiple receivable address for ledger | Multiple receivable address were passed for the same currency |
400 | ET-2363 | Receivable address for ledger is missing | Receivable Address for the currency indicated on a settlement with type "RECEIVE" was not found |
400 | ET-2364 | Receivable address: address for ledger is not a whitelisted self address | The receivable address indicated from the request was not a whitelisted address on the system |
400 | ET-2365 | Netted Amount for currency does not match total settled | Netted amount from the PAY and RECEIVE settlements does not match |
400 | ET-2366 | Settlement rejected because errors haven't been resolved for status in time hour | Settlement rejected because errors haven't been resolved |
400 | ET-2367 | Wallet Asset currency_id not present in wallet wallet_id: account_ref | Wallet Asset with the currency is not present in wallet |
400 | ET-2368 | Vault with ref wallet_id does not exist | Counter party was not found for settlement |
400 | ET-2369 | Interchange settlements is only available for venues | Interchange settlements is only available for venues |
400 | ET-2370 | An interchange settlement settlement_req_id is in progress for venue_id | An interchange settlement is still in progress for venue |
400 | ET-2371 | The request date time req_date_time is of incorrect format, should be format | The value of the field "requestDateTime" is of incorrect format |
400 | ET-2372 | currency :currency_id is not supported by venue venue_id | The given currency from request payload is not supported by venue |
400 | ET-2373 | currency :currency_id and ledger :ledger doesn't match | The given currency and ledger from request payload did not match |
The units used in the API are the smallest denomination for a currency i.e. Satoshi, Wei, Litoshi.
Status in API responses can be mapped to human-readable messages using the following reference tables:
Status | Description |
---|---|
DRAFT | Request is created and not yet submitted |
SUBMITTED | Request is submitted and maker has 120 seconds to confirm |
PENDING CONFIRMATION | Request is awaiting maker confirmation |
PENDING AUTHORISATION | Request is awaiting approvals |
CONFIRMED | Request is completed |
CONFIRMATION TIMEOUT | Request was not confirmed by the maker within 120 seconds |
APPROVAL TIMEOUT | Request was not approved within the allocated time and expired |
REJECTED BY AUTHORISER | Request was rejected by authoriser |
REJECTED BY SYSTEM | Request was rejected by system |
Status | Description |
---|---|
ACTIVE | Wallet is active, funds are available to spend |
DEACTIVATED | Wallet is deactivated, funds are frozen |
Status | Description |
---|---|
INITIATED | Transfer is waiting to be posted on chain |
POSTED ON CHAIN | Transfer is posted on-chain |
CONFIRMATION COMPLETED | Transfer is confirmed after x blocks |
FAILED | Transfer has failed and has been posted on chain |
UNDER INVESTIGATION | Transfer is under investigation by Zodia |
PENDING UNLOCK | Incoming transfer detected on-chain and pending system approval |
UNLOCKED | Incoming transfer is approved |
REJECTED BY SYSTEM | Incoming transfer rejected by system |
Zodia Custody’s Interchange service enables you to trade with your assets directly from a fully segregated institution-grade trading wallet, so they remain your property, completely isolated and protected until trade settlement.
Interchange enables participating venues to establish limits based on your assets mirrored on a wallet held by Zodia Custody, thereby eliminating the need to pre-fund venues or exchanges and to allocate assets across multiple venues instantly, safely and simply, without delay or exposure.
Join approval: This is also called as Joint Control. Both client & trading venue have the joint control on the settlement. The trading venue submits the instruction & the client authorises it.
One-party approval(client or venue): Client or Trading venue have full control on the settlement.
The client and trading venue can mutually agree to change the approval mode at any time.
Trading Venue needs to follow the steps below,
The process refers to the transfer of funds between different parties (buyers and sellers) after a trade is executed.
Settlement Receivable: Transferring funds from a client’s trading wallet to a venue.
Settlement Payable: Transferring funds from a venue to a client’s trading wallet.
Trading Venue instructs a settlement. Settlement can be requested by creating a service request as below, then the request can be further submitted, approved same as the steps mentioned here creating a transaction .
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/create'
--header 'Content-Type: application/json' \
--data-raw
'{
"serviceId": "0x0003-003",
"payload": {
"sender": {
"type": "WALLETID | WALLETREFERENCE",
"value": "ZODCS-NOBENF-E3WB8MB4EI"
},
"destination": {
"type": "ENDPOINT | WALLETID | WALLETREFERENCE",
"value": "467f0fbf-7cd0-4196-b8be-7a33ac66f4f6"
},
"currency": "<ETH | BTC>",
"venueId": "<VENUE_ID>",
"amount": "100",
"subtractFee": false
}
}'
Yes, we do support batch transactions for settlements on UTXO based currencies like Bitcoin.
Below is the settlement payload sample with multiple destinations,
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/create'
--header 'Content-Type: application/json' \
--data-raw
'{
"serviceId": "0x0003-003",
"payload": {
"sender": {
"type": "WALLETID | WALLETREFERENCE",
"value": "ZODCS-NOBENF-E3WB8MB4EI"
},
"destinations": [
{
"type": "ENDPOINT | WALLETID | WALLETREFERENCE",
"value": "467f0fbf-7cd0-4196-b8be-7a33ac66f4f6"
},
{
"type": "ENDPOINT | WALLETID | WALLETREFERENCE",
"value": "467f0fbf-7cd0-4196-b8be-ft6tfuy7676"
}
],
"currency": "<ETH | BTC>",
"venueId": "<VENUE_ID>",
"amount": "100",
"subtractFee": false
}
}'
Transaction batching is the process of combining multiple transactions together into a single transaction to save on gas fees and improve efficiency on the blockchain.
Client needs to follow the steps below,
For example, you can create a Ethereum
trading wallet with name TradingFund123
,
then proceed with submit & approval steps same as here Wallet Creation Flow
curl --request POST 'https://hostname.zodia.io/v3/api/servicedesk/create'
--header 'submitter-id: [email protected]' \
--header 'Content-Type: application/json' \
--data-raw
'{
"serviceId": "0x0003-001",
"payload": {
"name": "TradingFund123",
"currency": "ETH",
"tradingVenueId": "VENUEID123",
"accountUuid": "test",
"userUuid": "test"
}
}'
A custody wallet is owned by the client, with (the client) having full operational control of their custody wallets. Whereas the trading wallets, the client remains the owner or beneficiary of these assets, but operational control is partially given to the partner trading venue.
Client initiates this request when wishes to transfer the funds from their trading wallet to their custody wallet.
Client needs to Create a transaction to withdraw funds from their trading wallet.
Create Trading Wallet → Deposit into Trading Wallet → Withdraw from Trading Wallet
Yes, the client will need to create a separate trading wallet for each venue.
It is possible with Full Control delegation.
Yes.
One stop shop for instructing transfers, create wallets, whitelist beneficiaries and more. The general idea of the Digital Asset Service Desk is to be self-service. Consult the list of available products and services to find out what you are allowed to do and what payloads are required to create service requests.
Available products and services are derived from the entitlements of the user
submitter-id | string |
products | Array of strings Search by product offering i.e. NETWORK_MGMT, TRADING, CUSTODY |
productIds | Array of strings Search by product IDs |
serviceIds | Array of strings Search by service IDs |
serviceNames | Array of strings Search by service names. Note the search text needs to match the given service names |
requestTypes | Array of strings Search by request type i.e. CREATE, UPDATE or DEACTIVATE |
{- "products": [
- "string"
], - "productIds": [
- "string"
], - "serviceIds": [
- "string"
], - "serviceNames": [
- "string"
], - "requestTypes": [
- "string"
]
}
{- "items": [
- {
- "product": "CUSTODY",
- "productId": 19,
- "serviceId": "0x0013-001",
- "serviceName": "Custody Wallet Management",
- "requestType": "CREATE",
- "description": "Custody Wallet",
- "template": {
- "name": "string",
- "currency": "string"
}
}
]
}
submitter-id | string |
serviceId | string Unique service ID for a given operation |
endToEndId | string <uuid> Use for request tracking purposes |
object Each service has an unique payload template. Check the list of products and services to find the correct one. This sample is for the creation of a custody wallet |
{- "serviceId": "0x0013-001",
- "endToEndId": "adb61a09-f295-41c4-b4c0-b61daa0cf479",
- "payload": {
- "name": "string",
- "currency": "string"
}
}
{- "requestId": "string",
- "pluginDetail": {
- "entityId": "string",
- "details": [
- { }
]
}
}
submitter-id | string |
requestId | string Service Request ID. Obtained when the service request was created |
{- "requestId": "string"
}
{- "timestamp": "2021-10-27T14:30:13.912Z",
- "title": "Method Not Allowed",
- "status": 415,
- "details": [
- {
- "message": "Available methods : GET,POST",
- "code": "ER-204"
}
]
}
submitter-id | string |
requestId | string Service Request ID. Obtained when the service request was created |
{- "requestId": "string"
}
{- "request": { },
- "signature": "string"
}
submitter-id | string |
requestId required | string Service Request ID |
request required | object As a maker you don't need to modify this element. As an authoriser you need to explicitly specify the approval or rejection of the request |
signature required | string Signature of the |
{- "requestId": "string",
- "request": { },
- "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
{- "timestamp": "2021-10-27T14:30:13.912Z",
- "title": "Method Not Allowed",
- "status": 415,
- "details": [
- {
- "message": "Available methods : GET,POST",
- "code": "ER-204"
}
]
}
Search past and present service requests
submitter-id | string |
productIds required | Array of strings Search by product IDs |
serviceIds required | Array of strings Search by service IDs |
requestTypes | Array of strings Search by request types i.e. CREATE, UPDATE, DEACTIVATE |
requestIds | Array of strings Search by request IDs |
endToEndIds | Array of strings Search by customer provided end to end IDs |
statuses | Array of strings Search by statuses. Refer to section Status Reference for the full list |
modifiedAt | Array of strings |
details | Array of strings |
entityIds | Array of strings Search by entity IDs. Possible values are wallet IDs, transactions IDs (not exhaustive) |
companyIds | Array of strings |
paginationLimit | integer <int32> Number of items in response (default is 10) |
paginationOffset | integer <int32> |
object |
{- "productIds": [
- "string"
], - "serviceIds": [
- "string"
], - "requestTypes": [
- "string"
], - "requestIds": [
- "string"
], - "endToEndIds": [
- "string"
], - "statuses": [
- "string"
], - "modifiedAt": [
- "string"
], - "details": [
- "string"
], - "entityIds": [
- "string"
], - "companyIds": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "total": 0,
- "items": [
- {
- "requestId": "string",
- "serviceId": "string",
- "product": "string",
- "productId": "string",
- "endToEndId": "string",
- "requestType": "string",
- "payload": { },
- "status": "string",
- "companyId": "string",
- "businessObjects": {
- "property1": { },
- "property2": { }
}, - "createdBy": "string",
- "createdAt": "string",
- "updatedBy": "string",
- "updatedAt": "string",
- "expiresAt": "string",
- "entityId": "string"
}
]
}
submitter-id | string |
requestIds | Array of strings Search by request IDs |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "requestIds": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
[- {
- "total": 0,
- "items": [
- {
- "requestId": "string",
- "processingSummaryItems": [
- {
- "role": "MAKER",
- "processingSummary": [
- {
- "name": "string",
- "status": "string",
- "timestamp": "string",
- "companyName": "string"
}
]
}
], - "versionNumber": 0,
- "versionAction": 0
}
]
}
]
Retrieve authorised vasps, whitelisted beneficiaries and addresses.
submitter-id | string |
ids | Array of strings Search by IDs of VASPs |
names | Array of strings Search by names of the VASPs |
travelRuleMethods | Array of strings Search by Travel Rule methods such as MANUAL, TRUST, etc. |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "ids": [
- "string"
], - "names": [
- "string"
], - "travelRuleMethods": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "total": 0,
- "items": [
- {
- "id": "string",
- "name": "string",
- "country": "string",
- "travelRuleMethod": "string"
}
]
}
submitter-id | string |
statuses | Array of strings Search by statuses i.e. ACTIVE or DEACTIVATED |
beneficiaryIds | Array of strings Search by specific beneficiary IDs |
beneficiaryNames | Array of strings Search by beneficiary names |
entityTypes | Array of strings Search by type i.e. INDIVIDUAL or ORGANISATION |
companyIds | Array of strings Search by company IDs |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "statuses": [
- "string"
], - "beneficiaryIds": [
- "string"
], - "beneficiaryNames": [
- "string"
], - "entityTypes": [
- "string"
], - "companyIds": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "beneficiaryId": "string",
- "entityType": "INDIVIDUAL",
- "beneficiaryName": "string",
- "registrationNumber": "string",
- "dateOfIncorporation": "2019-08-24T14:15:22Z",
- "registeredAddress": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "state": "string",
- "country": "string"
}, - "operatingAddress": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "state": "string",
- "country": "string"
}, - "updatedAt": "2021-10-27T14:30:13.912Z",
- "companyId": "string",
- "status": "ACTIVE"
}
], - "total": 0
}
submitter-id | string |
statuses | Array of strings Search by status i.e. ACTIVE or DEACTIVATED |
beneficiaryIds | Array of strings Search by beneficiary IDs |
cryptoAddressIds | Array of strings Search by address IDs |
addresses | Array of strings Search by on-chain addresses |
blockchains | Array of strings Search by blockchain i.e. BTC or ETH |
vaspIds | Array of strings Search by VASP IPs |
addressPurposes | Array of strings Search by purpose of address i.e. INCOMING, OUTGOING or both |
hostedAddress | boolean Specify if the address hosted or managed by a vasp |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "statuses": [
- "string"
], - "beneficiaryIds": [
- "string"
], - "cryptoAddressIds": [
- "string"
], - "addresses": [
- "string"
], - "blockchains": [
- "string"
], - "vaspIds": [
- "string"
], - "addressPurposes": [
- "string"
], - "hostedAddress": true,
- "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
[- {
- "total": 0,
- "items": [
- {
- "cryptoAddressId": "string",
- "beneficiaryId": "string",
- "address": "string",
- "blockchain": "string",
- "status": "string",
- "notes": "string",
- "addressPurpose": [
- "INCOMING, OUTGOING"
], - "hostedAddress": true,
- "vaspId": "string",
- "createdAt": "2021-05-11T04:43:43Z"
}
]
}
]
submitter-id | string |
ids | Array of strings Search by transfer rule IDs |
walletIds | Array of strings Search by wallet IDs on which transfer rules are applied |
statuses | Array of strings Items Enum: "ACTIVE" "DEACTIVATED" Search by status |
companyIds | Array of strings Search by company IDs |
enforcingCompanyIds | Array of strings Search by enforcing company IDs |
transferRuleTypes | Array of strings Items Enum: "DESTINATION" "TRANSFER_AMOUNT" Search by transfer rule types |
createdBy | Array of strings Search by transfer rule creator |
updatedAt | string Search by time of last update |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
{- "ids": [
- "string"
], - "walletIds": [
- "string"
], - "statuses": [
- "ACTIVE"
], - "companyIds": [
- "string"
], - "enforcingCompanyIds": [
- "string"
], - "transferRuleTypes": [
- "DESTINATION"
], - "createdBy": [
- "string"
], - "updatedAt": "2021-05-11T04:43:43Z",
- "paginationLimit": 0,
- "paginationOffset": 0
}
[- {
- "total": 0,
- "items": [
- {
- "id": "string",
- "walletId": "string",
- "walletName": "string",
- "walletType": "string",
- "walletOwner": "string",
- "companyId": "string",
- "isTrading": true,
- "enforcingCompanyId": "string",
- "transferRuleType": "DESTINATION",
- "transferRuleDefinition": [
- {
- "allowedDestinations": [
- {
- "value": "string",
- "name": "string",
- "address": "string",
- "type": "WALLET_ID"
}
]
}
], - "status": "string",
- "currencyId": "string",
- "currency": "string",
- "updatedAt": "2021-05-11T04:43:43Z"
}
]
}
]
submitter-id | string |
ids | Array of strings Search by wallet IDs |
names | Array of strings Search by wallet names |
walletOwnerIds | Array of strings Search by wallet owner IDs |
statuses | Array of strings Search by wallet status i.e. ACTIVE or DEACTIVATED |
companyIds | Array of strings |
currencies | Array of strings |
createdBy | Array of strings |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "ids": [
- "string"
], - "names": [
- "string"
], - "walletOwnerIds": [
- "string"
], - "statuses": [
- "string"
], - "companyIds": [
- "string"
], - "currencies": [
- "string"
], - "createdBy": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "id": "ZTEST-NOBENF-849P8XKKAO",
- "name": "Demo wallet",
- "status": "ACTIVE",
- "companyId": "ZTEST",
- "currency": "BTC",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "balances": [
- {
- "currency": "BTC",
- "availableBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "ledgerBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "pendingOutBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "pendingInBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}
}
], - "createdAt": "2021-05-11T04:43:43Z",
- "updatedAt": "2021-05-11T04:43:43Z"
}
], - "total": 0
}
submitter-id | string |
ids | Array of strings Search by wallet IDs |
names | Array of strings Search by wallet names |
walletOwnerIds | Array of strings Search by wallet owner IDs |
statuses | Array of strings Search by wallet status i.e. ACTIVE or DEACTIVATED |
companyIds | Array of strings |
currencies | Array of strings |
createdBy | Array of strings |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "ids": [
- "string"
], - "names": [
- "string"
], - "walletOwnerIds": [
- "string"
], - "statuses": [
- "string"
], - "companyIds": [
- "string"
], - "currencies": [
- "string"
], - "createdBy": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "id": "ZTEST-NOBENF-849P8XKKAO",
- "name": "Demo wallet",
- "status": "ACTIVE",
- "companyId": "ZTEST",
- "currency": "BTC",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "balances": [
- {
- "currency": "BTC",
- "availableBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "ledgerBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "pendingOutBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "pendingInBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}
}
], - "createdAt": "2021-05-11T04:43:43Z",
- "updatedAt": "2021-05-11T04:43:43Z"
}
], - "total": 0
}
Use for receiving deposits from external sources
submitter-id | string |
walletId required | string Generate/retrieve an address for a given wallet ID |
currencyId | string Currency ID for multi-ledger wallet; will throw '400' error if the currency is not supported by the wallet |
subClient | string <= 128 characters Use for validation; will throw an error if the sub-client is already existing on any wallet address under unified wallet |
{- "walletId": "string",
- "currencyId": "string",
- "subClient": "string"
}
{- "address": "string",
- "ledger": "string",
- "walletId": "string",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "custodian": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "integrityDetails": {
- "signature": "string",
- "zodiaPublicKey": "string"
}
}
submitter-id | string |
addresses | Array of strings Search by on-chain addresses |
walletIds | Array of strings Search by wallet IDs |
currencies | Array of strings Search by currencies |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "addresses": [
- "string"
], - "walletIds": [
- "string"
], - "currencies": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "address": "string",
- "ledger": "string",
- "walletId": "string",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "custodian": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "integrityDetails": {
- "signature": "string",
- "zodiaPublicKey": "string"
}
}
], - "total": 0
}
submitter-id | string |
walletIds | Array of strings Search by wallet IDs |
destinations | Array of strings Search by destination values. Acceptable values are wallet ID, beneficiary/self address ID, Fireblocks connection ID and LNURL |
statuses | Array of strings Search by transfer status. Refer to section Status Reference for list of statuses |
currencies | Array of strings Search by currencies |
amounts | Array of strings Search transactions by ledger amounts |
ledgerRefs | Array of strings Search by transaction hash |
companyIds | Array of strings Search by company IDs |
fromDate | string <date-time> Search from a given date. Datetime format in ISO 8601 |
toDate | string <date-time> Search to a given date. Datetime format in ISO 8601 |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "walletIds": [
- "string"
], - "destinations": [
- "string"
], - "statuses": [
- "string"
], - "currencies": [
- "string"
], - "amounts": [
- "string"
], - "ledgerRefs": [
- "string"
], - "companyIds": [
- "string"
], - "fromDate": "2021-05-11T04:43:43Z",
- "toDate": "2021-05-11T04:43:43Z",
- "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "total": 0,
- "items": [
- {
- "id": "TRI-ZTEST-63Q4DZ0KJP",
- "status": "PENDING_UNLOCK",
- "method": "TRANSFER",
- "type": "INCOMING",
- "sender": {
- "type": "WALLETID",
- "value": "ZTEST-12345678",
- "addresses": [
- "0x05bbb2996fc1eaf2daad914198c02fe9a2b21c73"
]
}, - "destination": {
- "type": "WALLETID",
- "value": "ZTEST-12345678",
- "addresses": [
- "0x05bbb2996fc1eaf2daad914198c02fe9a2b21c73"
]
}, - "currency": "BTC",
- "ratio": "1000000000000000000",
- "network": "Ethereum",
- "amountLedger": "641400",
- "feeAmountLedger": "641400",
- "ledgerRef": "2f6e77f8c4313d0925f71acf19a659398115bdf903e3af06b3b1776e756c096f",
- "companyId": "ZTEST",
- "createdAt": "2021-05-11T04:43:43Z"
}
]
}
{- "items": [
- {
- "high": {
- "value": "string"
}, - "medium": {
- "value": "string"
}, - "low": {
- "value": "string"
}, - "type": "string",
- "weight": "BTC: satoshiPerVbyte (e.g. 3995), ETH: Gwei (e.g. 21000)"
}
]
}
submitter-id | string |
walletId required | string Id of the wallet |
hideZeroBalance required | boolean Hide addresses when their balances is 0. (Only available for UTXO wallets.) |
{- "walletId": "string",
- "hideZeroBalance": true
}
[- {
- "address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
- "balance": "string",
- "currency": "string"
}
]
submitter-id | string |
ids | Array of strings Search by wallet IDs |
venueIds | Array of strings Search by venue IDs |
names | Array of strings Search by wallet names |
statuses | Array of strings Search by wallet status i.e. ACTIVE or DEACTIVATED |
companyIds | Array of strings |
currencies | Array of strings |
createdBy | Array of strings |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "ids": [
- "string"
], - "venueIds": [
- "string"
], - "names": [
- "string"
], - "statuses": [
- "string"
], - "companyIds": [
- "string"
], - "currencies": [
- "string"
], - "createdBy": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "id": "ZTEST-TW-LHQ1343VU2",
- "venueId": "TESTVENUE",
- "name": "Demo vault",
- "status": "ACTIVE",
- "companyId": "ZTEST",
- "currency": "BTC",
- "customProperties": {
- "clientReference": "ZodiaTest",
- "walletReference": 1223456
}, - "balances": [
- {
- "currency": "BTC",
- "availableBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "ledgerBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "pendingOutBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "pendingInBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}
}
], - "createdAt": "2021-05-11T04:43:43Z",
- "updatedAt": "2021-05-11T04:43:43Z"
}
], - "total": 0
}
submitter-id | string |
ids | Array of strings Search by vault IDs |
venueIds | Array of strings Search by venue IDs |
names | Array of strings Search by vault names |
statuses | Array of strings Search by vault status i.e. ACTIVE or DEACTIVATED |
companyIds | Array of strings |
createdBy | Array of strings |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "ids": [
- "string"
], - "venueIds": [
- "string"
], - "names": [
- "string"
], - "statuses": [
- "string"
], - "companyIds": [
- "string"
], - "createdBy": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "id": "ZTEST-NOBENF-849P8XKKAO",
- "venueId": "string",
- "name": "Demo wallet",
- "status": "ACTIVE",
- "companyId": "ZTEST",
- "customProperties": {
- "clientReference": "ZodiaTest",
- "walletReference": 1223456
}, - "balances": [
- {
- "currency": "BTC",
- "availableBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "ledgerBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "pendingOutBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}, - "pendingInBalance": {
- "amount": "string",
- "amountUnit": "0.006414",
- "usdValue": "0.006414",
- "fiatValue": "0.006414",
- "fiatCurrency": "USD"
}
}
], - "createdAt": "2021-05-11T04:43:43Z",
- "updatedAt": "2021-05-11T04:43:43Z"
}
], - "total": 0
}
Use for receiving deposits from external sources
submitter-id | string |
walletId | string Generate/retrieve an address for a given wallet ID |
{- "walletId": "string"
}
{- "address": "string",
- "ledger": "string",
- "walletId": "string",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "custodian": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "integrityDetails": {
- "signature": "string",
- "zodiaPublicKey": "string"
}
}
submitter-id | string |
addresses | Array of strings Search by on-chain addresses |
walletIds | Array of strings Search by wallet IDs |
currencies | Array of strings Search by currencies |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "addresses": [
- "string"
], - "walletIds": [
- "string"
], - "currencies": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "address": "string",
- "ledger": "string",
- "walletId": "string",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "custodian": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "integrityDetails": {
- "signature": "string",
- "zodiaPublicKey": "string"
}
}
], - "total": 0
}
Use for receiving deposits from external sources
submitter-id | string |
walletId required | string Generate/retrieve an address for a given vault ID |
ledger required | string Generate/retrieve an address for a given vault with a given currency |
{- "walletId": "string",
- "ledger": "string"
}
{- "address": "string",
- "ledger": "string",
- "walletId": "string",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "custodian": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "integrityDetails": {
- "signature": "string",
- "zodiaPublicKey": "string"
}
}
submitter-id | string |
addresses | Array of strings Search by on-chain addresses |
walletIds | Array of strings Search by wallet IDs |
currencies | Array of strings Search by currencies |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "addresses": [
- "string"
], - "walletIds": [
- "string"
], - "currencies": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "address": "string",
- "ledger": "string",
- "walletId": "string",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "custodian": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "integrityDetails": {
- "signature": "string",
- "zodiaPublicKey": "string"
}
}
], - "total": 0
}
submitter-id | string |
addresses | Array of strings Search by on-chain addresses |
walletIds | Array of strings Search by wallet IDs |
currencies | Array of strings Search by currencies |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "addresses": [
- "string"
], - "walletIds": [
- "string"
], - "currencies": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "items": [
- {
- "address": "string",
- "ledger": "string",
- "walletId": "string",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "custodian": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "integrityDetails": {
- "signature": "string",
- "zodiaPublicKey": "string"
}
}
], - "total": 0
}
submitter-id | string |
ids | Array of strings Search by transaction IDs |
walletIds | Array of strings Search by wallet IDs |
statuses | Array of strings Search by transfer status. Refer to section Status Reference for list of statuses |
currencies | Array of strings Search by currencies |
amounts | Array of strings Search transactions by ledger amounts |
ledgerRefs | Array of strings Search by transaction hash |
companyIds | Array of strings Search by company IDs. If you are a venue use this field to filter per client |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
object |
{- "ids": [
- "string"
], - "walletIds": [
- "string"
], - "statuses": [
- "string"
], - "currencies": [
- "string"
], - "amounts": [
- "string"
], - "ledgerRefs": [
- "string"
], - "companyIds": [
- "string"
], - "paginationLimit": 0,
- "paginationOffset": 0,
- "sort": {
- "by": "id",
- "order": "ASC"
}
}
{- "total": 0,
- "items": [
- {
- "id": "TRI-ZTEST-63Q4DZ0KJP",
- "status": "string",
- "method": "string",
- "sender": {
- "type": "ADDRESS",
- "value": "ZTEST-11111111",
- "addresses": [
- "tb1qtx38mjl8gyg9gjk58tw88upytxwyxhmcqsv3le"
]
}, - "destination": {
- "type": "ADDRESS",
- "value": "string",
- "addresses": [
- "tb1qtx38mjl8gyg9gjk58tw88upytxwyxhmcqsv3le"
]
}, - "destinations": [
- {
- "type": "ADDRESS",
- "value": "string",
- "beneficiary": "string",
- "name": "string",
- "address": "string",
- "amount": "string",
- "substractFee": true
}
], - "currency": "string",
- "amountLedger": 641400,
- "ledgerRef": "2f6e77f8c4313d0925f71acf19a659398115bdf903e3af06b3b1776e756c096f",
- "companyId": "ZTEST",
- "venueId": "string",
- "createdAt": "2021-05-11T04:43:43Z"
}
]
}
walletId | string |
hideZeroBalance | boolean |
{- "walletId": "string",
- "hideZeroBalance": true
}
[- {
- "address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
- "balance": "string",
- "currency": "string"
}
]
transferReferences | Array of strings Transaction references whose senders need to be whitelisted |
{- "transferReferences": [
- "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
]
}
{- "whitelisted": [
- "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
], - "notProcessed": [
- "string"
]
}
required | object |
required | Array of objects List of Settlement Instructions |
required | Array of objects Netted Settlement Instructions |
{- "header": {
- "settlementRequestId": "string",
- "requestDateTime": "string",
- "receivableAddresses": [
- {
- "address": "string",
- "ledger": "string"
}
], - "instructionCount": 0
}, - "settlements": [
- {
- "counterparty": {
- "type": "string",
- "value": "string"
}, - "settlementDirection": "PAY",
- "currency": "string",
- "ledger": "string",
- "amount": "string",
- "externalSettlementId": "string",
- "executionDate": "string"
}
], - "netSettlements": [
- {
- "settlementDirection": "PAY",
- "currency": "string",
- "ledger": "string",
- "amount": "string"
}
]
}
{- "settlementTrackingId": "string",
- "status": "string"
}
settlementTrackingId required | string reference to track settlement |
{- "settlementTrackingId": "string"
}
{- "settlementTrackingId": "string",
- "status": "string"
}
settlementRequestIds | Array of strings |
fromDate | string <yyyy-MM-dd> Starting from date of request |
toDate | string <yyyy-MM-dd> Up until date of request |
paginationLimit | number Number of items in response (default is 10) |
paginationOffset | number |
{- "settlementRequestIds": [
- "string"
], - "fromDate": "string",
- "toDate": "string",
- "paginationLimit": 0,
- "paginationOffset": 0
}
{- "items": [
- {
- "header": {
- "settlementRequestId": "string",
- "requestDateTime": "string",
- "receivableAddresses": [
- {
- "address": "string",
- "ledger": "string"
}
], - "instructionCount": 0
}, - "settlements": [
- {
- "counterparty": {
- "type": "string",
- "value": "string"
}, - "settlementDirection": "PAY",
- "currency": "string",
- "ledger": "string",
- "amount": "string",
- "externalSettlementId": "string",
- "transferId": "string",
- "transactionHash": "string",
- "status": "string"
}
], - "netSettlements": [
- {
- "counterparty": {
- "type": "string",
- "value": "string"
}, - "settlementDirection": "PAY",
- "currency": "string",
- "ledger": "string",
- "transferAmount": {
- "amount": "string",
- "amountLedger": "string",
- "amountUSD": "string"
}, - "transferId": "string",
- "transactionHash": "string",
- "status": "string"
}
]
}
], - "total": 0
}
Available staking Report Data
submitter-id | string |
walletIds | Array of strings List of wallet id |
fromDate required | string Earliest date of data returned |
toDate required | string Latest date of data returned |
currency required | string Currency of the validator |
voteAddresses | Array of strings (For Solana only) List of vote address the stake account is delegated to |
{- "walletIds": [
- "string"
], - "fromDate": "string",
- "toDate": "string",
- "currency": "string",
- "voteAddresses": [
- "string"
]
}
[- {
- "walletId": "string",
- "walletAddress": "string",
- "validatorPublicKey": "string",
- "currency": "string",
- "startingBalance": {
- "amount": 1,
- "amountLedger": 641400,
- "amountFiat": 641400
}, - "timeStart": "string",
- "timeEnd": "string",
- "protocolRewards": {
- "amount": 1,
- "amountLedger": 641400,
- "amountFiat": 641400
}, - "txFeeRewards": {
- "amount": 1,
- "amountLedger": 641400,
- "amountFiat": 641400
}, - "mevRewards": {
- "amount": 1,
- "amountLedger": 641400,
- "amountFiat": 641400
}, - "totalRewards": {
- "amount": 1,
- "amountLedger": 641400,
- "amountFiat": 641400
}, - "nodeProvider": "string",
- "withdrawals": {
- "amount": 1,
- "amountLedger": 641400,
- "amountFiat": 641400
}, - "validatorStatus": "string",
- "voteAddress": "string",
- "rewardAdditionalData": {
- "epoch": "string",
- "slot": "string",
- "activeStake": "string"
}
}
]
{- "wallets": [
- {
- "walletId": "ZTEST-NOBENF-849P8XKKAO",
- "walletName": "Demo wallet",
- "walletCompany": "ZTEST",
- "status": "ACTIVE",
- "valid": true,
- "registeredComplianceKey": true,
- "blockchain": "string",
- "assetBalances": [
- {
- "currency": "string",
- "unitCurrency": "string",
- "availableUnitBalance": "641400",
- "ledgerUnitBalance": "641400",
- "pendingOutUnitBalance": "0",
- "pendingInUnitBalance": "0",
- "availableBalance": "0.006414",
- "ledgerBalance": "0.006414",
- "pendingOutBalance": "0",
- "pendingInBalance": "0"
}
], - "createdAt": "2021-08-03T18:17:57Z",
- "updatedAt": "2021-08-03T18:17:57Z"
}
]
}
name required | string [ 1 .. 128 ] characters ^[a-zA-Z0-9 -]+$ Display name of the wallet |
currency required | string Currency of the wallet |
beneficiaryId | string [ 14 .. 32 ] characters ID of the beneficiary of the wallet |
submitterEmail required | string Mail of the user creating the wallet |
walletId required | string [ 1 .. 40 ] characters <companyId>-[NOBENF|<beneficiaryId>]-API-* ID of the wallet |
{- "name": "Demo wallet",
- "currency": "string",
- "beneficiaryId": "BNF-ZTEST-0DFUSJPF7A",
- "walletId": "ZTEST-NOBENF-849P8XKKAO"
}
{- "id": "string"
}
{- "walletId": "ZTEST-NOBENF-849P8XKKAO",
- "walletName": "Demo wallet",
- "walletCompany": "ZTEST",
- "status": "ACTIVE",
- "valid": true,
- "registeredComplianceKey": true,
- "blockchain": "string",
- "assetBalances": [
- {
- "currency": "string",
- "unitCurrency": "string",
- "availableUnitBalance": "641400",
- "ledgerUnitBalance": "641400",
- "pendingOutUnitBalance": "0",
- "pendingInUnitBalance": "0",
- "availableBalance": "0.006414",
- "ledgerBalance": "0.006414",
- "pendingOutBalance": "0",
- "pendingInBalance": "0"
}
], - "createdAt": "2021-08-03T18:17:57Z",
- "updatedAt": "2021-08-03T18:17:57Z"
}
{- "address": "string",
- "ledger": "string",
- "walletId": "string",
- "walletOwner": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "custodian": {
- "id": "string",
- "name": "string",
- "address": {
- "line1": "string",
- "line2": "string",
- "city": "string",
- "zipCode": "string",
- "country": "string"
}
}, - "integrityDetails": {
- "signature": "string",
- "zodiaPublicKey": "string"
}
}
{- "request": {
- "author": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e"
}, - "expiryAt": "2022-01-09T10:51:00Z",
- "targetDomainId": "cef1a96b-aa13-443a-b4cc-e3286f2af910",
- "id": "b0393b72-83e8-4809-ba89-7e63ea11a49a",
- "payload": {
- "id": "39ed5bd5-5844-44b9-b4b4-6d3533c3b3e9",
- "alias": "ZTEST-NOBENF-849P8XKKAO",
- "providerDetails": {
- "vaultId": "2d95a0f0-2acf-11ec-8d3d-0242ac130003",
- "keyStrategy": "VaultHard",
- "type": "Vault"
}, - "ledgerId": "bitcoin-testnet",
- "lock": "Unlocked",
- "description": "Description of my account",
- "customProperties": {
- "property1": "string",
- "property2": "string"
}, - "type": "v0_CreateAccount"
}, - "description": "create an intent for account",
- "customProperties": {
- "property1": "string",
- "property2": "string"
}, - "type": "Propose"
}, - "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
walletId required | string |
required | object Details of the wallet being created |
signature required | string Signature of the "request" field above |
{- "request": {
- "author": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e"
}, - "expiryAt": "2022-01-09T10:51:00Z",
- "targetDomainId": "cef1a96b-aa13-443a-b4cc-e3286f2af910",
- "id": "b0393b72-83e8-4809-ba89-7e63ea11a49a",
- "payload": {
- "id": "39ed5bd5-5844-44b9-b4b4-6d3533c3b3e9",
- "alias": "ZTEST-NOBENF-849P8XKKAO",
- "providerDetails": {
- "vaultId": "2d95a0f0-2acf-11ec-8d3d-0242ac130003",
- "keyStrategy": "VaultHard",
- "type": "Vault"
}, - "ledgerId": "bitcoin-testnet",
- "lock": "Unlocked",
- "description": "Description of my account",
- "customProperties": {
- "property1": "string",
- "property2": "string"
}, - "type": "v0_CreateAccount"
}, - "description": "create an intent for account",
- "customProperties": {
- "property1": "string",
- "property2": "string"
}, - "type": "Propose"
}, - "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
{- "id": "string"
}
walletId required | string |
approverId required | string |
{- "request": {
- "author": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e"
}, - "targetDomainId": "6319e504-a82c-4cca-93a5-b46145310588",
- "intentId": "d7492216-bec4-4daf-8326-5a05aaafe561",
- "proposalSignature": "string",
- "type": "Approve"
}, - "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
walletId required | string |
required | object Details of the request being approved/rejected |
signature required | string Signature of the "request" field above |
{- "request": {
- "author": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e"
}, - "targetDomainId": "6319e504-a82c-4cca-93a5-b46145310588",
- "intentId": "d7492216-bec4-4daf-8326-5a05aaafe561",
- "proposalSignature": "string",
- "type": "Approve"
}, - "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
{- "id": "string"
}
walletId required | string |
limit | integer [ 1 .. 1024 ] Default: 10 Number of results per request |
from | string Examples:
Start and inclusive date/time of the query |
to | string Examples:
End and inclusive date/time of the query |
{- "transfers": [
- {
- "companyId": "ZTEST",
- "fromAddress": [
- "tb1qtx38mjl8gyg9gjk58tw88upytxwyxhmcqsv3le"
], - "toWallet": "ZTEST-NOBENF-849P8XKKAO",
- "toAddress": "2Mz5ZH9e6Q53QfK2E1Azaos3Vq62niibhc1",
- "transferId": "TRI-ZTEST-63Q4DZ0KJP",
- "transferStatus": "PENDING_UNLOCK",
- "amountLedger": 641400,
- "ledgerRef": "2f6e77f8c4313d0925f71acf19a659398115bdf903e3af06b3b1776e756c096f",
- "actionId": "TX_IN_ACTION-ZTEST-7LE2JCPZ3D",
- "method": "TRANSFER",
- "createdAt": "2021-08-03T18:17:57Z",
- "currency": "string"
}
]
}
walletId required | string |
limit | integer [ 1 .. 1024 ] Default: 10 Number of results per request |
from | string Examples:
Start and inclusive date/time of the query |
to | string Examples:
End and inclusive date/time of the query |
{- "transfers": [
- {
- "companyId": "ZTEST",
- "fromWallet": "ZTEST-NOBENF-849P8XKKAO",
- "toAddress": "tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt",
- "consumerMetadata": "metadata",
- "transferId": "TRO-API-ZTEST-4001",
- "transferStatus": "CONFIRMED",
- "amountLedger": 641400,
- "feeType": "HIGH",
- "feeAmountLedger": 165,
- "ledgerRef": "fd1c22fd097501606fddbc7d22e5009d45e9e6cb7115ad109a46f8319a385bd4",
- "createdAt": "2021-08-03T18:17:57Z",
- "currency": "string",
- "feeCurrency": "string"
}
]
}
walletId required | string [ 1 .. 40 ] characters id of the wallet you want to use |
transactionId required | string [ 1 .. 40 ] characters id of transaction which will be created |
amount required | string amount to send in Unit |
currency | string Default: "the wallet currency" currency of the transfer |
subtractFee required | boolean subtract fee |
recipientId required | string to address |
description | string a quick description of the transaction |
submitterId required | string email of submitter |
{- "walletId": "ZTEST-NOBENF-849P8XKKAO",
- "transactionId": "TRI-ZTEST-63Q4DZ0KJP",
- "amount": "100",
- "currency": "eth",
- "subtractFee": true,
- "recipientId": "tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt",
- "description": "First transaction",
- "submitterId": "[email protected]"
}
{- "id": "string"
}
transactionId required | string |
{- "request": {
- "author": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e"
}, - "expiryAt": "2022-01-09T10:51:00Z",
- "targetDomainId": "cef1a96b-aa13-443a-b4cc-e3286f2af910",
- "id": "b0393b72-83e8-4809-ba89-7e63ea11a49a",
- "payload": {
- "id": "0d0ab26c-bb74-42af-841a-78c94c5f9453",
- "accountId": "692b87f6-2c34-4a2c-8af7-040b74c7bbd0",
- "parameters": {
- "outputs": [
- {
- "destination": {
- "address": "2N3oum61eFbwBvA8roU7YuR8UXnmMxr1tCE",
- "type": "Address"
}, - "amount": "1000",
- "paysFee": false
}
], - "feeStrategy": {
- "priority": "High",
- "type": "Priority"
}, - "maximumFee": "10000",
- "type": "Bitcoin"
}, - "description": "Create an intent for tx out",
- "customProperties": {
- "property1": "string",
- "property2": "string"
}, - "type": "v0_CreateTransactionOrder"
}, - "description": "Create an intent for tx out",
- "customProperties": {
- "property1": "string",
- "property2": "string"
}, - "type": "Propose"
}, - "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
required | object Details of the transaction being created |
signature required | string Signature of the "request" field above |
{- "request": {
- "author": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e"
}, - "expiryAt": "2022-01-09T10:51:00Z",
- "targetDomainId": "cef1a96b-aa13-443a-b4cc-e3286f2af910",
- "id": "b0393b72-83e8-4809-ba89-7e63ea11a49a",
- "payload": {
- "id": "0d0ab26c-bb74-42af-841a-78c94c5f9453",
- "accountId": "692b87f6-2c34-4a2c-8af7-040b74c7bbd0",
- "parameters": {
- "outputs": [
- {
- "destination": {
- "address": "2N3oum61eFbwBvA8roU7YuR8UXnmMxr1tCE",
- "type": "Address"
}, - "amount": "1000",
- "paysFee": false
}
], - "feeStrategy": {
- "priority": "High",
- "type": "Priority"
}, - "maximumFee": "10000",
- "type": "Bitcoin"
}, - "description": "Create an intent for tx out",
- "customProperties": {
- "property1": "string",
- "property2": "string"
}, - "type": "v0_CreateTransactionOrder"
}, - "description": "Create an intent for tx out",
- "customProperties": {
- "property1": "string",
- "property2": "string"
}, - "type": "Propose"
}, - "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
{- "id": "string"
}
transactionId required | string |
approverId required | string |
{- "request": {
- "author": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e"
}, - "targetDomainId": "6319e504-a82c-4cca-93a5-b46145310588",
- "intentId": "d7492216-bec4-4daf-8326-5a05aaafe561",
- "proposalSignature": "string",
- "type": "Approve"
}, - "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
required | object Details of the request being approved/rejected |
signature required | string Signature of the "request" field above |
{- "request": {
- "author": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "domainId": "8a0b02c3-fdd8-452e-bc6e-ef07a335ec7e"
}, - "targetDomainId": "6319e504-a82c-4cca-93a5-b46145310588",
- "intentId": "d7492216-bec4-4daf-8326-5a05aaafe561",
- "proposalSignature": "string",
- "type": "Approve"
}, - "signature": "MEUCIC3VIuw4pfk+BLnZrk1qklGS9phAlQFSQoAnlhw59x7cAiEAm5nq8ANlHcRNcONj5FXXl1v0EK5U8gZyQ22geFSsFL8="
}
{- "id": "string"
}
{- "companyId": "ZTEST",
- "fromWallet": "ZTEST-NOBENF-849P8XKKAO",
- "toAddress": "tb1ql7w62elx9ucw4pj5lgw4l028hmuw80sndtntxt",
- "consumerMetadata": "metadata",
- "transferId": "TRO-API-ZTEST-4001",
- "transferStatus": "CONFIRMED",
- "amountLedger": 641400,
- "feeType": "HIGH",
- "feeAmountLedger": 165,
- "ledgerRef": "fd1c22fd097501606fddbc7d22e5009d45e9e6cb7115ad109a46f8319a385bd4",
- "createdAt": "2021-08-03T18:17:57Z",
- "currency": "string",
- "feeCurrency": "string"
}
from | string Examples:
Start and inclusive date/time of the query |
to | string Examples:
End and inclusive date/time of the query |
{- "from": "2021-08-03T18:17:57Z",
- "to": "2021-08-03T18:17:57Z",
- "transferOutStats": {
- "CANCELLED BY MAKER": 110,
- "REJECTED BY AUTHORISER": 40,
- "FAILED": 367,
- "CONFIRMED": 20,
- "REJECTED BY SYSTEM": 126
}, - "transferInStats": {
- "UNLOCKED": 994,
- "REJECTED BY SYSTEM": 37,
- "PENDING UNLOCK": 38
}
}
{- "companyId": "ZTEST",
- "fromAddress": [
- "tb1qtx38mjl8gyg9gjk58tw88upytxwyxhmcqsv3le"
], - "toWallet": "ZTEST-NOBENF-849P8XKKAO",
- "toAddress": "2Mz5ZH9e6Q53QfK2E1Azaos3Vq62niibhc1",
- "transferId": "TRI-ZTEST-63Q4DZ0KJP",
- "transferStatus": "PENDING_UNLOCK",
- "amountLedger": 641400,
- "ledgerRef": "2f6e77f8c4313d0925f71acf19a659398115bdf903e3af06b3b1776e756c096f",
- "actionId": "TX_IN_ACTION-ZTEST-7LE2JCPZ3D",
- "method": "TRANSFER",
- "createdAt": "2021-08-03T18:17:57Z",
- "currency": "string"
}