openapi: 3.0.0 info: version: 2.0.0 title: Anchorage Digital API Reference Addresses Transfers 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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Read vault activity (READ)See an overview of your vault(s) and wallets. Read vault details, balances, asset types, transaction history and deposit addresses.
Create address (CREATE_DEPOSIT_ADDRESS)Receive deposits in the vault from external sources. Create and read deposit addresses.
Transfer funds (TRANSFER)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.
Propose and accept settlements (PROPOSE_ACCEPT_SETTLEMENTS)This is an Atlas specific permission for initiating settlements.
Authorize settlements (AUTHORIZE_SETTLEMENTS)This is an Atlas specific permission for authorizing settlements after they've been proposed or accepted.
\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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Initiate withdrawals (INITIATE_WITHDRAWAL)Initiate withdrawals to external destinations. All withdrawals require quorum approval through the Anchorage Digital mobile app.
Execute trades (TRADE)Request for quotes (RFQ) from the Anchorage Digital trading desk. Create and accept quotes. Read data of trades and settlements created by this key.
Read trade activity (READ_TRADE)Read trade activity and trade settlements data of your organization.
Read lending activity (LENDER_READ)Read lending activity of your organization.
Read facility data (FACILITY_ONLY)Read lending facility data.
Read deposit attribution activity (READ_DEPOSIT_ATTRIBUTION)Read deposit attribution activity of your organization.
Manage deposit attributions (DEPOSIT_ATTRIBUTION)Read deposit attribution activity of your organization. Perform deposit attributions.
Initiate Staking and Unstaking (STAKE)Initiate staking or unstaking operation. All operations require quorum approval through the Anchorage Digital mobile app.
\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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Timestamp1577880000
HTTP Method (Uppercase)POST
HTTP Path + query/v2/transfers?foo=bar&baz=bang
HTTP Body{\"source\": {\"id\": \"1c920f4241b78a1d483a29f3c24b6c4c\", \"type\": \"VAULT\"}, \"assetType\": \"ETH\", \"destination\": {\"id\": \"55e89d4a644d736b01533a2ea9b32a20\", \"type\": \"VAULT\"}, \"amount\": \"1000.00000000\"}
Signing Key (Ed25519 Private Key Seed)0101010101010101010101010101010101010101010101010101010101010101
Public Key8a88e3dd7409f195fd52db2d3cba5d72ca6709bf1d94121bf3748801b40f6f5c
Signature4bf42054bf7db1f8a2a2bc83d2a108502ee7a9d2ac7a2738adc2f932922446786fb9be1bd1eb475023296c6cba4ddbe28b04baca4b7521b1f1840a4ffd2b4d0d
\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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Response CodeDescription
200 OKThe request was successful.
400 Bad RequestThe request was improperly formed and could not be understood by the server, often due to invalid syntax, insufficient funds, or a missing required parameter.
401 UnauthorizedThe request was missing a valid API key.
403 ForbiddenThe provided API key does not have permission to perform the requested action.
404 Not FoundThe requested resource does not exist.
409 ConflictThe requested resource cannot proceed with the requested action because it is not in the required state.
429 Too Many RequestsToo many requests have been sent in a given amount of time.
\n 500 Internal Server Error\n
\n 502 Bad Gateway\n
\n 503 Service Unavailable\n
\n 504 Gateway Timeout\n
Something went wrong on Anchorage’s side. We have been alerted and are working on it.
\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 \n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterDescription\n
afterIdRequest page after (older than) this pagination id.
endDateRequest records older than this date (YYYY-MM-DD format). Used for /trading/trades and /trading/settlements resources.
limitMaximum number of results requested. Default usually 25, but varies depending on resource.
\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: These endpoints allow you to transfer assets from one of your API-enabled vaults to *another resource custodied by Anchorage Digital*. name: Transfers paths: /transfers: get: operationId: getTransfers summary: List transfers description: "Permissions required: **Transfer funds**\n\n\n\n\nList all transfers created by your API key.\n\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. If the date parameters are omitted, all transfers will be returned.\n - Specify a specific vault to return transfers for by specifying the `vaultId` parameter. If the `vaultId` parameter is omitted, transfers originating from all vaults will be returned. Providing both `vaultId` and `walletId` filters will result in an error.\n - Specify a specific wallet to return transfers for by specifying the `walletId` parameter. If the `walletId` parameter is omitted, transfers originating from all vaults and wallets will be returned. Providing both `vaultId` and `walletId` filters will result in an error.\n - Filter transfers of one or more statuses with the `statuses` parameter. Multiple statuses should be separated by commas.\n\n\n**Multiple Transfers**\n\n\n\nTo fetch a specific batch of transfers, pass a comma-separated list of `transferIds` as the `transferIds` query parameter.\n" parameters: - name: vaultId in: query description: The ID of a vault. If provided, only transfers originating from this vault will be returned. schema: type: string - name: walletId in: query description: The ID of a wallet. If provided, only transfers originating from this wallet will be returned. schema: type: string - name: transferIds in: query description: A list of `transferIds` to return. Invalid `transferIds` will be ignored. schema: type: array items: type: string explode: false style: form - 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: 100 maximum: 100 minimum: 1 - name: statuses in: query description: One or more transfer statuses to filter results schema: type: array items: type: string enum: - IN_PROGRESS - COMPLETED - FAILED - QUEUED uniqueItems: true explode: false style: form responses: '200': description: A list of transfers. content: application/json: schema: $ref: '#/components/schemas/TransfersResponse' '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: - Transfers x-security: Transfer funds: present post: operationId: createTransfer summary: Create a transfer request description: "Permissions required: **Transfer funds**\n\n\n\n\n#### Identify the sending resource and asset\n\n\nTo initiate a transfer between resources, you must identify which resource you'd like to transfer funds from and the asset type to transfer. Provide a `source` and `assetType`.\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 or another organization that also custodies with Anchorage Digital, or it may also be an approved blockchain address not custodied by Anchorage Digital (see [Permission Groups](#section/Authentication-and-Security/Permission-Groups) for more details). Please note: If you would like to use the Anchorage Digital API to transfer to approved blockchain addresses, please contact [api@anchorage.com](mailto:api@anchorage.com).\n\n\n#### Permissions\n\n\nThe provided API key must be associated with a permission group that has Transfer permissions for the vault from which the assets are being sent. The receiving resource does not need Transfer permissions to receive a transfer of funds.\n\n\n#### Additional Metadata\n\n\nYou may provide a transfer memo with each transfer. If the transfer API request is successful, a transfer transaction will be created that will include this transfer memo in the description. The resulting deposit will also include this memo.\n\n\n\n#### Successful Transfers\n\n\nIf the transfer request is valid, the request will initiate a transfer transaction from the source. This is a special withdrawal that will not require a quorum of approvals and will undergo automated Anchorage Digital Risk Review. When the transaction is broadcasted and confirmed on the blockchain, a subsequent deposit will be detected for the destination. All of these transactions 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 Transfers\n\n\nA transfer request may fail for any of the following reasons:\n\n - The specified sending resource does not exist or does not support the specified asset type\n - The specified amount exceeds the available funds for this asset (insufficient funds)\n - The destination does not exist or does not support the specified asset type\n - The provided API key does not have permissions to initiate transfers from this wallet\n\n\nIf the transfer request is successful, the actual transfer 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 - The transfer was successfully queued but there were insufficient funds by the time it was processed\n - There is a failure on the blockchain\n\n#### Idempotent Requests\n\n\nThis endpoint supports [idempotent requests](#section/Idempotency) so that a transfer does not occur twice if an API call was interrupted and must be retried. To send an idempotent request, include the `idempotentId` field in the body of the POST request.\n\n\n#### Queueing\n\n\nTransfer requests are queued and processed in the order they were received. When transferring between wallets, multiple transfer requests may be queued for the same asset in a given wallet, but only one will be processed at a time. The other requests will remain in the `QUEUED` state until the prior transfer is completed or fails.\n\n\n#### Transferring Full Balance\n\n\nFor assets with network fees paid in a separate asset type, transferring the full balance of an asset is no different than transferring any other amount for that asset.\n\n\nFor assets with network fees paid in the same asset type, transferring the full balance is not possible without specifying to the server that the fee should be deducted from the transfer amount. See the `deductFeeFromAmountIfSameType` flag of the `TransfersRequest` model for more detail.\n\n" parameters: - name: Api-Signature in: header description: "A hex-encoded Ed25519 signature of `timestamp_epoch_seconds + uppercase(http_method) + request_path + request_body`.\nThe `Api-Child-Control-Key` header is NOT part of the signed payload: it carries key material used only to sign the transaction, not an authorization parameter, so it is excluded from the signature and never persisted with the operation.\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 - name: Api-Child-Control-Key in: header description: 'The hex-encoded child control key of the source wallet, derived client-side from the organization''s Master Control Key. Required when the source wallet''s private keys are control-key-encrypted (self-custody organizations); ignored otherwise. It is passed as a header, is NOT part of the signed request payload, is used only to sign the transaction, and is never persisted with the operation. ' required: false schema: type: string pattern: ^[0-9a-fA-F]{64}$ requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/TransfersRequest' responses: '201': description: Successfully initiate a transfer content: application/json: schema: $ref: '#/components/schemas/TransfersResponse1' '400': description: Bad Request or Insufficient Funds 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: - Transfers x-security: Transfer funds: checkSourceVaultAndDestination /transfers/{transferId}: get: operationId: getTransfer summary: Get transfer by ID description: 'Permissions required: **Transfer funds** Get transfer by ID, for transfers created by your API key. NOTE: price and USD value information is recent but does not reflect real-time data. ' parameters: - name: transferId in: path description: The ID of the transfer to get details for required: true schema: type: string responses: '200': description: Metadata about a specific transfer content: application/json: examples: response: value: data: transferId: 008d3ec72558ce907571886df63ef51594b5bd8cf106a0b7fa8f12a30dfc867f amount: quantity: '1000.00000000' assetType: USDC currentPrice: '1.00' currentUSDValue: '1000.00' fee: quantity: '0.0002207155625' assetType: ETH assetType: USDC source: id: 1c920f4241b78a1d483a29f3c24b6c4c type: WALLET destination: id: 55e89d4a644d736b01533a2ea9b32a20 type: WALLET transferMemo: 'Internal ID: #12838927347' status: COMPLETED createdAt: '2019-01-02T12:34:56.000Z' endedAt: '2019-01-03T12:34:56.000Z' schema: $ref: '#/components/schemas/TransfersResponse2' '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: - Transfers x-security: Transfer funds: present delete: operationId: cancelTransfer summary: Cancel a transfer request description: 'Permissions required: **Transfer funds** Cancel a transfer request. Transfer requests in the `QUEUED` state can always be cancelled. Transfer requests in the `IN_PROGRESS` state can sometimes be cancelled if the request has not been broadcast on the blockchain. Trying to cancel a request that cannot be cancelled will return a `409 Conflict` error code. Transfers can only be canceled by the API key responsible for creating that transfer (either created directly via CreateTransfer or indirectly via ExecuteHold) ' 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 - name: transferId in: path description: The ID of the transfer to cancel required: true schema: type: string responses: '204': description: Transfer request successfully cancelled '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: - Transfers x-security: Transfer funds: present components: schemas: ErrorType: description: The type of error returned. type: string enum: - InternalError - InvalidRequest - Unauthenticated - Forbidden - NotFound - Conflict - UnprocessableEntity - TooManyRequests - ServiceUnavailable - QuoteExpired - InsufficientFunds - NotImplemented title: ErrorType WithdrawalParametersForXRP: description: Additional parameters to be provided exclusively when `assetType` is "XRP". When using a Trusted Destination, these parameters must not be provided — the destination tag is inherited from the trusted destination. Set `destination.type` to `TRUSTED_DESTINATION` and `destination.id` to the trusted destination ID instead. 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 TransfersResponse2: type: object properties: data: $ref: '#/components/schemas/TransferDetails' required: - data title: TransfersResponse2 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 WithdrawalParametersExtra: description: Extra parameters, to be provided for assets. When using a Trusted Destination, these parameters must not be provided — the memo is inherited from the trusted destination. Set `destination.type` to `TRUSTED_DESTINATION` and `destination.id` to the trusted destination ID instead. 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 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: 140 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 TransfersRequest: 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 deductFeeFromAmountIfSameType: description: 'If false, any network fees will always be added to amount requested. For example, a request to transfer 5 BTC with `deductFeeFromAmountIfSameType=false` would result in 5 exactly BTC received to the destination wallet and just over 5 BTC spent by the source wallet. If `true` and the amount transferred is the same asset type as the network fee for the transfer, the network fee is deducted from the amount instead. For example, a request to transfer 5 BTC with `deductFeeFromAmountIfSameType=true` would result in just under 5 BTC received to the destination wallet. For assets where the exact fee taken by the network is not known until the transaction is mined, it is likely that the amount spent will fall just short of the amount requested. For example, a request to transfer 5 ETH with `deductFeeFromAmountIfSameType=true` may result in the sending wallet spending 4.97 ETH and the recipient receiving 4.9 ETH. In this example, Anchorage Digital specifies to the network a maximum allowable fee of 0.1 ETH, but the network takes only 0.07 ETH For UTXO-based assets, if `deductFeeFromAmountIfSameType=true` and the amount requested for transfer is just short of the total balance of the asset, the network will refuse to accept this transaction because the remainder would be unspendable. This is an unlikely edge case. See "Bitcoin Dust" for more context. This flag is ignored for transfers where the amount and the fee asset types are separate. ' type: boolean default: false destination: $ref: '#/components/schemas/ResourceDetails' idempotentId: description: A client-provided unique ID for idempotent requests (mandatory) type: string example: '12838927347' maxLength: 128 source: $ref: '#/components/schemas/SourceResourceDetails' transferAmlQuestionnaire: $ref: '#/components/schemas/TransferAMLQuestionnaire' transferMemo: description: A user-supplied description that will become the description of the subsequent transfer transaction (optional) type: string example: 'Internal ID: #12838927347' nullable: true useGasStation: description: If true, the Anchorage Digital gas station will pay gas fees, for supported asset types and organizations. type: boolean nullable: true required: - assetType - amount title: TransfersRequest SourceResourceType: 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 title: SourceResourceType WithdrawalParametersForATOM: description: Additional parameters to be provided exclusively when `assetType` is "ATOM". This field is deprecated, please migrate to using `assetParametersCosmos` instead. When using a Trusted Destination, these parameters must not be provided — the memo is inherited from the trusted destination. Set `destination.type` to `TRUSTED_DESTINATION` and `destination.id` to the trusted destination ID 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 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 TransferStatus: description: 'A string describing the status of the given transfer * IN_PROGRESS - This transfer is in progress and is not final. * COMPLETED - This transfer has been completed and is confirmed on the blockchain. * FAILED - This transfer has failed. Funds were not successfully transferred. * QUEUED - This transfer has been queued behind another transfer of the same asset. ' type: string enum: - IN_PROGRESS - COMPLETED - FAILED - QUEUED title: TransferStatus WithdrawalParametersForCosmos: description: Additional parameters to be provided exclusively when `assetType` is for a Cosmos blockchain. When using a Trusted Destination, these parameters must not be provided — the memo is inherited from the trusted destination. Set `destination.type` to `TRUSTED_DESTINATION` and `destination.id` to the trusted destination ID 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: WithdrawalParametersForCosmos Data3: type: object properties: status: $ref: '#/components/schemas/TransferStatus' transferId: description: The ID of this transfer, which can be used to retrieve further details type: string example: 008d3ec72558ce907571886df63ef51594b5bd8cf106a0b7fa8f12a30dfc867f required: - transferId - status title: Data3 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 - TRUSTED_DESTINATION title: ResourceType TransfersResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/TransferDetails' page: $ref: '#/components/schemas/Page' required: - data - page title: TransfersResponse WithdrawalParametersForXLM: description: Additional parameters to be provided exclusively when `assetType` is "XLM". When using a Trusted Destination, these parameters must not be provided — the memo is inherited from the trusted destination. Set `destination.type` to `TRUSTED_DESTINATION` and `destination.id` to the trusted destination ID 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: 28 required: - memo title: WithdrawalParametersForXLM 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 TransferDetails: 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, if applicable type: string createdAt: description: The timestamp when the transfer request was created type: string format: date-time example: '2019-01-02T12:34:56.000Z' destination: $ref: '#/components/schemas/ResourceDetails' endedAt: description: The timestamp when the transfer request reached a final state - completion or failure (optional) type: string format: date-time example: '2019-01-03T12:34:56.000Z' nullable: true error: $ref: '#/components/schemas/ErrorDetails' fee: $ref: '#/components/schemas/Amount' source: $ref: '#/components/schemas/SourceResourceDetails' status: $ref: '#/components/schemas/TransferStatus' transferId: description: The transfer ID which can be used to reference this transfer in other queries type: string transferMemo: description: A user-supplied description that will become the description of the subsequent transfer operation (optional) type: string nullable: true example: transferId: 008d3ec72558ce907571886df63ef51594b5bd8cf106a0b7fa8f12a30dfc867f amount: quantity: '1000.00000000' assetType: USDC currentPrice: '1.00' currentUSDValue: '1000.00' fee: quantity: '0.0002207155625' assetType: ETH assetType: USDC source: id: 1c920f4241b78a1d483a29f3c24b6c4c type: WALLET destination: id: 55e89d4a644d736b01533a2ea9b32a20 type: WALLET transferMemo: 'Internal ID: #12838927347' status: COMPLETED createdAt: '2019-01-02T12:34:56.000Z' endedAt: '2019-01-03T12:34:56.000Z' required: - transferId - status - amount - assetType - createdAt title: TransferDetails TransfersResponse1: type: object properties: data: $ref: '#/components/schemas/Data3' required: - data title: TransfersResponse1 TransferAMLQuestionnaire: description: Anti-money laundering questionnaire submission type: object properties: destinationType: description: __DEPRECATED__ - Where the address that will receive the withdrawal is held. type: string enum: - FINANCIAL_INSTITUTION - SELFHOSTED_WALLET institutionCountry: description: __DEPRECATED__ - 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 institutionName: description: __DEPRECATED__ - The name of the institution on the receiving end of the withdrawal, must be specified when the `destinationType` is `FINANCIAL_INSTITUTION`. type: string 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: __DEPRECATED__ - 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 recipientCountry: description: __DEPRECATED__ - 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 recipientFirstName: description: __DEPRECATED__ - The first name of the person that will receive the funds being withdrawn, must be specified when the `recipientType` is `PERSON`. type: string recipientFullName: description: __DEPRECATED__ - The full name of the entity that will receive the funds being withdrawn, must be specified when the `recipientType` is `ENTITY`. type: string recipientLastName: description: __DEPRECATED__ - The last name of the person that will receive the funds being withdrawn, must be specified when the `recipientType` is `PERSON`. type: string recipientPostalCode: description: __DEPRECATED__ - 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 recipientStateProvince: description: __DEPRECATED__ - 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 recipientStreetAddress: description: __DEPRECATED__ - 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 recipientType: description: '__DEPRECATED__ - The entity or person that will receive the funds being withdrawn. * `DESTINATION_INSTITUTION` - Financial institution specified above in `institutionName` * `MY_ORGANIZATION` - Same organization initiating the withdrawal, the Anchorage Digital account owner * `PERSON` - Other person * `ENTITY` - Other entity ' type: string enum: - DESTINATION_INSTITUTION - MY_ORGANIZATION - PERSON - ENTITY selfhostedDescription: description: __DEPRECATED__ - A description of the self-hosted wallet, must be specified when the `destinationType` is `SELFHOSTED_WALLET`. type: string example: originatorType: MY_CLIENT originatorName: Satoshi Nakamoto originatorCountry: US originatorStreetAddress: 1234 NW Bobcat Lane, St. Robert, MO originatorPostalCode: 65584-5678 originatorCity: San Francisco originatorStateProvince: Wyoming purpose: TRADING_SETTLEMENT required: - purpose title: AMLQuestionnaire SourceResourceDetails: 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: id: description: The identifier of the resource type: string example: 1c920f4241b78a1d483a29f3c24b6c4c type: $ref: '#/components/schemas/SourceResourceType' required: - id - type title: SourceResource 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 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 - Tagging - Subaccounts - Stablecoins - Webhook Notifications - API Key - Statements - Tax Reporting - Trading - name: Models tags: - Transfer Model - Transaction Model - Vault Model - Deposit Attribution Model