openapi: 3.0.0
info:
version: 2.0.0
title: Anchorage Digital API Reference Addresses Transactions API
contact:
email: api@anchorage.com
description: "# Introduction\n*CONFIDENTIAL: Please do not distribute this documentation externally without prior Anchorage Digital approval.*\n\n\nThe Anchorage Digital REST API v2.0 provides a set of operations and resources that allow Anchorage Digital clients and partners to:\n - Programmatically transfer funds from an Anchorage Digital vault or wallet without human intervention\n - Create and list deposit addresses in a vault\n - Read and monitor vault balances\n - Query transaction history including deposits\n - Request quotes from and execute trades with the Anchorage Digital trading desk\n\n\nWant help or to share your opinion on how this API works for you? Please contact api@anchorage.com.\n\n\n# Authentication and Security\n\nThe Anchorage Digital API performs authentication and authorization via a combination of:\n\n\n* An API key, which is a bearer token\n\n* A permission group signed by the user's organization, which is linked to the API key\n\n* An Ed25519 Signature, which comes from a user-generated key and is required for certain requests\n\n\n## Permission Groups\n\n\nA permission group acts as a set of rules for how an organization and its resources can be accessed. Permission groups are created independently of API keys, and new permission groups must be created prior to making an API key.\n\n\nEach permission group has a name, a description and a set of permissions which can be applied to your organization's vaults. Updating, creating and deleting permissions groups require a quorum of approvals. After creation, a permission group can be freely assigned to an unlimited number of API keys.\n\n\nEach API key inherits its permissions from the associated permission group. When the permission group is updated, all API keys associated with it will inherit the updated permission set. If a permission group is deleted, all associated API keys will no longer work.\n\n\nEach organization is created with a default permission group that allows read-only access. This permission group may be modified or deleted at any time, and no API keys are created by default with this permission group.\n\n\n### Permissions\n\n\nPossible vault permissions include the following:\n\n\n
\n \n | Read vault activity (READ) | \n See an overview of your vault(s) and wallets. Read vault details, balances, asset types, transaction history and deposit addresses. | \n
\n \n | Create address (CREATE_DEPOSIT_ADDRESS) | \n Receive deposits in the vault from external sources. Create and read deposit addresses. | \n
\n \n | Transfer funds (TRANSFER) | \n This permission is configurable to enable an API key endowed with this permission to either 1) Transfer funds to any Anchorage Digital institutional account, including those outside of your organization or 2) Transfer funds to any blockchain address not custodied by Anchorage Digital that has gone through quorum approval. | \n
\n \n | Propose and accept settlements (PROPOSE_ACCEPT_SETTLEMENTS) | \n This is an Atlas specific permission for initiating settlements. | \n
\n \n | Authorize settlements (AUTHORIZE_SETTLEMENTS) | \n This is an Atlas specific permission for authorizing settlements after they've been proposed or accepted. | \n
\n
\n\n\nThere are also special vault permissions for enabled by Anchorage Digital on a per-organization basis:\n\nAdditionally, there are global permissions which apply to the entire organization:\n\n\n\n \n | Initiate withdrawals (INITIATE_WITHDRAWAL) | \n Initiate withdrawals to external destinations. All withdrawals require quorum approval through the Anchorage Digital mobile app. | \n
\n \n | Execute trades (TRADE) | \n Request for quotes (RFQ) from the Anchorage Digital trading desk. Create and accept quotes. Read data of trades and settlements created by this key. | \n
\n \n | Read trade activity (READ_TRADE) | \n Read trade activity and trade settlements data of your organization. | \n
\n \n | Read lending activity (LENDER_READ) | \n Read lending activity of your organization. | \n
\n \n | Read facility data (FACILITY_ONLY) | \n Read lending facility data. | \n
\n \n | Read deposit attribution activity (READ_DEPOSIT_ATTRIBUTION) | \n Read deposit attribution activity of your organization. | \n
\n \n | Manage deposit attributions (DEPOSIT_ATTRIBUTION) | \n Read deposit attribution activity of your organization. Perform deposit attributions. | \n
\n \n | Initiate Staking and Unstaking (STAKE) | \n Initiate staking or unstaking operation. All operations require quorum approval through the Anchorage Digital mobile app. | \n
\n
\n\n\n### Example Workflow - Allow transfers from specific vaults\n\nTo create an API key with the ability to transfer funds from an Anchorage Digital vaults or wallet, a permission group must first be created with the **Transfer funds** permission for the desired source vaults. Creating this permission group requires a quorum of approvals on the Anchorage Digital iOS app. Once the creation is confirmed, any number of API keys may be created with this permission group in the Anchorage Digital Web Dashboard under the API 2.0 section.\n\nTo add additional permissions to the API key, update the associated permission group through the Anchorage Digital Web Dashboard. To revoke any permissions, the individual API key may be revoked, or the permission group may be updated or deleted to remove Transfer access.\n\n## API Keys\n\nAll API requests must be made over HTTPS and must include authentication using the following scheme.\n\n\n\n### Generating an API Key\n\nIn order to make a valid API request, you must first create an API key. API keys can be created and managed in the Anchorage Digital Web Dashboard under the [API 2.0 tab](https://anchoragelogin.com/api). When you create an API key, there are 3 pieces of information you will need to remember:\n - API access key\n - Ed25519 public key (optional for read-only requests)\n - Ed25519 private/signing key (optional for read-only requests)\n\nYou must generate an Ed25519 signing key pair and save the public portion in the Anchorage Digital Web Dashboard when creating the API access key. The signing key pair is used for added security with sensitive requests.\n\nPlease note, Anchorage Digital cannot recover your API access key or private signing key if you forget them. You may generate a new access key and signing key at any time if you lose access.\n\n### API Key Permissions\n\nEach API key is associated with a permission group. This permission group specifies the permitted actions for all associated API keys. Read more about permission groups [here](#section/Authentication-and-Security/Permission-Groups).\n\n### Creating a request\n\nAll requests must include the `Api-Access-Key` header, which contains your API access key as a string.\n\nEndpoints that require a signature must include the `Api-Signature` and `Api-Timestamp` headers. Read more about signatures [here](#section/Authentication-and-Security/Signatures).\n\nAll request bodies must be valid JSON and have the content type `application/json`.\n\n## Request Signatures\n\nCertain endpoints require an Ed25519 signature to be provided alongside the API key. These endpoints will specify the `Api-Signature` and `Api-Timestamp` headers as additional parameters.\n\nSignatures are optional unless explicitly required, but are encouraged for all requests. If a signature is provided, it will be verified.\n\n### Signing Keys\n\nA signing key pair is generated by the user and the corresponding public key must be provided when creating an API key.\n\nWhen creating an API key, you will be prompted to provide an Ed25519 public key. You must use the associated Ed25519 signing key (private key) when creating signatures for requests from this API key.\n\nPlease note that signing keys (Ed25519 private keys) should be stored securely by the user. The signing key should only be used to derive request signatures and should never be sent in a request. Anchorage Digital will never request you share your private key.\n\n### Generating a Signing Key\n\nThe user must securely generate an Ed25519 key pair on their own hardware and retain both the public and private portions. The Anchorage Digital API accepts a 64-character (32 bytes) hex-encoded Ed25519 public key when creating an API access key.\n\n\n#### Code sample (Python)\n\n*Generate a new signing key pair*\n\n```python\n# https://pypi.org/project/PyNaCl/\n\nimport nacl\nimport nacl.signing\nimport secrets\n\nseed = secrets.token_bytes(32)\n\n# Generate a new random signing key\nsigning_key = nacl.signing.SigningKey(seed)\n\n# Obtain the hex-encoded signing key\nprint('Signing key:')\nprint(signing_key.encode().hex())\n\n# Obtain the hex-encoded verify key for the given signing key\n# Use this in the Anchorage Digital Web Dashboard when creating an API key\nprint('Public key:')\nprint(signing_key.verify_key.encode().hex())\n```\n\n\n### Signing a Request\n\nTo sign a request, generate a request signature using the Ed25519 private (signing) key and provide it alongside the request in the `Api-Signature` header.\n\nTo create a request signature, first concatenate the `timestamp`, `method`, `request path`, and `body` into a string. Then, create a signature of this message using the Ed25519 private key and hex-encode the output. Use this value as the `Api-Signature` header and use the `timestamp` value as the `Api-Timestamp` header.\n\n- The `method` is an uppercase HTTP method (ex. `GET`, `POST`, `DELETE`)\n- The `request path` should contain all query parameters (ex. `/v2/transfers?foo=bar&baz=bang`)\n- The `body` is a stringified HTTP request body\n- The `body` should be omitted if the request does not contain a body (ex. a `GET` or `DELETE` request)\n- The `timestamp` is the same as the `Api-Timestamp` header\n- The `timestamp` is a number of seconds since the Unix Epoch in UTC, and must be within one minute of the API service's time when the request is received\n\n### Reference signature\n\nTo verify your signature generation code is correct, generate a signature for the following request and timestamp using the provided signing key. If the generated signature matches the signature below, your signature generation code is correct.\n\n\n\n \n | Timestamp | \n 1577880000 | \n
\n \n | HTTP Method (Uppercase) | \n POST | \n
\n \n | HTTP Path + query | \n /v2/transfers?foo=bar&baz=bang | \n
\n \n | HTTP Body | \n {\"source\": {\"id\": \"1c920f4241b78a1d483a29f3c24b6c4c\", \"type\": \"VAULT\"}, \"assetType\": \"ETH\", \"destination\": {\"id\": \"55e89d4a644d736b01533a2ea9b32a20\", \"type\": \"VAULT\"}, \"amount\": \"1000.00000000\"} | \n
\n \n | Signing Key (Ed25519 Private Key Seed) | \n 0101010101010101010101010101010101010101010101010101010101010101 | \n
\n \n | Public Key | \n 8a88e3dd7409f195fd52db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c | \n
\n \n | Signature | \n 4bf42054bf7db1f8a2a2bc83d2a108502ee7a9d2ac7a2738adc2f932922446786fb9be1bd1eb475023296c6cba4ddbe28b04baca4b7521b1f1840a4ffd2b4d0d | \n
\n
\n\n## Reference clients\n\n### Python (with `requests` library)\n\n*Authorize and sign requests*\n\n```python\n\n# https://pypi.org/project/PyNaCl/\n\nfrom nacl import signing\n\nimport time\n\nimport requests\n\n\nclass AnchorageAuth(requests.auth.AuthBase):\n ACCESS_KEY_HEADER = \"Api-Access-Key\"\n SIGNATURE_HEADER = \"Api-Signature\"\n TIMESTAMP_HEADER = \"Api-Timestamp\"\n\n access_key: str\n signing_key: signing.SigningKey\n\n def __init__(self, access_key: str, signing_key_seed: bytes):\n self.access_key = access_key\n self.signing_key = signing.SigningKey(signing_key_seed)\n\n def __call__(self, r: requests.PreparedRequest):\n r.headers[self.ACCESS_KEY_HEADER] = self.access_key\n\n timestamp = str(int(time.time()))\n method = r.method.upper() if r.method else \"GET\"\n body: bytes = bytes()\n if r.body and isinstance(r.body, bytes):\n body = r.body\n elif r.body and isinstance(r.body, str):\n body = bytearray(r.body, \"utf-8\")\n message = b\"\".join(\n [bytearray(timestamp, \"utf-8\"), bytearray(method, \"utf-8\"), bytearray(r.path_url, \"utf-8\"), body]\n )\n signature = self.signing_key.sign(message).signature.hex()\n r.headers[self.SIGNATURE_HEADER] = signature\n r.headers[self.TIMESTAMP_HEADER] = timestamp\n return r\n\n\n# load secrets\n\n# Use the API key generated in the Anchorage Digital Web Dashboard\n\naccess_key = ...\n\n# Use the Ed25519 signing private key\n\nsigning_key_str = ... # load the raw string\n\nsigning_key = bytes(bytearray.fromhex(signing_key_str))\n\ndata = {}\n\nanchorage_auth = AnchorageAuth(access_key, signing_key)\n\nr = requests.post(\"https://api.anchorage.com/v2/transfers\", data=data, auth=anchorage_auth)\n\n```\n\n### Ruby - Reproduce reference signature\n```ruby\n require \"ed25519\"\n require \"net/http\"\n require \"time\"\n\n def hex_to_bin(s)\n [s].pack('H*')\n end\n\n def bin_to_hex(s)\n s.unpack('H*').first\n end\n\n private_key_seed_hex = '0101010101010101010101010101010101010101010101010101010101010101'\n public_key_hex = '8a88e3dd7409f195fd52db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c'\n key_pair_hex = private_key_seed_hex + public_key_hex\n\n key_pair = hex_to_bin(key_pair_hex)\n\n signing_key = Ed25519::SigningKey.from_keypair(key_pair)\n\n timestamp = '1577880000' # Time.now.to_i.to_s\n\n req = Net::HTTP::Post.new('/v2/transfers?foo=bar&baz=bang')\n req.body = '{\"source\": {\"id\": \"1c920f4241b78a1d483a29f3c24b6c4c\", \"type\": \"VAULT\"}, \"assetType\": \"ETH\", \"destination\": {\"id\": \"55e89d4a644d736b01533a2ea9b32a20\", \"type\": VAULT\"}, \"amount\": \"1000.00000000\"}'\n\n signature = signing_key.sign(timestamp + req.method + req.path + req.body)\n\n req['Api-Access-Key'] = 'YOUR_ACCESS_KEY'\n req['Api-Timestamp'] = timestamp\n req['Api-Signature'] = bin_to_hex(signature)\n\n puts bin_to_hex(signature)\n```\n\n# Errors\n\n\nThe Anchorage Digital API returns standard HTTP error codes for each API request.\n\n\n\n \n | Response Code | \n Description | \n
\n
\n | 200 OK | \n The request was successful. | \n
\n \n | 400 Bad Request | \n The request was improperly formed and could not be understood by the server, often due to invalid syntax, insufficient funds, or a missing required parameter. | \n
\n \n | 401 Unauthorized | \n The request was missing a valid API key. | \n
\n \n | 403 Forbidden | \n The provided API key does not have permission to perform the requested action. | \n
\n \n | 404 Not Found | \n The requested resource does not exist. | \n
\n \n | 409 Conflict | \n The requested resource cannot proceed with the requested action because it is not in the required state. | \n
\n \n | 429 Too Many Requests | \n Too many requests have been sent in a given amount of time. | \n
\n \n \n 500 Internal Server Error\n \n 502 Bad Gateway\n \n 503 Service Unavailable\n \n 504 Gateway Timeout\n | \n Something went wrong on Anchorage’s side. We have been alerted and are working on it. | \n
\n
\n\n\nIn addition to returning HTTP error codes for failed requests, the Anchorage Digital API includes a readable error message describing what went wrong in the response body.\n\n\n\n\n\n# Idempotency\n\n\nCertain endpoints support idempotent requests so that a given request can be safely retried without performing the same operation twice. For example, if a request to transfer funds does not respond due to network issues, you can retry the request using the same idempotent ID to ensure that only one transfer is created.\n\n\nEndpoints that support idempotent requests have an optional `idempotentId` field that can be included in the body of the `POST` request. Provide a unique string using your method of choice (such as a v4 UUID).\n\n\nIf a request is valid, Anchorage Digital will save the request indefinitely. If a subsequent request is received with the same `idempotentId` we will return the previously saved response for that `idempotentId`.\n\n\n# Rate Limits\n\n\nKeys provisioned by an Organization share one common rate limit. API requests are limited to 20 requests per second per Organization, allowing for bursts of up to 100 requests within a single second.\n\n\n# Pagination\n\n\nCursor pagination is used for REST endpoints which return multiple data points. Pagination allows for fetching data after the current page and specifying how many records to return. The `next` cursor is available in responses with the `page` attribute. Requests should use the `next` cursor URL to query subsequent data. Query parameter `afterId` specifies the last record previously retrieved. Some endpoints instead use the `endDate` parameter to specify the end date and older for records to retrieve. Query parameter `limit` specifies the maximum number of records in a response.\n\n## Parameters\n\n\n \n | Parameter | \n Description | \n
\n | afterId | \n Request page after (older than) this pagination id. | \n
\n \n | endDate | \n Request records older than this date (YYYY-MM-DD format). Used for /trading/trades and /trading/settlements resources. | \n
\n \n | limit | \n Maximum number of results requested. Default usually 25, but varies depending on resource. | \n
\n
\n\n## Example\n\n`GET /v2/transfers?afterId=1968b94b09b8a1a8a381775d1f04978c424d891d50e517774bf984297985b471&limit=100`\n\n## Next cursor\n\nThe `next` cursor is a URL which references the last record in a set of records. When queried, the `next` cursor URL will return subsequent records, but otherwise using the same query parameters."
servers:
- url: https://api.anchorage-staging.com/v2
security:
- Api-Access-Key: []
tags:
- description: 'Transactions include all of the blockchain actions that affect your vault balances, such as withdrawals, deposits, transfers, and participation actions. Each transaction may have a corresponding blockchain transaction.
Only transactions that are final will be returned. This includes all successful transactions as well as unsuccessful transactions where a blockchain fee was paid.
Deposits, once confirmed on-chain, are subject to collection of originator data. Check the [Deposit Attribution](#tag/Deposit-Attribution) section for details.
'
name: Transactions
paths:
/transactions/withdrawal:
post:
operationId: createWithdrawal
summary: Create a withdrawal request
description: "Permissions required: **Initiate withdrawals**\n\n\n\n#### Identify the sending asset\n\n\nTo initiate a withdrawal from a wallet to an external destination, you must identify which asset you'd like to withdraw funds from. Provide a `source` (with `id` and `type`).\n\n\n#### Identify the receiving resource\n\n\nChoose a resource to receive the funds as the `destination`. This resource may belong to your organization (wallet) or another organization (address, standing instruction).\n\n\n#### Permissions\n\n\nThe provided API key must be associated with a [permission group](#section/Authentication-and-Security/Permission-Groups) that has Initiate withdrawals permission for the sending vault.\n\n\n#### Additional Metadata\n\n\nYou may provide a `description` with each withdrawal, that will be visible within your organization in the Anchorage Digital iOS Application.\n\n\n#### Successful Withdrawals\n\n\nIf the withdrawal request is valid, the request will initiate a withdrawal transaction from the sending wallet. This is a common withdrawal that, unlike Transfers, will still require a quorum of approvals on the Anchorage Digital iOS app and will undergo manual Anchorage Digital Risk Review. Like other transactions, these withdrawals will be visible on the Anchorage Digital iOS Application, the Web Dashboard, and in the [list transactions](#operation/getTransactions) API endpoint.\n\n\n#### Unsuccessful Withdrawals\n\n\nA withdrawal request may fail for any of the following reasons:\n\n - An ongoing withdrawal already exists (unlike transfers, withdrawal requests are not queued)\n - The specified asset does not exist\n - The specified amount exceeds the available funds for this asset (insufficient funds)\n - The destination address is invalid\n - The provided API key does not have permissions to initiate withdrawals from this wallet\n\nIf the initiated withdrawal is approved by the quorum, the transaction may fail for any of the following reasons:\n\n - There are insufficient funds to pay the blockchain network fee at the time of this transaction\n - There is a failure on the blockchain\n"
parameters:
- name: Api-Signature
in: header
description: "A hex-encoded Ed25519 signature of `timestamp_epoch_seconds + uppercase(http_method) + request_path + request_body`.\n\n\n\nConstruction example:\n\n ```\n toHex(\n ed25519Sign(\n signing_key,\n '{}{}{}{}'.format(timestamp_epoch_seconds, toUpper(httpMethod), httpRequestPath, httpBody)\n )\n )\n ```\n"
required: true
schema:
type: string
pattern: ^[0-9A-Fa-f]{128,160}$
- name: Api-Timestamp
in: header
description: Current timestamp, represented as unix epoch seconds
required: true
schema:
type: integer
format: int64
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WithdrawalRequest'
responses:
'201':
description: Successfully initiated a withdrawal
content:
application/json:
schema:
$ref: '#/components/schemas/WithdrawalResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'401':
description: Unauthenticated
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Transactions
x-security:
Initiate withdrawals: checkSourceVault
/transactions:
get:
operationId: getTransactions
summary: List transactions
description: "Permissions required: **Read vault activity**\n\n\n\n\nList all transactions for the vaults permissioned to your API key. You can retrieve metadata about your API key from the [API Key](#tags/API-Key) endpoints.\n\n\nNOTE: price and USD value information is recent but does not reflect real-time data.\n\n\n**Filters**\n\n\n\nYou may optionally supply the following filters:\n\n\n - Set a date range by providing the `startDate` and/or `endDate` query parameters. The date refers to the end time of a transaction: when the transaction succeeded or failed. If the date parameters are omitted, all transactions will be returned.\n - Select transactions involving a specific vault by providing the `vaultId` parameter. If the `vaultId` parameter is omitted, transactions for all vaults for which your API key is permissioned will be returned.\n - Filter transactions of one or more types with the `types` parameter. Multiple types should be separated by commas.\n - Select transactions involving a specific wallet by providing the `walletId` parameter. If the `walletId` parameter is omitted, transactions for all vaults for which your API key is permissioned will be returned.\n - Filter transactions by the receiving address with the `destinationAddress` parameter.\n"
parameters:
- name: vaultId
in: query
description: The vault ID to get transactions for
schema:
type: string
- name: startDate
in: query
description: The start date (inclusive) in `YYYY-MM-DD` format. The earliest valid start date is '2017-01-01`. Dates are always in UTC [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) 'full-date'.
schema:
type: string
format: date
- name: endDate
in: query
description: The end date (inclusive) in `YYYY-MM-DD` format. The latest valid end date is the current date. Dates are always in UTC [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) 'full-date'.
schema:
type: string
format: date
- name: afterId
in: query
description: When paginating this is used to provide the starting point for the page to fetch (retrieved from the previous response body)
schema:
type: string
- name: limit
in: query
description: Maximum number of results to return per query
schema:
type: integer
format: int64
default: 25
maximum: 100
minimum: 1
- name: types
in: query
description: A comma-separated list of transaction types to return.
schema:
type: array
items:
type: string
enum:
- DEPOSIT
- WITHDRAW
- TRANSFER
- DELEGATION_REWARD
- STAKING_REWARD
- RESTAKING_REWARD
- ALLUVIAL_STAKING_REWARD
- MINT
- BURN
- DIEM_PREBURN
- GAS_STATION
- OTHER
uniqueItems: true
explode: false
style: form
- name: walletId
in: query
description: An ID uniquely identifying an Anchorage Digital wallet
schema:
type: string
- name: destinationAddress
in: query
description: The destination address on the transaction for which results will be returned
schema:
type: string
responses:
'200':
description: A list of transactions
content:
application/json:
schema:
$ref: '#/components/schemas/TransactionsResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'401':
description: Unauthenticated
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Transactions
x-security:
Read vault activity: present
/transactions/{transactionId}:
get:
operationId: getTransaction
summary: Get transaction by ID
description: 'Permissions required: **Read vault activity**
Get transaction by ID.
'
parameters:
- name: transactionId
in: path
description: The ID of the transaction to get details for
required: true
schema:
type: string
responses:
'200':
description: A transaction's metadata
content:
application/json:
schema:
$ref: '#/components/schemas/TransactionResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'401':
description: Unauthenticated
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Transactions
x-security:
Read vault activity: present
/transactions/stake:
post:
operationId: createStake
summary: Create a stake request
description: "Permissions required: **Initiate Staking and Unstaking**\n\n\n\n#### Identify the sending asset\n\n\nTo initiate a staking operation, you must identify which asset you'd like to stake funds from. Provide a `source` and `assetType`.\n\n\n\n#### Permissions\n\n\nThe provided API key must be associated with a [permission group](#section/Authentication-and-Security/Permission-Groups) that has Initiate Staking and Unstaking permission for the sending vault.\n\n\n#### Additional Metadata\n\n\nYou may provide a `description` with each staking operation, that will be visible within your organization in the Anchorage Digital iOS Application.\n\n\n#### Successful Staking\n\n\nIf the stake request is valid, the request will initiate a stake transaction from the sending wallet. It will still require a quorum of approvals on the Anchorage Digital iOS app and will undergo manual Anchorage Digital Risk Review. Like other transactions, these will be visible on the Anchorage Digital iOS Application, the Web Dashboard, and in the [list transactions](#operation/getTransactions) API endpoint.\n\n\n#### Unsuccessful Stakes\n\n\nA stake request may fail for any of the following reasons:\n\n - An ongoing stake already exists\n - The specified asset does not exist\n - The specified amount exceeds the available funds for this asset (insufficient funds)\n - The provided API key does not have permissions to initiate staking from this vault\n\nIf the initiated stake is approved by the quorum, the transaction may fail for any of the following reasons:\n\n - There are insufficient funds to pay the blockchain network fee at the time of this transaction\n - There is a failure on the blockchain\n\n\n#### Feature under development\n\n\nCurrently, specific assets parameters are under development and will not be considered in any staking request. These include:\n\n - Solana staking;\n - ETH Pectra staking.\n"
parameters:
- name: Api-Signature
in: header
description: "A hex-encoded Ed25519 signature of `timestamp_epoch_seconds + uppercase(http_method) + request_path + request_body`.\n\nConstruction example:\n\t```\n\ttoHex(\n\t\ted25519Sign(\n\t\tsigning_key,\n\t\t'{}{}{}{}'.format(timestamp_epoch_seconds, toUpper(httpMethod), httpRequestPath, httpBody)\n\t\t)\n\t)\n\t```"
required: true
schema:
type: string
pattern: ^[0-9A-Fa-f]{128,160}$
- name: Api-Timestamp
in: header
description: Current timestamp, represented as unix epoch seconds
required: true
schema:
type: integer
format: int64
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateStakeRequest'
responses:
'201':
description: Successfully initiated a stake transaction
content:
application/json:
schema:
$ref: '#/components/schemas/CreateStakeResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'401':
description: Unauthenticated
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Transactions
x-security:
Initiate Staking and Unstaking: checkSourceVault
/transactions/unstake:
post:
operationId: createUnstake
summary: Create an unstake request
description: "Permissions required: **Initiate Staking and Unstaking**\n\n\n\n#### Identify the sending asset\n\n\nTo initiate an unstake transaction, you must identify which asset you'd like to unstake funds from. Provide a `source` and `assetType`.\n\n\n\n#### Permissions\n\n\nThe provided API key must be associated with a [permission group](#section/Authentication-and-Security/Permission-Groups) that has Initiate Staking and Unstaking permission for the sending vault.\n\n\n#### Additional Metadata\n\n\nYou may provide a `description` with each stake, that will be visible within your organization in the Anchorage Digital iOS Application.\n\n\n#### Successful Unstakes\n\n\nIf the stake request is valid, the request will initiate a stake transaction from the sending wallet. It will still require a quorum of approvals on the Anchorage Digital iOS app and will undergo manual Anchorage Digital Risk Review. Like other transactions, these will be visible on the Anchorage Digital iOS Application, the Web Dashboard, and in the [list transactions](#operation/getTransactions) API endpoint.\n\n\n#### Unsuccessful Unstakes\n\n\nA unstake request may fail for any of the following reasons:\n\n - An ongoing unstake already exists\n - The specified asset does not exist\n - The specified amount exceeds the available funds to unstake for this asset (insufficient funds)\n - The provided API key does not have permissions to initiate staking from this vault\n\nIf the initiated stake is approved by the quorum, the transaction may fail for any of the following reasons:\n\n - There are insufficient funds to pay the blockchain network fee at the time of this transaction\n - There is a failure on the blockchain\n"
parameters:
- name: Api-Signature
in: header
description: "A hex-encoded Ed25519 signature of `timestamp_epoch_seconds + uppercase(http_method) + request_path + request_body`.\n\nConstruction example:\n\t```\n\ttoHex(\n\t\ted25519Sign(\n\t\tsigning_key,\n\t\t'{}{}{}{}'.format(timestamp_epoch_seconds, toUpper(httpMethod), httpRequestPath, httpBody)\n\t\t)\n\t)\n\t```"
required: true
schema:
type: string
pattern: ^[0-9A-Fa-f]{128,160}$
- name: Api-Timestamp
in: header
description: Current timestamp, represented as unix epoch seconds
required: true
schema:
type: integer
format: int64
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUnstakeRequest'
responses:
'201':
description: Successfully initiated a unstake transaction
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUnstakeResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'401':
description: Unauthenticated
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Transactions
x-security:
Initiate Staking and Unstaking: checkSourceVault
/transactions/collect:
post:
operationId: collectStaking
summary: Create a collect request
description: 'Permissions required: **Initiate Staking and Unstaking**
In staking, the "collect" operation is the action of claiming inactive unstaked amount back to
the available balance by moving them from the staking protocol or pool into a personal wallet. Once collected, these amounts are fully under wallet''s owner control.
*NOTE: This endpoint is under development.*'
parameters:
- name: Api-Signature
in: header
description: "A hex-encoded Ed25519 signature of `timestamp_epoch_seconds + uppercase(http_method) + request_path + request_body`.\n\nConstruction example:\n\t```\n\ttoHex(\n\t\ted25519Sign(\n\t\tsigning_key,\n\t\t'{}{}{}{}'.format(timestamp_epoch_seconds, toUpper(httpMethod), httpRequestPath, httpBody)\n\t\t)\n\t)\n\t```"
required: true
schema:
type: string
pattern: ^[0-9A-Fa-f]{128,160}$
- name: Api-Timestamp
in: header
description: Current timestamp, represented as unix epoch seconds
required: true
schema:
type: integer
format: int64
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateCollectRequest'
responses:
'201':
description: Successfully initiated a collect transaction
content:
application/json:
schema:
$ref: '#/components/schemas/CreateCollectResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'401':
description: Unauthenticated
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'501':
description: Not Implemented Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Transactions
x-security:
Initiate Staking and Unstaking: checkSourceVault
/transactions/consolidate-stake:
post:
operationId: createConsolidateStake
summary: Create a consolidate stake request
description: 'Permissions required: **Initiate Staking and Unstaking**
Consolidate a source staking position into a target staking position.
Only supported for Ethereum 0x02 validators.
'
parameters:
- name: Api-Signature
in: header
description: "A hex-encoded Ed25519 signature of `timestamp_epoch_seconds + uppercase(http_method) + request_path + request_body`.\n\nConstruction example:\n\t```\n\ttoHex(\n\t\ted25519Sign(\n\t\tsigning_key,\n\t\t'{}{}{}{}'.format(timestamp_epoch_seconds, toUpper(httpMethod), httpRequestPath, httpBody)\n\t\t)\n\t)\n\t```"
required: true
schema:
type: string
pattern: ^[0-9A-Fa-f]{128,160}$
- name: Api-Timestamp
in: header
description: Current timestamp, represented as unix epoch seconds
required: true
schema:
type: integer
format: int64
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateConsolidateStakeRequest'
responses:
'201':
description: Successfully initiated a consolidate stake transaction
content:
application/json:
schema:
$ref: '#/components/schemas/CreateStakeResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'401':
description: Unauthenticated
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Transactions
x-security:
Initiate Staking and Unstaking: checkSourceVault
/delegation-addresses/{assetType}:
get:
operationId: getDelegationAddresses
summary: List supported delegation addresses
description: 'Permissions required: **Initiate Staking and Unstaking**
#### Identify the sending asset
To initiate an operation, you must identify which asset you''d like to view the delegation addresses for. Provide an `assetType`.
#### Permissions
The provided API key must be associated with a [permission group](#section/Authentication-and-Security/Permission-Groups) that has Initiate Staking and Unstaking permission for the sending vault.
'
parameters:
- name: assetType
in: path
description: The asset type to retrieve delegation addresses
required: true
schema:
type: string
- name: afterId
in: query
description: When paginating this is used to provide the starting point for the page to fetch (retrieved from the previous response body)
schema:
type: string
- name: limit
in: query
description: Maximum number of results to return per query
schema:
type: integer
format: int64
default: 25
maximum: 100
minimum: 1
responses:
'200':
description: List of delegation addresses for this asset
content:
application/json:
schema:
$ref: '#/components/schemas/DelegationAddressesResponse'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'401':
description: Unauthenticated
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Transactions
components:
schemas:
TransactionDetails:
type: object
properties:
amount:
$ref: '#/components/schemas/Amount'
assetType:
description: 'A string representing a type of crypto-asset, which usually corresponds to the crypto asset''s ticker symbol.
Use `/asset-types` to list all of the supported asset types for your organization.
'
type: string
example: BTC
blockchainTxId:
description: The blockchain transaction ID, once available
type: string
example: '0xd7b99c44240ae5bdd7d2f8572358ee2a521c4d93b74c8fd3df6557ac9f02b008'
dateTime:
description: The timestamp of the transaction's final state (completion or failure)
type: string
format: date-time
example: '2019-01-02T12:34:56.000Z'
nullable: true
description:
description: A string providing more context to this transaction. Will commonly return the input provided by the user when the transaction was requested. For transfers, the memo provided in the TransfersRequest will populate the `description` field of both the resultant Transfer in the source vault and the resultant Deposit in the destination vault.
type: string
example: Withdrawing to exchange
destinationAddresses:
description: The destination addresses for a transaction
type: array
items:
type: string
extra:
description: Blockchain asset-specific details such as a memo in XLM
type: string
example: Blockchain-specific details, such as memo in XLM
fee:
$ref: '#/components/schemas/Amount'
id:
description: An ID uniquely identifying a transaction within Anchorage Digital
type: string
example: 9d570c38a148a6e0b4facf1e0d8c27dd6eba48c41421be1ba8bb778cbeb1a4df
sourceAddresses:
description: The originating addresses for a transaction
type: array
items:
type: string
status:
$ref: '#/components/schemas/TransactionStatus'
transactionType:
$ref: '#/components/schemas/TransactionType'
vaultId:
description: An ID uniquely identifying an Anchorage Digital vault.
type: string
example: 1c920f4241b78a1d483a29f3c24b6c4c
vaultName:
description: The name of the vault which the transaction affected
type: string
example: Long Hold Vault
walletId:
description: An ID uniquely identifying an Anchorage Digital wallet
type: string
example: d24b424293c0d64c6194f52801b3d293
required:
- id
- amount
- status
- transactionType
- vaultId
- vaultName
- assetType
- description
title: TransactionDetails
CreateStakeDetails:
type: object
properties:
transactionId:
description: The transaction Id which can be used to reference this operation in other queries
type: string
example:
transactionId: 8696144cca28a634c05858d00e51191408498a7808a837fc4645b4b6997dde09
required:
- transactionId
title: CreateStakeDetails
CreateCollectResponse:
type: object
properties:
data:
$ref: '#/components/schemas/CreateStakeDetails'
required:
- data
title: CreateCollectResponse
TransactionStatus:
description: 'A string describing the status of the given transaction
* INITIATING - This transaction is being created
* SUCCESS - This transaction has succeeded
* NEEDS_APPROVAL - This transaction has begun but is awaiting approval by members of the quorum
* INPROGRESS - This transaction is currently in progress
* FAILURE - This transaction has failed
* REJECTED - This transaction has been rejected
* EXPIRED - This transaction has expired
'
type: string
enum:
- INITIATING
- SUCCESS
- NEEDS_APPROVAL
- INPROGRESS
- FAILURE
- REJECTED
- EXPIRED
title: TransactionStatus
CreateStakeRequest:
type: object
properties:
amount:
description: An amount of a crypto-asset to transfer, without units. The unit is derived from the asset type.
type: string
example: '32'
assetType:
description: 'A string representing a type of crypto-asset, which usually corresponds to the crypto asset''s ticker symbol.
Use `/asset-types` to list all of the supported asset types for your organization.
'
type: string
example: ETH
description:
description: An optional string providing more context to this transaction. It will be visible on the Anchorage Digital iOS app and will not be published to the blockchain.
type: string
example: 'Internal ID: #12838927347'
nullable: true
idempotentId:
description: A client-provided unique ID for idempotent requests
type: string
example: '12838927347'
maxLength: 128
parameters:
$ref: '#/components/schemas/StakingParameters'
source:
$ref: '#/components/schemas/SimpleSourceResourceDetails'
required:
- assetType
- amount
- idempotentId
- source
title: CreateStakeRequest
Amount:
description: 'An amount of a crypto-asset represented by quantity, assetType, current unit price and current USD value.
Fee amounts will be estimates if a transaction is not final.
NOTE: price and USD value information is recent but does not reflect real-time data.
'
type: object
properties:
assetType:
description: 'A string representing a type of crypto-asset, which usually corresponds to the crypto asset''s ticker symbol.
Use `/asset-types` to list all of the supported asset types for your organization.
'
type: string
example: BTC
currentPrice:
description: A recent assessment of the intra-day USD value of 1 unit of this asset type. This value is provided for convenience for such use cases as estimating point-in-time portfolio balances. This value does not represent authoritative pricing information used by Anchorage Digital for any purpose. The price is fetched as of the present, and may be omitted in certain contexts where more structured pricing information is provided (e.g. quotes and trades).
type: string
example: '9751.01'
currentUSDValue:
description: The result of `quantity * currentPrice`, rounded to the nearest cent. A unitless number implicitly denominated in dollars. See `currentPrice` for methodology and disclaimers.
type: string
example: '101920.94'
quantity:
description: The numeric value of this amount, excluding units
type: string
example: '10.45234733'
example:
quantity: '10.45234733'
assetType: BTC
currentPrice: '9751.01'
currentUSDValue: '101920.94'
required:
- quantity
- assetType
title: Amount
SourceResourceTypeRequest:
description: The type of the resource being referenced. Note that the VAULT type has been deprecated and WALLET should be used instead.
type: string
enum:
- VAULT
- WALLET
- SUBACCOUNT
title: SourceResourceType
WithdrawalDetails:
type: object
properties:
withdrawalId:
description: The withdrawal ID which can be used to reference this operation in other queries
type: string
example:
withdrawalId: 8696144cca28a634c05858d00e51191408498a7808a837fc4645b4b6997dde09
required:
- withdrawalId
title: WithdrawalDetails
ResourceDetails:
description: "An object representing a resource capable of receiving, or holding funds.\n\n\n\nConstruction example:\n\n ```\n {\n \"id\":\"1c920f4241b78a1d483a29f3c24b6c4c\",\n \"type\":\"WALLET\"\n }\n ```\n"
type: object
properties:
id:
description: The identifier of the resource
type: string
example: 1c920f4241b78a1d483a29f3c24b6c4c
type:
$ref: '#/components/schemas/ResourceType'
required:
- id
- type
title: Resource
CreateUnstakeRequest:
type: object
properties:
amount:
description: An amount of a crypto-asset to unstake, without units. The unit is derived from the asset type.
type: string
example: '32'
nullable: true
assetType:
description: 'A string representing a type of crypto-asset, which usually corresponds to the crypto asset''s ticker symbol.
Use `/asset-types` to list all of the supported asset types for your organization.
'
type: string
example: ETH
description:
description: An optional string providing more context to this transaction. It will be visible on the Anchorage Digital iOS app and will not be published to the blockchain.
type: string
example: 'Internal ID: #12838927347'
nullable: true
idempotentId:
description: A client-provided unique ID for idempotent requests
type: string
example: '12838927347'
maxLength: 128
isFullAmount:
description: Specifies whether to unstake the full amount, which overrides any provided amount if set to true.
type: boolean
default: false
source:
$ref: '#/components/schemas/SimpleSourceResourceDetails'
stakingPositionId:
description: Unique identifier of the staking position
type: string
example: 9bc4c2ccba8192b64d41b46d1770abe9ddbb430b85de3fe73e1b4f21336bc48a
required:
- assetType
- idempotentId
- source
title: CreateUnstakeRequest
WithdrawalParametersForFiatTrustedDestination:
description: Additional parameters to be provided exclusively when the destination is a Trusted Destination and `assetType` is fiat.
type: object
properties:
memo:
description: Note to Beneficiary. If not provided, the memo on the Trusted Destination will be used by default.
type: string
example: Invoice 123
maxLength: 35
purpose:
description: "The purpose of the funds being withdrawn.\n\n * `TRADING_SETTLEMENT` - Trading Settlement\n * `LENDING` - Lending\n * `INVESTMENT` - Investment\n * `EXPENSES` - Expenses\n * `FEE_PAYMENT` - Fee Payment\n * `GRANT_PAYMENT` - Grant Payment\n * `PRIZE_AWARD` - Prize Award\n * `GIFT` - Gift\n * `REIMBURSEMENT` - Reimbursement\n * `REBALANCE` - Rebalance\n * `INTRA_COMPANY` - Intra Company"
type: string
example: TRADING_SETTLEMENT
enum:
- TRADING_SETTLEMENT
- LENDING
- INVESTMENT
- EXPENSES
- FEE_PAYMENT
- GRANT_PAYMENT
- PRIZE_AWARD
- GIFT
- REIMBURSEMENT
- REBALANCE
- INTRA_COMPANY
required:
- purpose
title: WithdrawalParametersForFiatTrustedDestination
TransactionType:
description: 'The type of transaction
* "DEPOSIT" - A deposit has been detected in an Anchorage Digital vault
* "WITHDRAW" - A withdraw of funds from your Anchorage Digital vault to another destination
* "TRANSFER" - A transfer activity between Anchorage Digital vaults
* "STAKING_REWARD" - A reward granted for staking contribution in certain currencies
* "RESTAKING_REWARD" - A reward granted for restaking contribution in certain currencies
* "ALLUVIAL_STAKING_REWARD" - A reward granted for staking contribution through Alluvial
* "DELEGATION_REWARD" - A reward granted for delegation in certain currencies
* "MEV_REWARD" - Maximal Extractable Value (MEV) reward granted while holding certain currencies
* "PRIORITY_FEE_REWARD" - Priority fee reward granted for Jito priority fee distributions on Solana
* "FIAT_INTEREST" - Fiat interest payment deposited into the account
* "MINT" - Assets minted or created on the blockchain
* "BURN" - Assets burned or destroyed on the blockchain
* "DIEM_PREBURN" - A movement of assets on the Diem blockchain to a state of preburn
* "GAS_STATION" - Funds received from the gas station to cover network fees
* "OTHER" - Any other activity associated to your Anchorage Digital vault that isn''t a deposit, withdraw, transfer, staking reward, delegation reward, mint, burn, or preburn transaction
'
type: string
example: WITHDRAW
enum:
- DEPOSIT
- WITHDRAW
- TRANSFER
- STAKING_REWARD
- RESTAKING_REWARD
- ALLUVIAL_STAKING_REWARD
- DELEGATION_REWARD
- MEV_REWARD
- PRIORITY_FEE_REWARD
- FIAT_INTEREST
- MINT
- BURN
- DIEM_PREBURN
- GAS_STATION
- OTHER
title: TransactionType
CreateStakeResponse:
type: object
properties:
data:
$ref: '#/components/schemas/CreateStakeDetails'
required:
- data
title: CreateStakeResponse
CreateCollectRequest:
type: object
properties:
amount:
description: An amount of a crypto-asset to unstake, without units. The unit is derived from the asset type.
type: string
example: '32'
assetType:
description: 'A string representing a type of crypto-asset, which usually corresponds to the crypto asset''s ticker symbol.
Use `/asset-types` to list all of the supported asset types for your organization.
'
type: string
example: ETH
description:
description: An optional string providing more context to this transaction. It will be visible on the Anchorage Digital iOS app and will not be published to the blockchain.
type: string
example: 'Internal ID: #12838927347'
nullable: true
idempotentId:
description: A client-provided unique ID for idempotent requests
type: string
example: '12838927347'
maxLength: 128
isFullAmount:
description: Specifies whether to collect the full amount, which overrides any provided amount if set to true.
type: boolean
default: false
source:
$ref: '#/components/schemas/SimpleSourceResourceDetails'
stakingPositionId:
description: Unique identifier of the staking position
type: string
example: 9bc4c2ccba8192b64d41b46d1770abe9ddbb430b85de3fe73e1b4f21336bc48a
required:
- assetType
- stakingPositionId
- source
title: CreateCollectRequest
ResourceType:
description: The type of the resource being referenced. Note that the VAULT type has been deprecated and WALLET should be used instead.
type: string
enum:
- VAULT
- WALLET
- ADDRESS
- STANDING_INSTRUCTION
title: ResourceType
SourceResourceDetailsRequest:
description: "An object representing a resource capable of sending funds.\n\n\nConstruction example:\n ```\n {\n \"id\":\"1c920f4241b78a1d483a29f3c24b6c4c\",\n \"type\":\"WALLET\"\n }\n ```\n"
type: object
properties:
customerId:
description: Identifier of a Subaccout Customer. Required property if subaccount type is JOINT, optional otherwise
type: string
id:
description: The identifier of the resource
type: string
example: 1c920f4241b78a1d483a29f3c24b6c4c
type:
$ref: '#/components/schemas/SourceResourceTypeRequest'
required:
- id
- type
title: SourceResource
WithdrawalParametersForATOM:
description: Additional parameters to be provided exclusively when `assetType` is "ATOM". This field is deprecated, please migrate to using `assetParametersCosmos` instead
type: object
properties:
memo:
description: An alphanumeric string often used to uniquely identify the recipient of the transaction, commonly used when transferring funds to custodial wallets, exchanges or other situations where the `destinationAddress` is multi-purpose. Must be included whenever provided by the recipient of the transaction.
type: string
example: w3mp19cqp2
maxLength: 256
required:
- memo
title: WithdrawalParametersForATOM
WithdrawalParametersForCosmos:
description: Additional parameters to be provided exclusively when `assetType` is for a Cosmos blockchain
type: object
properties:
memo:
description: An alphanumeric string often used to uniquely identify the recipient of the transaction, commonly used when transferring funds to custodial wallets, exchanges or other situations where the `destinationAddress` is multi-purpose. Must be included whenever provided by the recipient of the transaction.
type: string
example: w3mp19cqp2
maxLength: 256
required:
- memo
title: WithdrawalParametersForCosmos
TransactionsResponse:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/TransactionDetails'
page:
$ref: '#/components/schemas/Page'
required:
- data
- page
title: TransactionsResponse
ErrorDetails:
type: object
properties:
errorType:
$ref: '#/components/schemas/ErrorType'
message:
description: A human-readable message providing more details about the error.
type: string
example: Missing required field 'amount'.
required:
- errorType
- message
title: ErrorDetails
WithdrawalParametersForXRP:
description: Additional parameters to be provided exclusively when `assetType` is "XRP"
type: object
properties:
destinationTag:
description: A number often used to uniquely identify the recipient of the transaction, commonly used when transferring funds to custodial wallets, exchanges or other situations where the `destinationAddress` is multi-purpose. Must be included whenever provided by the recipient of the transaction.
type: integer
format: uint32
example: 23874
required:
- destinationTag
title: WithdrawalParametersForXRP
AMLQuestionnaire:
description: Anti-money laundering questionnaire submission
type: object
properties:
destinationType:
description: Where the address that will receive the withdrawal is held. Use of UNHOSTED_WALLET is deprecated and shouldn't be used. Instead use SELFHOSTED_WALLET.
type: string
example: FINANCIAL_INSTITUTION
enum:
- FINANCIAL_INSTITUTION
- UNHOSTED_WALLET
- SELFHOSTED_WALLET
institutionCountry:
description: The country of the institution on the receiving end of the withdrawal, must be specified when the `destinationType` is `FINANCIAL_INSTITUTION` (ISO 3166-1 alpha-2 code).
type: string
example: US
institutionName:
description: The name of the institution on the receiving end of the withdrawal, must be specified when the `destinationType` is `FINANCIAL_INSTITUTION`.
type: string
example: Coinbase
originatorCity:
description: The city of the person or entity that is withdrawing the funds, must be specified when the `originatorType` is `MY_CLIENT`.
type: string
example: San Francisco
originatorCountry:
description: The country of the client that is withdrawing the funds, must be specified when the `originatorType` is `MY_CLIENT` (ISO 3166-1 alpha-2 code).
type: string
example: US
originatorName:
description: The name of the client that is withdrawing the funds, must be specified when the `originatorType` is `MY_CLIENT`.
type: string
example: Satoshi Nakamoto
originatorPostalCode:
description: The zip code/postal code of the person or entity that is withdrawing the funds, can be specified when the `originatorType` is `MY_CLIENT`.
type: string
example: 65584-5678
originatorStateProvince:
description: The state/province of the person or entity that is withdrawing the funds, can be specified when the `originatorType` is `MY_CLIENT` (full name format).
type: string
example: Wyoming
originatorStreetAddress:
description: The street address of the person or entity that is withdrawing the funds, must be specified when the `originatorType` is `MY_CLIENT`.
type: string
example: 1234 NW Bobcat Lane, St. Robert, MO
originatorType:
description: Who is the originator of this withdrawal, must be specified when originator is a Financial Institution.
type: string
example: MY_ORGANIZATION
enum:
- MY_ORGANIZATION
- MY_CLIENT
purpose:
description: The purpose of the withdrawal.
type: string
example: TRADING_SETTLEMENT
enum:
- TRADING_SETTLEMENT
- LENDING
- INVESTMENT
- EXPENSES
- FEE_PAYMENT
- GRANT_PAYMENT
- PRIZE_AWARD
- GIFT
- REIMBURSEMENT
- REBALANCE
- INTRA_COMPANY
- REWARDS_DISTRIBUTION
recipientCity:
description: The city of the person or entity that will receive the funds being withdrawn, can be specified when the `recipientType` is `PERSON` or `ENTITY` (optional, except if Street Address is indicated).
type: string
example: San Francisco
recipientCountry:
description: The country of the entity or person that will receive the funds being withdrawn, must be specified when the `recipientType` is `PERSON` or `ENTITY` (ISO 3166-1 alpha-2 code).
type: string
example: JP
recipientFirstName:
description: The first name of the person that will receive the funds being withdrawn, must be specified when the `recipientType` is `PERSON`.
type: string
example: Satoshi
recipientFullName:
description: The full name of the entity that will receive the funds being withdrawn, must be specified when the `recipientType` is `ENTITY`.
type: string
example: Satoshi Nakamoto
recipientLastName:
description: The last name of the person that will receive the funds being withdrawn, must be specified when the `recipientType` is `PERSON`.
type: string
example: Nakamoto
recipientPostalCode:
description: The zip code/postal code of the person or entity that will receive the funds being withdrawn, can be specified when the `recipientType` is `PERSON` or `ENTITY` (optional).
type: string
example: 65584-5678
recipientStateProvince:
description: The state/province of the person or entity that will receive the funds being withdrawn, can be specified when the `recipientType` is `PERSON` or `ENTITY` (full name format) (optional).
type: string
example: Wyoming
recipientStreetAddress:
description: The street address of the person or entity that will receive the funds being withdrawn, can be specified when the `recipientType` is `PERSON` or `ENTITY` (optional, except if City is indicated).
type: string
example: 1234 NW Bobcat Lane, St. Robert, MO
recipientType:
description: "The entity or person that will receive the funds being withdrawn.\n\n * `DESTINATION_INSTITUTION` - Financial institution specified above in `institutionName`\n * `MY_ORGANIZATION` - Same organization initiating the withdrawal, the Anchorage Digital account owner\n * `PERSON` - Other person\n * `ENTITY` - Other entity\n"
type: string
example: PERSON
enum:
- DESTINATION_INSTITUTION
- MY_ORGANIZATION
- PERSON
- ENTITY
selfhostedDescription:
description: A description of the self-hosted wallet, must be specified when the `destinationType` is `SELFHOSTED_WALLET`.
type: string
example: An explanation about where this address is held
useTrustedDestinationAml:
description: 'When the withdrawal destination address is a Trusted Destination, the system can automatically fetch the Beneficiary and Destination information using the AML data provided for that Trusted Destination.
This parameter needs to be used to specify if the Trusted Destination information should be used, when available:
* `true` - no need to provide Beneficiary and Destination AML information, as the system will automatically use the information from the Trusted Destination
* `false` - must provide the Beneficiary and Destination AML information in the API request'
type: boolean
nullable: true
required:
- purpose
title: AMLQuestionnaire
TransactionResponse:
type: object
properties:
data:
$ref: '#/components/schemas/TransactionDetails'
required:
- data
title: TransactionResponse
ErrorType:
description: The type of error returned.
type: string
enum:
- InternalError
- InvalidRequest
- Unauthenticated
- Forbidden
- NotFound
- Conflict
- UnprocessableEntity
- TooManyRequests
- ServiceUnavailable
- QuoteExpired
- InsufficientFunds
- NotImplemented
title: ErrorType
CreateConsolidateStakeRequest:
type: object
properties:
assetType:
description: 'A string representing a type of crypto-asset, which usually corresponds to the crypto asset''s ticker symbol.
Use `/asset-types` to list all of the supported asset types for your organization.
'
type: string
example: ETH
description:
description: An optional string providing more context to this transaction. It will be visible on the Anchorage Digital iOS app and will not be published to the blockchain.
type: string
example: 'Internal ID: #12838927347'
nullable: true
idempotentId:
description: A client-provided unique ID for idempotent requests
type: string
example: '12838927347'
maxLength: 128
source:
$ref: '#/components/schemas/SimpleSourceResourceDetails'
sourceStakingPosition:
description: Source staking validator public key to consolidate
type: string
example: 0xa1d1...
targetStakingPosition:
description: Target staking validator public key
type: string
example: 0x9647...
required:
- assetType
- idempotentId
- source
- sourceStakingPosition
- targetStakingPosition
title: CreateConsolidateStakeRequest
DelegationAddressesResponse:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/DelegationWalletAddressesDetails'
page:
$ref: '#/components/schemas/Page'
required:
- data
- page
title: DelegationAddressesResponse
WithdrawalParametersExtra:
description: Extra parameters, to be provided for assets
type: object
properties:
value:
description: An alphanumeric string often used to uniquely identify the recipient of the transaction, commonly used when transferring funds to custodial wallets, exchanges or other situations where the `destinationAddress` is multi-purpose. Must be included whenever provided by the recipient of the transaction.
type: string
example: w3mp19cqp2
maxLength: 256
required:
- value
title: WithdrawalParametersExtra
SOLStakingParameters:
description: 'UNDER DEVELOPMENT: Solana specific staking parameters'
type: object
properties:
stakingProvider:
description: The validator's provider
type: string
enum:
- FIGMENT
- BLOCKDAEMON
stakingProviderAddress:
description: The validator's vote account address
type: string
additionalProperties: false
oneOf:
- required:
- stakingProviderAddress
- required:
- stakingProvider
title: SOLStakingParameters
WithdrawalParametersForXLM:
description: Additional parameters to be provided exclusively when `assetType` is "XLM"
type: object
properties:
memo:
description: An alphanumeric string often used to uniquely identify the recipient of the transaction, commonly used when transferring funds to custodial wallets, exchanges or other situations where the `destinationAddress` is multi-purpose. Must be included whenever provided by the recipient of the transaction.
type: string
example: w3mp19cqp2
maxLength: 28
required:
- memo
title: WithdrawalParametersForXLM
DelegationWalletAddressesDetails:
properties:
address:
description: The address to delegate to.
type: string
anchorageValidator:
description: Whether this address belongs to an Anchorage Digital Validator.
type: boolean
name:
description: The name of the delegation address.
type: string
validatorType:
description: The type of validator for this delegation address.
type: string
required:
- name
- address
- anchorageValidator
- validatorType
title: DelegationWalletAddressesDetails
ETHStakingParameters:
description: 'UNDER DEVELOPMENT: ETH specific staking parameters'
type: object
properties:
stakingPositionId:
description: The staking position identifier. Only required for deposits.
type: string
stakingProvider:
description: The validator's provider. Only required for provisioning.
type: string
enum:
- FIGMENT
- BLOCKDAEMON
validatorType:
description: 'Defines which validator to use: 0x01 Pre-Pectra validators; 0x02 Post-Pectra validators'
type: string
enum:
- '0x01'
- '0x02'
additionalProperties: false
required:
- validatorType
title: ETHStakingParameters
StakingParameters:
description: Sets specific assets configuration parameters to perform staking
type: object
nullable: true
oneOf:
- $ref: '#/components/schemas/SOLStakingParameters'
- $ref: '#/components/schemas/ETHStakingParameters'
SimpleSourceResourceType:
description: The type of the resource being referenced.
type: string
enum:
- WALLET
title: SimpleSourceResourceType
CreateUnstakeResponse:
type: object
properties:
data:
$ref: '#/components/schemas/CreateStakeDetails'
required:
- data
title: CreateUnstakeResponse
WithdrawalResponse:
type: object
properties:
data:
$ref: '#/components/schemas/WithdrawalDetails'
required:
- data
title: WithdrawalResponse
Page:
description: Pagination info
type: object
properties:
next:
description: URL to use to query for the next page or null if no additional results are available
type: string
example:
nullable: true
x-omitempty: false
title: Page
SimpleSourceResourceDetails:
description: "An object representing a resource capable of sending funds.\n\n\nConstruction example:\n\t```\n\t{\n\t\"id\":\"1c920f4241b78a1d483a29f3c24b6c4c\",\n\t\"type\":\"WALLET\"\n\t}\n\t```\n"
type: object
properties:
id:
description: The identifier of the resource
type: string
example: 1c920f4241b78a1d483a29f3c24b6c4c
type:
$ref: '#/components/schemas/SimpleSourceResourceType'
required:
- id
- type
title: SimpleSourceResourceDetails
WithdrawalRequest:
type: object
properties:
amount:
description: An amount of a crypto-asset to transfer, without units. The unit is derived from the asset type.
type: string
example: '1000.00000000'
assetParametersATOM:
$ref: '#/components/schemas/WithdrawalParametersForATOM'
assetParametersCosmos:
$ref: '#/components/schemas/WithdrawalParametersForCosmos'
assetParametersExtra:
$ref: '#/components/schemas/WithdrawalParametersExtra'
assetParametersFiatTrustedDestination:
$ref: '#/components/schemas/WithdrawalParametersForFiatTrustedDestination'
assetParametersXLM:
$ref: '#/components/schemas/WithdrawalParametersForXLM'
assetParametersXRP:
$ref: '#/components/schemas/WithdrawalParametersForXRP'
assetType:
description: 'A string representing a type of crypto-asset, which usually corresponds to the crypto asset''s ticker symbol.
Use `/asset-types` to list all of the supported asset types for your organization.
'
type: string
example: BTC
description:
description: An optional string providing more context to this transaction. It will be visible on the Anchorage Digital iOS app and will not be published to the blockchain.
type: string
example: 'Internal ID: #12838927347'
nullable: true
destination:
$ref: '#/components/schemas/ResourceDetails'
idempotentId:
description: A client-provided unique ID for idempotent requests (optional)
type: string
example: '12838927347'
maxLength: 128
nullable: true
source:
$ref: '#/components/schemas/SourceResourceDetailsRequest'
useGasStation:
description: If true, the Anchorage Digital gas station will pay gas fees, for supported asset types and organizations.
type: boolean
nullable: true
withdrawalAmlQuestionnaire:
$ref: '#/components/schemas/AMLQuestionnaire'
required:
- assetType
- amount
title: WithdrawalRequest
securitySchemes:
Api-Access-Key:
type: apiKey
name: Api-Access-Key
in: header
description: An API key associated with a security role
x-tagGroups:
- name: Under Development
tags:
- Collateral Management
- Holds
- Deposit Attribution
- Onboarding
- Trusted Destinations
- Atlas Settlement Network
- Tax
- name: API Endpoints
tags:
- Addresses
- Asset Types
- Transactions
- Transfers
- Wallets
- Vaults
- Vesting
- Subaccounts
- Stablecoins
- Webhook Notifications
- API Key
- Statements
- Tax Reporting
- Trading
- name: Models
tags:
- Transfer Model
- Transaction Model
- Vault Model
- Deposit Attribution Model