openapi: 3.0.0 info: version: 2.0.0 title: Anchorage Digital API Reference Addresses Stablecoins 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: Endpoints for stablecoin conversion operations including issuance and redemption name: Stablecoins paths: /stablecoins/conversion: post: operationId: convertStablecoins summary: Create a Stablecoin Conversion description: 'Permissions required: **Convert Stablecoins** Create a stablecoin conversion, either issuance or redemption. Issuance is when USD is converted to the stablecoin. Redemption is when the stablecoin asset is converted to USD.' parameters: [] requestBody: description: Stablecoin Conversion required: true content: application/json: schema: $ref: '#/components/schemas/StablecoinConversion' responses: '201': description: authorizationOperationId content: application/json: schema: $ref: '#/components/schemas/StablecoinConversionResponse' '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' '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: - Stablecoins /stablecoins/history: get: operationId: getStablecoinHistory summary: Get Issue/Redeem History description: 'Permissions required: **Convert Stablecoins** Retrieve the history of stablecoin issuance and redemption operations for your organization. Results are paginated and ordered by creation time (newest first).' parameters: - name: limit in: query description: Maximum number of results to return (default 100, max 100) required: false schema: type: integer format: int32 default: 100 maximum: 100 minimum: 1 - name: lastCreatedAt in: query description: Cursor for pagination - timestamp of the last result from the previous page (RFC3339 format) required: false schema: type: string format: date-time responses: '200': description: Issue/redeem history content: application/json: schema: $ref: '#/components/schemas/IssueRedeemHistoryResponse' '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' '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: - Stablecoins /stablecoins/reserves: get: operationId: getStablecoinReserves summary: Get Stablecoin Reserves History description: 'Permissions required: **Read vault activity** Retrieve the daily reserves reconciliation history for a stablecoin your organization is entitled to. Results are paginated and ordered by creation time (newest first).' parameters: - name: stablecoin in: query description: Token symbol to query. Your organization must be entitled to read reserves for this token. required: true schema: type: string - name: startDate in: query description: Return rows with reportDate on or after this date (inclusive), in `YYYY-MM-DD` format. Dates are always in UTC. required: false schema: type: string format: date - name: endDate in: query description: Return rows with reportDate on or before this date (inclusive), in `YYYY-MM-DD` format. Dates are always in UTC. required: false schema: type: string format: date - name: limit in: query description: Maximum number of results to return (default 100, max 100) required: false schema: type: integer format: int32 default: 100 maximum: 100 minimum: 1 - name: lastCreatedAt in: query description: Cursor for pagination - timestamp of the last result from the previous page (RFC3339 format) required: false schema: type: string format: date-time responses: '200': description: Reserves history content: application/json: schema: $ref: '#/components/schemas/ReservesHistoryResponse' '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' '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: - Stablecoins /stablecoins/reserves/entitled-stablecoins: get: operationId: getStablecoinReservesEntitledStablecoins summary: Get Stablecoin Reserves Entitled Stablecoins description: 'Permissions required: **Read vault activity** List the stablecoins whose reserves history your organization is entitled to view. Pass any returned symbol as the `stablecoin` query parameter to `GET /stablecoins/reserves` to retrieve that stablecoin''s daily reserves reconciliation history. Returns an empty array when your organization cannot view reserves history for any stablecoin.' parameters: [] responses: '200': description: Entitled stablecoins content: application/json: schema: $ref: '#/components/schemas/StablecoinReservesEntitledStablecoinsResponse' '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' '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: - Stablecoins 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 StablecoinReservesEntitledStablecoinsResponse: type: object properties: data: $ref: '#/components/schemas/EntitledStablecoins' required: - data StablecoinConversion: type: object properties: amount: type: string destinationAssetType: description: 'A string representing the asset used for this operation. For issuance, this value must be the stablecoin asset. For redemptions, it must be USD. Use `/asset-types` to list all supported asset types for your organization.' type: string example: USDX destinationWalletId: type: string idempotencyKey: description: Client-provided idempotency key to ensure request is processed only once type: string example: e763a50d-aa82-4ec7-b5a3-89ad0462d248 maxLength: 128 sourceAssetType: description: 'A string representing the asset used for this operation. For issuance, this value must be USD. For redemptions, it must be the asset being redeemed. Use `/asset-types` to list all supported asset types for your organization.' type: string example: USD sourceWalletId: type: string required: - idempotencyKey - sourceWalletId - sourceAssetType - destinationWalletId - destinationAssetType - amount IssueRedeemConversion: type: object properties: amount: description: Amount as a decimal string type: string example: '100.00' authorizationOperationId: description: Authorization operation ID (if present) type: string nullable: true x-omitempty: false createdAt: description: When the operation was created type: string format: date-time destinationAssetTypeId: description: Destination asset type type: string example: PYUSD destinationOperationId: description: Identifier of the destination-leg customer operation (if present). Pass to `GET /transactions/{transactionId}` for full details. type: string nullable: true x-omitempty: false destinationWalletId: description: Destination wallet ID type: string id: description: Unique identifier for the issue/redeem operation type: string operationType: description: Type of operation (ISSUE, REDEEM, BRIDGE, or SWAP) type: string example: ISSUE sourceAssetTypeId: description: Source asset type type: string example: USD sourceOperationId: description: Identifier of the source-leg customer operation (if present). Pass to `GET /transactions/{transactionId}` for full details. type: string nullable: true x-omitempty: false sourceWalletId: description: Source wallet ID type: string status: description: 'Customer-facing conversion status. * `INITIATED` — conversion has started and is awaiting endorsements. * `EXECUTING` — endorsements approved; conversion is pending. * `COMPLETED` — conversion was fulfilled successfully. * `FAILED` — conversion failed (see `subStatus` when the customer can already observe the cause). * `UNKNOWN` — unrecognised internal state (forward-compatibility fallback).' type: string example: EXECUTING enum: - INITIATED - EXECUTING - COMPLETED - FAILED - UNKNOWN x-enum-varnames: - IssueRedeemConversionStatusINITIATED - IssueRedeemConversionStatusEXECUTING - IssueRedeemConversionStatusCOMPLETED - IssueRedeemConversionStatusFAILED - IssueRedeemConversionStatusUNKNOWN subStatus: description: 'Optional sub-status that further qualifies the top-level `status`. Only set for outcomes the customer can independently observe; internal failure modes are not disclosed. * `REJECTED_BY_CUSTOMER` — the customer rejected the conversion before endorsement approval (paired with `status: FAILED`).' type: string enum: - REJECTED_BY_CUSTOMER nullable: true x-enum-varnames: - IssueRedeemConversionSubStatusREJECTEDBYCUSTOMER x-omitempty: false required: - id - operationType - sourceWalletId - destinationWalletId - destinationAssetTypeId - sourceAssetTypeId - amount - status - createdAt StablecoinConversionResponse: type: object properties: authorizationOperationId: type: string required: - authorizationOperationId ReservesHistoryResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/ReservesSnapshot' page: $ref: '#/components/schemas/Page' required: - data - page 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 ReservesSnapshot: type: object properties: createdAt: description: RFC3339 row write time; pagination cursor field. type: string format: date-time inTransit: description: In-transit cash, as a decimal string. Already reflected in reserveComposition and totalReserves; broken out separately for visibility. Do not re-add to the total. type: string example: '100.00' reportDate: description: Reconciliation date (YYYY-MM-DD). type: string format: date reserveComposition: $ref: '#/components/schemas/ReserveComposition' reserveRatio: description: totalReserves / totalStablecoinOnNetwork, as a decimal string. type: string example: '1.00010' stablecoin: description: Token symbol. type: string example: USDX totalReserves: description: Total reserves, as a decimal string. type: string example: '10000' totalStablecoinOnNetwork: description: Total supply on-network, as a decimal string. type: string example: '9999' required: - reportDate - stablecoin - totalStablecoinOnNetwork - totalReserves - reserveRatio - reserveComposition - inTransit - createdAt title: Reserves Snapshot IssueRedeemHistoryResponse: type: object properties: data: type: array items: $ref: '#/components/schemas/IssueRedeemConversion' page: $ref: '#/components/schemas/Page' required: - data - page EntitledStablecoins: type: object properties: stablecoins: description: Stablecoin token symbols your organization is entitled to query reserves history for. type: array items: type: string required: - stablecoins 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 ReserveComposition: description: 'Reserve backing for the queried token, as a map of reserve-component key to balance. Each value is a decimal string. The set of keys is not fixed; it varies by token and may gain new keys over time, so iterate over whatever keys are present and ignore any you do not recognize. Existing keys are stable and will not be renamed or removed without a new API version.' type: object example: cashDeposits: '5000.00' mmfXyz: '5000.00' additionalProperties: type: string title: Reserve Composition 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