openapi: 3.0.0
info:
version: 2.0.0
title: Anchorage Digital API Reference Addresses Onboarding 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: "These endpoints allow clients/partner institutions to start the customer onboarding process for a B2B2B/B2B2C end customer who would not be using the Anchorage Digital applications directly. They collect the required data and documentation for Anchorage Digital to satisfy its regulatory obligations to perform KYB/KYC, CIP, CDD and EDD on its customers and related parties.\n\nCurrently only B2B2B/B2B2C customer onboarding is supported.\n\n### Payload Data\nThe \"customer\" endpoints take a payload of `entries` in an array of key/value pairs. Details on the required and support key/value pairs is available in documentation provided by Anchorage Digital. Please contact your Customer Experience representative for details.\n\nNote that some of the keys are conditional depending on the presence or value of other key/value pairs. For example, the key `legalStructureOther` is only required if the `legalStructure` key has the Enum value `OTHER`.\n\nAlso note that every `value` field accepts primitives, objects and collections, which makes the payload very flexible for the client's needs.\nFor example, both of the following `entries` are accepted and interchangeable:\n\n```json\n{\n \"entries\":[\n {\n \"key\":\"boolField\",\n \"value\":true\n },\n {\n \"key\":\"numberField\",\n \"value\":10\n },\n {\n \"key\":\"stringField\",\n \"value\":\"stringFieldValue\"\n },\n {\n \"key\":\"collectionField\",\n \"value\":[\n \"collectionField0Value\",\n \"collectionField1Value\"\n ]\n },\n {\n \"key\":\"objectField\",\n \"value\":{\n \"field0\":\"field0Value\",\n \"field1\":\"field1Value\",\n \"field2\":\"field2Value\"\n }\n },\n {\n \"key\":\"objectCollectionField\",\n \"value\":[\n {\n \"field0\":\"field0AValue\",\n \"field1\":\"field1AValue\",\n \"field2\":\"field2AValue\"\n },\n {\n \"field0\":\"field0BValue\",\n \"field1\":\"field1BValue\",\n \"field2\":\"field2BValue\"\n }\n ]\n }\n ]\n}\n```\n\n```json\n{\n \"entries\":[\n {\n \"key\":\"boolField\",\n \"value\":true\n },\n {\n \"key\":\"numberField\",\n \"value\":10\n },\n {\n \"key\":\"stringField\",\n \"value\":\"stringFieldValue\"\n },\n {\n \"key\":\"collectionField.0\",\n \"value\":\"collectionField0Value\"\n },\n {\n \"key\":\"collectionField.1\",\n \"value\":\"collectionField1Value\"\n },\n {\n \"key\":\"objectField.field0\",\n \"value\":\"field0Value\"\n },\n {\n \"key\":\"objectField.field1\",\n \"value\":\"field1Value\"\n },\n {\n \"key\":\"objectField.field2\",\n \"value\":\"field2Value\"\n },\n {\n \"key\":\"objectCollectionField.0.field0\",\n \"value\":\"field0AValue\"\n },\n {\n \"key\":\"objectCollectionField.0.field1\",\n \"value\":\"field1AValue\"\n },\n {\n \"key\":\"objectCollectionField.0.field2\",\n \"value\":\"field2AValue\"\n },\n {\n \"key\":\"objectCollectionField.1.field0\",\n \"value\":\"field0BValue\"\n },\n {\n \"key\":\"objectCollectionField.1.field1\",\n \"value\":\"field1BValue\"\n },\n {\n \"key\":\"objectCollectionField.1.field2\",\n \"value\":\"field2BValue\"\n }\n ]\n}\n```\n"
name: Onboarding
paths:
/onboarding/customers:
post:
operationId: createKYCApplication
summary: Begin new customer onboarding application
description: 'Permissions required: **Onboarding**
Initiate onboarding application for a new customer of Anchorage Digital
'
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateKYCApplicationRequest'
responses:
'201':
description: Customer ID and information of the successfully created customer onboarding application
content:
application/json:
schema:
$ref: '#/components/schemas/CreateKYCApplicationResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
get:
operationId: getKYCAffiliates
summary: Retrieve uploaded data and status of all customers onboarding
description: 'Permissions required: **Onboarding**
List all customers onboarding application status, missing information and previously uploaded information.
'
parameters:
- 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: Customers onboarding application status and errors
content:
application/json:
schema:
$ref: '#/components/schemas/GetKYCAffiliatesResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
/onboarding/customers/{customerId}:
get:
operationId: getKYCApplication
summary: Retrieve uploaded data and status of customer onboarding
description: 'Permissions required: **Onboarding**
Get customer onboarding application status, missing information and previously uploaded information.
'
parameters:
- name: customerId
in: path
description: Customer Id
required: true
schema:
type: string
responses:
'200':
description: Customer onboarding application status and errors
content:
application/json:
schema:
$ref: '#/components/schemas/GetKYCApplicationResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
put:
operationId: updateKYCApplication
summary: Update customer onboarding application
description: 'Permissions required: **Onboarding**
Update an existing customer onboarding application. The application data will be updated to match the entries of the update payload. If any field is invalid, the entire update will fail and no data will be updated.'
parameters:
- name: customerId
in: path
description: Unique identifier customer - generated to the client when creating KYC application
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateKYCApplicationRequest'
responses:
'200':
description: Information regarding the onboarding state
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateKYCApplicationResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
/onboarding/customers/{customerId}/document:
post:
operationId: createKYCDocument
summary: Request a signed URL for document image upload
description: 'Permissions required: **Onboarding**
Request a signed URL for uploading document images for the existing customer onboarding application
Note that the URL expires after 15m, you can still generate a new URL if this one expires. If the image file is never uploaded, the document will show as missing in the `GET` response and a new signed URL must be requested.
'
parameters:
- name: customerId
in: path
description: The unique identifier for the customer
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateKYCDocumentRequest'
responses:
'200':
description: Information regarding the document url
content:
application/json:
schema:
$ref: '#/components/schemas/CreateKYCDocumentResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
/onboarding/customers/{customerId}/submit:
post:
operationId: submitKYCApplication
summary: Submit a completed customer onboarding application
description: 'Permissions required: **Onboarding**
Indicate that a customer onboarding application is complete and can be submitted for screening
'
parameters:
- name: customerId
in: path
description: The unique identifier for the customer
required: true
schema:
type: string
responses:
'200':
description: Successfully submitted KYC application
'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'
'422':
description: KYC application is missing required info
content:
application/json:
examples:
response:
value:
errorType: UnprocessableEntity
message: Affiliate missing some required documents or data
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
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
/onboarding/agreements/{agreementType}:
post:
operationId: createKYCAgreement
summary: Creates a new agreement questionnaire of the given agreementType
description: 'Permissions required: **Onboarding**
Creates a new agreement questionnaire
'
parameters:
- name: agreementType
in: path
description: The type of the agreement
required: true
schema:
type: string
enum:
- terms
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateKYCAgreementRequest'
responses:
'201':
description: Successfully creates a new agreement questionnaire
content:
application/json:
schema:
$ref: '#/components/schemas/CreateKYCAgreementResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
get:
operationId: getKYCAgreements
summary: Retrieves all the agreements questionnaires for the specified agreement type
description: 'Permissions required: **Onboarding**
Retrieves all the agreements questionnaires for the specified agreement type
'
parameters:
- name: agreementType
in: path
description: The unique identifier for the agreement type
required: true
schema:
type: string
enum:
- terms
- name: status
in: query
description: Filter by status
schema:
type: string
enum:
- UNSPECIFIED
- IN_PROGRESS
- COMPLETE
- DECLINED
- VOIDED
- 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: Success on fetching KYC agreements
content:
application/json:
schema:
$ref: '#/components/schemas/GetKYCAgreementsResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
/onboarding/agreements/{agreementType}/{agreementId}:
get:
operationId: getKYCAgreement
summary: Retrieves the agreement questionnaire of the given agreement type and agreement ID
description: 'Permissions required: **Onboarding**
Retrieves the agreement questionnaire for the specified agreement type and agreement ID
'
parameters:
- name: agreementType
in: path
description: The unique identifier for the agreement type
required: true
schema:
type: string
enum:
- terms
- name: agreementId
in: path
description: The unique identifier for the agreement ID
required: true
schema:
type: string
responses:
'200':
description: Success on fetching KYC agreement
content:
application/json:
schema:
$ref: '#/components/schemas/GetKYCAgreementResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
/onboarding/subaccounts:
post:
operationId: createKYCSubaccountApplication
summary: Begin new customer subaccount onboarding application
description: 'Permissions required: **Onboarding**
Initiate onboarding application for a new customer subaccount of Anchorage Digital
'
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateKYCSubaccountApplicationRequest'
responses:
'201':
description: Customer subaccount ID and information of the successfully created customer subaccount onboarding application
content:
application/json:
schema:
$ref: '#/components/schemas/CreateKYCSubaccountApplicationResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
get:
operationId: getKYCSubaccountApplications
summary: Retrieve uploaded data and status of all onboarding customer subaccounts
description: 'Permissions required: **Onboarding**
List all customer subaccounts onboarding application status, missing information and previously uploaded information.
'
parameters:
- 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: Customer applications status and errors
content:
application/json:
schema:
$ref: '#/components/schemas/GetKYCSubaccountApplicationsResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
/onboarding/subaccounts/{subaccountId}:
get:
operationId: getKYCSubaccountApplication
summary: Retrieve uploaded data and status of customer subaccount onboarding
description: 'Permissions required: **Onboarding**
Get customer subaccount onboarding application status, missing information and previously uploaded information.'
parameters:
- name: subaccountId
in: path
description: Unique identifier for a customer subaccount - generated to the client when creating subaccount
required: true
schema:
type: string
responses:
'200':
description: Customer subaccount onboarding application status and errors
content:
application/json:
schema:
$ref: '#/components/schemas/GetKYCSubaccountApplicationResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
put:
operationId: updateKYCSubaccountApplication
summary: Update customer subaccount onboarding application
description: 'Permissions required: **Onboarding**
Update data of an existing customer subaccount onboarding application'
parameters:
- name: subaccountId
in: path
description: Unique identifier for a customer subaccount - generated to the client when creating subaccount
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateKYCSubaccountApplicationRequest'
responses:
'200':
description: Information regarding the onboarding state
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateKYCSubaccountApplicationResponse'
'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'
'501':
description: Not Implemented
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
/onboarding/subaccounts/{subaccountId}/submit:
post:
operationId: submitKYCSubaccountApplication
summary: Submit a completed customer subaccount onboarding application
description: 'Permissions required: **Onboarding**
Indicate that a customer subaccount onboarding application is complete and can be submitted for screening'
parameters:
- name: subaccountId
in: path
description: Unique identifier for a customer subaccount - generated to the client when creating subaccount
required: true
schema:
type: string
responses:
'200':
description: Successfully submitted KYC application
'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'
'422':
description: KYC application is missing required info
content:
application/json:
examples:
response:
value:
errorType: UnprocessableEntity
message: Affiliate missing some required documents or data
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
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorDetails'
tags:
- Onboarding
x-security:
Onboarding: present
components:
schemas:
UpdateKYCApplicationResponseData:
type: object
properties:
customerId:
description: Unique identifier for the customer onboarding application
type: string
id:
description: DEPRECATED - Use customerId instead
type: string
status:
description: Status of the customer onboarding application
type: string
required:
- customerId
- status
title: UpdateKYCApplicationResponseData
KYCApplicationError:
type: object
properties:
key:
description: Identifier of the question.
type: string
status:
description: Answer error for this type of question.
type: string
enum:
- MISSING
- BADFORMAT
- UNSIGNED
value:
description: Error message.
type: string
required:
- key
- status
title: KYCApplicationError
KYCApplicationEntry:
type: object
properties:
key:
description: Identifier of the question.
type: string
value:
description: Answer for the given question.
oneOf:
- type: string
- type: boolean
- type: object
additionalProperties: true
- type: array
items:
type: object
additionalProperties: true
required:
- key
- value
GetKYCAgreementsResponse:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/GetKYCAgreementResponseData'
page:
$ref: '#/components/schemas/Page'
title: GetKYCAgreementsResponse
KYCApplication:
description: 'Onboarding KYC Application
'
type: object
properties:
customerId:
description: Unique identifier for the customer onboarding application
type: string
entries:
description: A collection of responses for a set of defined relevant questions.
type: array
items:
$ref: '#/components/schemas/KYCApplicationEntry'
errors:
description: A collection of errors validating the responses.
type: array
items:
$ref: '#/components/schemas/KYCApplicationError'
status:
description: Status of the onboarding application, possible status are DRAFT, IN_PROGRESS, IN_REVIEW and COMPLETE
type: string
required:
- customerId
- entries
- status
title: KYCApplication
CreateKYCSubaccountApplicationResponseData:
type: object
properties:
status:
description: Status of the customer subaccount onboarding application, possible values are DRAFT, IN_PROGRESS, IN_REVIEW and COMPLETE
type: string
subaccountId:
description: Unique identifier for the customer subaccount onboarding application
type: string
required:
- subaccountId
- status
title: CreateKYCSubaccountApplicationResponseData
UpdateKYCApplicationRequest:
type: object
properties:
entries:
description: A collection of responses for a set of defined relevant questions.
type: array
items:
$ref: '#/components/schemas/KYCApplicationEntry'
required:
- entries
title: UpdateKYCApplicationRequest
KYCAffiliate:
description: 'Onboarding KYC Customer Applications
'
type: object
properties:
customerId:
description: Unique identifier for the customer onboarding application
type: string
customerType:
description: The type of customer
type: string
name:
description: A name of the customer
type: string
status:
description: Status of the onboarding application
type: string
required:
- customerId
- status
- name
- customerType
title: KYCAffiliate
CreateKYCAgreementResponseData:
type: object
properties:
id:
description: Unique identifier for the customer onboarding agreement
type: string
legalEntityName:
description: Legal entity name of the customer
type: string
signerEmail:
description: Email of the signer
type: string
signerFirstName:
description: First name of the signer
type: string
signerLastName:
description: Last name of the signer
type: string
status:
description: Status of the customer onboarding agreement signature process
type: string
enum:
- UNSPECIFIED
- IN_PROGRESS
- COMPLETE
- DECLINED
- VOIDED
termsAgreementFormat:
description: Terms and Conditions format
type: string
enum:
- anchorage
- docusign
url:
description: URL to proceed with the customer onboarding agreement signature
type: string
required:
- id
- url
- status
- legalEntityName
- signerFirstName
- signerLastName
- signerEmail
- termsAgreementFormat
title: CreateKYCAgreementResponseData
CreateKYCDocumentRequest:
type: object
properties:
documentType:
description: Type of document to upload.
type: string
required:
- documentType
title: CreateKYCDocumentRequest
GetKYCSubaccountApplicationResponse:
description: 'Get Onboarding KYC Account Application Response
'
type: object
properties:
data:
$ref: '#/components/schemas/KYCSubaccountApplication'
title: GetKYCSubaccountApplicationResponse
KYCSubaccountApplicationItem:
description: 'Onboarding KYC Customer Account Application
'
type: object
properties:
externalId:
description: External identifier for the customer subaccount onboarding application. This value has to be unique for each customer subaccount application.
type: string
name:
description: The name of the subaccount.
type: string
status:
description: Status of the onboarding application
type: string
subaccountId:
description: Unique identifier for the customer subaccount application
type: string
required:
- subaccountId
- externalId
- status
title: KYCSubaccountApplicationItem
CreateKYCSubaccountApplicationRequest:
type: object
properties:
entries:
description: A collection of responses for a set of defined relevant questions.
type: array
items:
$ref: '#/components/schemas/KYCApplicationEntry'
externalId:
description: External identifier for the customer subaccount onboarding application. This value has to be unique for each customer subaccount application.
type: string
name:
description: The name of the subaccount.
type: string
submit:
description: Optional parameter to try to submit the application if there are no validation errors. This action is irreversible you cannot update the application values after. You can use this to avoid making another api call to POST /v2/onboarding/subaccounts/submit
type: boolean
required:
- externalId
- entries
title: CreateKYCSubaccountApplicationRequest
GetKYCApplicationResponse:
description: 'Get Onboarding KYC Application Response
'
type: object
properties:
data:
$ref: '#/components/schemas/KYCApplication'
title: GetKYCApplicationResponse
UpdateKYCSubaccountApplicationResponseData:
type: object
properties:
status:
description: Status of the customer onboarding application
type: string
subaccountId:
description: Unique identifier for the customer onboarding application
type: string
required:
- subaccountId
- status
title: UpdateKYCSubaccountApplicationResponseData
UpdateKYCSubaccountApplicationRequest:
type: object
properties:
entries:
description: A collection of responses for a set of defined relevant questions.
type: array
items:
$ref: '#/components/schemas/KYCApplicationEntry'
required:
- entries
title: UpdateKYCSubaccountApplicationRequest
GetKYCAffiliatesResponse:
description: 'Get Onboarding KYC Customer Applications Response
'
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/KYCAffiliate'
page:
$ref: '#/components/schemas/Page'
title: GetKYCAffiliatesResponse
KYCSubaccountApplication:
description: 'Onboarding KYC Customer Account Applications
'
type: object
properties:
entries:
description: A collection of responses for a set of defined relevant questions.
type: array
items:
$ref: '#/components/schemas/KYCApplicationEntry'
errors:
description: A collection of errors validating the responses.
type: array
items:
$ref: '#/components/schemas/KYCApplicationError'
externalId:
description: External identifier for the customer subaccount onboarding application. This value has to be unique for each customer subaccount application.
type: string
name:
description: The name of the subaccount.
type: string
status:
description: Status of the onboarding application
type: string
subaccountId:
description: Unique identifier for the customer subaccount application
type: string
required:
- subaccountId
- externalId
- status
- entries
title: KYCSubaccountApplication
CreateKYCAgreementResponse:
type: object
properties:
data:
$ref: '#/components/schemas/CreateKYCAgreementResponseData'
required:
- data
title: CreateKYCAgreementResponse
CreateKYCDocumentResponseData:
type: object
properties:
url:
description: URL to use for document upload
type: string
required:
- url
title: CreateKYCDocumentResponseData
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
CreateKYCAgreementRequest:
type: object
properties:
frameAncestor:
description: URL where the terms and conditions link should be embedded
type: string
legalEntityName:
description: Legal entity name of the customer
type: string
returnUrl:
description: URL of the page to return to once the terms and conditions have been accepted
type: string
signerEmail:
description: Email of the signer
type: string
signerFirstName:
description: First name of the signer
type: string
signerLastName:
description: Last name of the signer
type: string
termsAgreementFormat:
description: Terms and Conditions format
type: string
default: anchorage
enum:
- anchorage
- docusign
required:
- legalEntityName
- signerFirstName
- signerLastName
- signerEmail
title: CreateKYCAgreementRequest
CreateKYCApplicationResponseData:
type: object
properties:
customerId:
description: Unique identifier for the customer onboarding application
type: string
id:
description: DEPRECATED - Use customerId instead
type: string
status:
description: Status of the customer onboarding application, possible values are DRAFT, IN_PROGRESS, IN_REVIEW and COMPLETE
type: string
required:
- customerId
- status
title: CreateKYCApplicationResponseData
ErrorType:
description: The type of error returned.
type: string
enum:
- InternalError
- InvalidRequest
- Unauthenticated
- Forbidden
- NotFound
- Conflict
- UnprocessableEntity
- TooManyRequests
- ServiceUnavailable
- QuoteExpired
- InsufficientFunds
- NotImplemented
title: ErrorType
CreateKYCDocumentResponse:
type: object
properties:
data:
$ref: '#/components/schemas/CreateKYCDocumentResponseData'
required:
- data
title: CreateKYCDocumentResponse
GetKYCAgreementResponseData:
type: object
properties:
id:
description: Unique identifier for the customer onboarding agreement
type: string
legalEntityName:
description: Legal entity name of the customer
type: string
signerEmail:
description: Email of the signer
type: string
signerFirstName:
description: First name of the signer
type: string
signerLastName:
description: Last name of the signer
type: string
status:
description: Status of the customer onboarding agreement signature process
type: string
enum:
- UNSPECIFIED
- IN_PROGRESS
- COMPLETE
- DECLINED
- VOIDED
termsAgreementFormat:
description: Terms and Conditions format
type: string
enum:
- anchorage
- docusign
url:
description: URL to proceed with the customer onboarding agreement signature
type: string
required:
- id
- status
- legalEntityName
- signerFirstName
- signerLastName
- signerEmail
- termsAgreementFormat
title: GetKYCAgreementResponseData
CreateKYCSubaccountApplicationResponse:
type: object
properties:
data:
$ref: '#/components/schemas/CreateKYCSubaccountApplicationResponseData'
required:
- data
title: CreateKYCSubaccountApplicationResponse
CreateKYCApplicationRequest:
type: object
properties:
applicationType:
description: Anchorage Digital provided type of application, RIA_PC_INDIVIDUAL to Onboard RIA Program Customer who is an Individual and RIA_PC_INSTITUTION to Onboard RIA Program Customer that is an Institution.
type: string
example: RIA_PC_INSTITUTION
enum:
- RIA_PC_INSTITUTION
- RIA_PC_INDIVIDUAL
applicationVersion:
description: Anchorage Digital version of the application. By default, this value is 0.
type: integer
format: int32
default: 0
entries:
description: A collection of responses for a set of defined relevant questions.
type: array
items:
$ref: '#/components/schemas/KYCApplicationEntry'
externalId:
description: External identifier for the customer onboarding application. This value has to be unique for each customer application.
type: string
submit:
description: Optional parameter to try to submit the application if there are no validation errors. This action is irreversible you cannot update the application values after. You can use this to avoid making another api call to POST /v2/onboarding/customers/submit
type: boolean
required:
- entries
title: CreateKYCApplicationRequest
UpdateKYCApplicationResponse:
type: object
properties:
data:
$ref: '#/components/schemas/UpdateKYCApplicationResponseData'
required:
- data
title: UpdateKYCApplicationResponse
UpdateKYCSubaccountApplicationResponse:
type: object
properties:
data:
$ref: '#/components/schemas/UpdateKYCSubaccountApplicationResponseData'
required:
- data
title: UpdateKYCSubaccountApplicationResponse
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
GetKYCSubaccountApplicationsResponse:
description: 'Get Onboarding KYC Account Applications Response
'
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/KYCSubaccountApplicationItem'
page:
$ref: '#/components/schemas/Page'
title: GetKYCSubaccountApplicationsResponse
CreateKYCApplicationResponse:
type: object
properties:
data:
$ref: '#/components/schemas/CreateKYCApplicationResponseData'
required:
- data
title: CreateKYCApplicationResponse
GetKYCAgreementResponse:
type: object
properties:
data:
$ref: '#/components/schemas/GetKYCAgreementResponseData'
required:
- data
title: GetKYCAgreementResponse
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