{"openapi":"3.0.0","paths":{"/transactions":{"post":{"description":"Creates a new outgoing transaction using the provided data. Please note what fields are mandatory.","operationId":"createTransaction","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransactionDto"},"examples":{"minimalValidRequest":{"summary":"Minimal valid request","value":{"asset":"BTC","amount":0.015,"blockchainInfo":{"destination":"example-test-btc-destination-address","destinationType":"CUSTODIAL"}}},"recommendedOutgoingRequest":{"summary":"Fuller recommended outgoing transaction request","value":{"direction":"OUTGOING","asset":"ETH","amount":1.25,"blockchainInfo":{"blockchain":"Ethereum","transactionHash":"0xexampletransactionhash000000000000000000000000000000000000000000000000","origin":"0xExampleOriginAddress000000000000000000000000000000","destination":"0xExampleDestinationAddress000000000000000000000000","destinationType":"CUSTODIAL"},"vaspInfo":{"beneficiaryVaspName":"Example Beneficiary VASP","beneficiaryVaspEmail":"travel-rule@example-beneficiary-vasp.test","beneficiaryVaspExtraInfo":"Example data for documentation only."},"originator":{"type":"NATURAL","name":"Alex Example","accountNumber":"originator-wallet-example-001","address":"123 Example Street, Berlin, Germany","country":"DE","nationalIdentificatorType":"PAS","nationalIdentificator":"P-EXAMPLE-123456","dateOfBirth":"1985-06-15","placeOfBirth":"Tallinn, Estonia"},"beneficiary":{"type":"NATURAL","name":"Jamie Example","accountNumber":"beneficiary-account-example-001","country":"EE"}}}}}}},"responses":{"201":{"description":"Data of the created transaction","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionDto"},"examples":{"transactionCreated":{"summary":"Created transaction","value":{"id":"7b4f0db9-3b7d-4c0f-a5c5-6d7c6e2f9a10","status":"PENDING","direction":"OUTGOING","createdAt":"2026-01-15T10:20:30.000Z","asset":"ETH","amount":1.25,"amountUsd":3125.45,"amountEur":2870.12,"blockchainInfo":{"blockchain":"Ethereum","transactionHash":"0xexampletransactionhash000000000000000000000000000000000000000000000000","origin":"0xExampleOriginAddress000000000000000000000000000000","destination":"0xExampleDestinationAddress000000000000000000000000","destinationType":"CUSTODIAL","isDestinationConfirmed":null,"destinationWalletId":null},"vaspInfo":{"originatorVaspEntityId":"tenant_123","originatorVaspName":"Example Originator VASP","originatorVaspEmail":"travel-rule@example-originator-vasp.test","beneficiaryVaspEntityId":null,"beneficiaryVaspName":"Example Beneficiary VASP","beneficiaryVaspEmail":"travel-rule@example-beneficiary-vasp.test","beneficiaryVaspExtraInfo":"Example data for documentation only."},"originator":{"type":"NATURAL","name":"Alex Example","accountNumber":"originator-wallet-example-001","address":"123 Example Street, Berlin, Germany","country":"DE","nationalIdentificatorType":"PAS","nationalIdentificator":"P-EXAMPLE-123456","dateOfBirth":"1985-06-15","placeOfBirth":"Tallinn, Estonia"},"beneficiary":{"type":"NATURAL","name":"Jamie Example","accountNumber":"beneficiary-account-example-001","country":"EE"},"travelRuleMessageSource":"CryptoSwift"}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Create transaction","tags":["Transactions"]},"get":{"description":"Returns a list of transactions based on the provided parameters.","operationId":"getTransactions","parameters":[{"name":"q","required":false,"in":"query","description":"Search string to filter the results. Searches over all relevant database fields.","schema":{"example":"John","type":"string"}},{"name":"_sort","required":false,"in":"query","description":"Sort field.","schema":{"example":"createdAt","type":"string"}},{"name":"_order","required":false,"in":"query","description":"Order results: ASC or DESC.","schema":{"example":"ASC","type":"string"}},{"name":"_end","required":false,"in":"query","description":"Last item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":30,"type":"number"}},{"name":"_start","required":false,"in":"query","description":"First item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":0,"type":"number"}}],"responses":{"200":{"description":"List of transactions","headers":{"X-Total-Count":{"description":"Total count of results without applying `_start` and `_end` parameters","schema":{"type":"number"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TransactionDto"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Find transactions","tags":["Transactions"]}},"/transactions/{id}":{"get":{"description":"Returns the transaction data","operationId":"getTransaction","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Transaction data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionDto"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Get transaction","tags":["Transactions"]},"patch":{"description":"Updates existing transaction object. Fields can be updated individually, or multiple at once.","operationId":"updateTransaction","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTransactionDto"}}}},"responses":{"200":{"description":""},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Update transaction","tags":["Transactions"]},"delete":{"description":"Deletes the transaction from the system. Important to notice: in case the data has already been forwarded to the beneficiary, they will be notified, but the data can not be automatically be deleted.","operationId":"deleteTransaction","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Delete transaction","tags":["Transactions"]}},"/transactions/{id}/events":{"get":{"description":"Returns immutable event log entries for the given transaction in reverse chronological order. If an event has userId, user details (id, name, email) are included.","operationId":"getTransactionEvents","parameters":[{"name":"id","required":true,"in":"path","description":"Transaction ID.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Transaction events","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TransactionEventDto"}}}}},"404":{"description":"Transaction was not found"}},"security":[{"X-Api-Key":[]}],"summary":"Get transaction events","tags":["Transactions"]}},"/tenant/me/service-keys":{"put":{"description":"Upsert the tenant service key for a feature/provider pair; creates if missing, updates if present.","operationId":"upsertTenantServiceKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantServiceKeyDto"}}}},"responses":{"200":{"description":"The upserted tenant service key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantServiceKeyDto"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Set external integration api key","tags":["External Integrations"]}},"/tenant/me":{"get":{"description":"Returns the data of the tenant associated with the current API key","operationId":"getTenant","parameters":[],"responses":{"200":{"description":"The current tenant data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantDto"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Get current tenant data","tags":["Tenant"]},"patch":{"description":"Update tenant data associated with the current API key. All fields can be updated individually by just providing the desired field, or multiple at once.","operationId":"updateTenant","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantDto"}}}},"responses":{"200":{"description":""},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Update current tenant","tags":["Tenant"]}},"/tenant/me/reports":{"get":{"description":"Returns the most recent monthly reports for the authenticated tenant (for up to 36 months). Use the `downloadEndpoint` to fetch a short-lived signed URL.","operationId":"getTenantReports","parameters":[],"responses":{"200":{"description":"Array of tenant reports","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TenantReportDto"}}}}}},"security":[{"X-Api-Key":[]}],"summary":"List my latest reports","tags":["Tenant"]}},"/tenant/me/reports/{ym}/download-url":{"get":{"description":"\n  Generates a short-lived Google Cloud Storage signed URL for the authenticated client's monthly report.  \n  The URL is valid only for a short time (default ~60 seconds) and can be used in the browser without API authentication headers.\n\n  - **Path parameter**: `:ym` should be in `YYYY-MM` format (e.g. `2025-07`).\n  - **Response**: returns JSON containing `url` (signed URL) and `expiresAt` (ISO timestamp).\n  - **Use case**: your frontend should call this endpoint with API auth headers, then redirect the user to the returned `url` to view/download the PDF.\n  ","operationId":"getTenantReportDownloadUrl","parameters":[{"name":"ym","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadUrlDto"}}}},"404":{"description":"Report not found for the specified month"}},"security":[{"X-Api-Key":[]}],"summary":"Get signed URL for monthly report","tags":["Tenant"]}},"/tenant/me/statistics":{"get":{"operationId":"getTenantStatistics","parameters":[{"name":"month","required":false,"in":"query","description":"YYYY-MM (defaults to current month)","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantStatisticsResponseDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Get statistics for current tenant (month=YYYY-MM)","tags":["Tenant"]}},"/entities":{"get":{"description":"Returns a list of entities based on the provided parameters.","operationId":"getEntities","parameters":[{"name":"_start","required":false,"in":"query","description":"First item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":0,"type":"string"}},{"name":"_end","required":false,"in":"query","description":"Last item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":20,"type":"string"}},{"name":"_order","required":false,"in":"query","description":"Sort order","schema":{"example":"ASC","type":"string","enum":["ASC","DESC"]}},{"name":"_sort","required":false,"in":"query","description":"Sort field","schema":{"example":"updatedAt","type":"string"}},{"name":"q","required":false,"in":"query","description":"Search string to filter the results.","schema":{"example":"Binance","type":"string"}},{"name":"_inNetwork","required":false,"in":"query","description":"Filter by in-network flag","schema":{"example":true,"type":"string"}},{"name":"_isRiskAssessed","required":false,"in":"query","description":"Filter by risk-assessed flag","schema":{"example":true,"type":"string"}},{"name":"_type","required":false,"in":"query","description":"Filter results by entity type (multi-value)","schema":{"example":["exchange","investment_management_firm"],"type":"array","items":{"type":"string","enum":["exchange","bank","decentralized_service","donations","gambling","investment_management_firm","mining_pool","mixing_service","service","staking_pool","wallet","payment_service_provider","nft_marketplace","sanction_list","dex","atm","bot","airdrop","auctioned_assets","block_reward","child_abuse","cloud_mining","community_reported_scam","cross_chain_bridge_protocol","darkweb","hack","ico","ignored_small_amounts","large_transaction","large_unnamed_entity","no_entities_found","mixing_pattern","ongoing_legal_action","payment_channel","peeling_chain_unknown_origin","phishing","poisoning","ransomware","real_world_asset","scam","secondary_coin_creation","secondary_coin_removal","seized_assets","suspicious","terrorism","token","unspent_output"]}}},{"name":"_riskSeverity","required":false,"in":"query","description":"Filter results by risk severity (multi-value)","schema":{"example":["high","medium"],"type":"array","items":{"type":"string","enum":["low","medium","high"]}}}],"responses":{"200":{"description":"List of entities matching the search criteria","headers":{"X-Total-Count":{"description":"Total count of results without applying `_start` and `_end` parameters","schema":{"type":"number"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EntityDto"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Find entities","tags":["Entities"]}},"/entities/lookup":{"get":{"description":"Returns the entity. If the name belongs to a linked duplicate, the master entity is returned.","operationId":"resolveEntity","parameters":[{"name":"name","required":true,"in":"query","description":"Name of the entity.","schema":{"example":"Binance.com","type":"string"}}],"responses":{"200":{"description":"Resolves the entity for the provided name.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityDetailedDto"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Resolve entity by name","tags":["Entities"]}},"/entities/{id}":{"get":{"operationId":"getEntity","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Entity details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntityDetailedDto"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Find entity by ID","tags":["Entities"]}},"/wallets":{"get":{"description":"Returns a list of wallets connected to (owned by) the current tenant, based on the provided parameters.","operationId":"getWallets","parameters":[{"name":"_status","required":false,"in":"query","description":"Search string to filter the result by status.","examples":{"Confirmed":{"value":"CONFIRMED","description":"returns only confirmed wallets"},"Unconfirmed":{"value":"UNCONFIRMED","description":"returns only unconfirmed wallets"}},"schema":{"type":"string"}},{"name":"q","required":false,"in":"query","description":"Search string to filter the results. Searches for wallet address, asset and metadata.","schema":{"example":"BTC","type":"string"}},{"name":"_sort","required":false,"in":"query","description":"Sort field.","schema":{"example":"asset","type":"string"}},{"name":"_order","required":false,"in":"query","description":"Order results: ASC or DESC.","schema":{"example":"ASC","type":"string"}},{"name":"_end","required":false,"in":"query","description":"Last item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":30,"type":"number"}},{"name":"_start","required":false,"in":"query","description":"First item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":0,"type":"number"}}],"responses":{"200":{"description":"List of associated wallets of the current tenant.","headers":{"X-Total-Count":{"description":"Total count of results without applying `_start` and `_end` parameters","schema":{"type":"number"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletDto"}}}}}},"security":[{"X-Api-Key":[]}],"summary":"Find wallets","tags":["My Wallets"]},"post":{"description":"Create a wallet owned by the current tenant. The wallet will be created as confirmed automatically.","operationId":"createWallet","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWalletDto"}}}},"responses":{"201":{"description":"Data of the created wallet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Create wallet","tags":["My Wallets"]},"patch":{"description":"Confirms existing multiple wallet addresses in bulk.","operationId":"confirmWallets","parameters":[],"requestBody":{"required":true,"description":"List of existing wallets ids to confirm.","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"}}}}},"responses":{"200":{"description":""}},"security":[{"X-Api-Key":[]}],"summary":"Confirm multiple wallet addresses","tags":["My Wallets"]},"delete":{"description":"Deletes wallets from the system. Important: this action can not be reversed!","operationId":"deleteWallets","parameters":[],"requestBody":{"required":true,"description":"List of existing wallets ids to delete","content":{"application/json":{"schema":{"type":"array","items":{"type":"number"}}}}},"responses":{"204":{"description":""}},"security":[{"X-Api-Key":[]}],"summary":"Delete wallets","tags":["My Wallets"]}},"/wallets/{id}":{"get":{"description":"Returns the wallet data for the specified wallet, owned by the current tenant.","operationId":"getWallet","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"Wallet data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Get wallet","tags":["My Wallets"]},"patch":{"description":"Updates existing wallet. The wallet can be updated to confirmed or unconfirmed.","operationId":"updateWallet","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWalletDto"}}}},"responses":{"200":{"description":""}},"security":[{"X-Api-Key":[]}],"summary":"Update wallet","tags":["My Wallets"]},"delete":{"description":"Deletes the wallet from the system. Important: this action can not be reversed!","operationId":"deleteWallet","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"204":{"description":""}},"security":[{"X-Api-Key":[]}],"summary":"Delete wallet","tags":["My Wallets"]}},"/wallets/upload-csv":{"post":{"description":"You can upload CSV file in the next format `address`, `asset`, `blockchain`, and optionally `metadata`. The file size should not exceed 5MB.","operationId":"uploadWalletsCsv","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WalletsUploadRequestDto"}}}},"responses":{"201":{"description":"Wallets successfully uploaded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletsUploadResponseDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Upload wallets from CSV file","tags":["My Wallets"]}},"/rule-engine":{"get":{"description":"Returns all rule engine configurations available for the authenticated tenant. By default, INCOMING and OUTGOING policies are auto-created per tenant. Currently, only one policy can be active per direction.","operationId":"getRuleEngines","parameters":[],"responses":{"200":{"description":"All rule engine configurations for the current tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEngineListResponseDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Get all rule engine configurations","tags":["Rule Engine"]}},"/rule-engine/{id}":{"get":{"operationId":"getRuleEngineById","parameters":[{"name":"id","required":true,"in":"path","description":"Rule engine ID.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Rule engine configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEngineDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Get one rule engine configuration by ID","tags":["Rule Engine"]}},"/rule-engine/{id}/draft":{"patch":{"description":"Updates the draft rules for a rule engine. For amount conditions, you can also include `currency` with values `USD` or `EUR`.","operationId":"updateRuleEngineDraft","parameters":[{"name":"id","required":true,"in":"path","description":"Rule engine ID.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Draft update payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDraftDto"}}}},"responses":{"200":{"description":"Updated rule engine configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEngineDto"}}}},"400":{"description":"Rule validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEngineValidationErrorResponseDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Update draft rules","tags":["Rule Engine"]}},"/rule-engine/{id}/publish":{"post":{"description":"Publishes current draft rules, increments publishedVersion, creates an immutable version snapshot, and stores latest comment on the rule engine.","operationId":"publishRuleEngineDraft","parameters":[{"name":"id","required":true,"in":"path","description":"Rule engine ID.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Publish payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishDto"}}}},"responses":{"201":{"description":"Draft published and immutable version snapshot created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEnginePublishResponseDto"}}}},"400":{"description":"Rule validation failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEngineValidationErrorResponseDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Publish draft rules","tags":["Rule Engine"]}},"/rule-engine/{id}/versions":{"get":{"operationId":"listRuleEnginePublishedVersions","parameters":[{"name":"id","required":true,"in":"path","description":"Rule engine ID.","schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Published version history.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEngineVersionsResponseDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"List published versions","tags":["Rule Engine"]}},"/rule-engine/{id}/versions/{version}":{"get":{"operationId":"getRuleEngineVersion","parameters":[{"name":"id","required":true,"in":"path","description":"Rule engine ID.","schema":{"format":"uuid","type":"string"}},{"name":"version","required":true,"in":"path","description":"Published version number.","schema":{"type":"number"}}],"responses":{"200":{"description":"Published snapshot with full rules.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEngineVersionSnapshotResponseDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Get one published version snapshot","tags":["Rule Engine"]}},"/rule-engine/{id}/restore":{"post":{"operationId":"restoreRuleEngineVersionToDraft","parameters":[{"name":"id","required":true,"in":"path","description":"Rule engine ID.","schema":{"format":"uuid","type":"string"}}],"requestBody":{"required":true,"description":"Restore payload.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreDto"}}}},"responses":{"201":{"description":"Draft restored from the specified published version.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RuleEngineDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Restore published version into draft","tags":["Rule Engine"]}},"/auth/signin":{"post":{"description":"Login the user. ","operationId":"loginUser","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthDto"}}}},"responses":{"201":{"description":"JWT access and refresh tokens for the created user, token expiration in seconds and the user data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserWithJwtDto"}}}}},"security":[],"summary":"Login user","tags":["Authentication"]}},"/auth/logout":{"get":{"description":"Log-out the user. ","operationId":"logoutUser","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Log-out user","tags":["Authentication"]}},"/auth/refresh":{"get":{"description":"Get new access and refresh tokens using the provided refresh token","operationId":"refreshTokens","parameters":[],"responses":{"200":{"description":"New JWT access and refresh tokens for the user","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwtDto"}}}}},"security":[{"bearer":[]}],"summary":"Refresh tokens","tags":["Authentication"]}},"/tenant/me/settings":{"get":{"description":"Returns the settings data of the tenant associated with the current API key","operationId":"getTenantSettings","parameters":[],"responses":{"200":{"description":"The current tenant settings data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantSettingsDto"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Get current tenant settings data","tags":["Tenant"]},"patch":{"description":"Update current tenant settings data associated with the current API key. All fields can be updated individually by just providing the desired field, or multiple at once.","operationId":"updateTenantSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTenantSettingsDto"}}}},"responses":{"200":{"description":""},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Update current tenant settings data","tags":["Tenant"]}},"/tenant/me/settings/logo":{"post":{"description":"Upload tenant logo that is going to be used in CryptoSwift. For example the logo will appear on the wallet verification widget.","operationId":"updateTenantLogo","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Logo file of type jpeg, png, jpg or pdf with the size limit of up to 5MB"}},"required":["file"]}}}},"responses":{"200":{"description":"The uploaded file metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadLogoDto"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Upload tenant logo","tags":["Tenant"]}},"/tenant/me/settings/icon":{"post":{"description":"Upload tenant icon that is going to be used in CryptoSwift. For example the icon will appear on the wallet verification widget.","operationId":"updateTenantLogoIcon","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Icon file of type jpeg, png, jpg or pdf with the size limit of up to 5MB"}},"required":["file"]}}}},"responses":{"200":{"description":"The uploaded file metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadLogoDto"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Upload tenant icon","tags":["Tenant"]}},"/users":{"post":{"description":"The user will be added based on the provided API key for the tenant owning the API key.\n          The added user account can be used to fetch data from the CryptoSwift API in a similar way as with API keys,\n          but using standard JWT apporach (access and refresh tokens).\n          The API call returns the JWT access and refresh tokens that can be used for the added account.","operationId":"createUser","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUserDto"}}}},"responses":{"201":{"description":"JWT access and refresh tokens for the created user, token expiration in seconds and the created user data.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserWithJwtDto"}}}}},"security":[{"bearer":[]},{"X-Api-Key":[]}],"summary":"Add new user account for current tenant","tags":["Users"]},"get":{"description":"Returns a list of users based on the provided parameters.","operationId":"getUsers","parameters":[{"name":"q","required":false,"in":"query","description":"Search string to filter the results. Searches over the name, username and email of the user.","schema":{"example":"John","type":"string"}},{"name":"_sort","required":false,"in":"query","description":"Sort field.","schema":{"example":"name","type":"string"}},{"name":"_order","required":false,"in":"query","description":"Order results: ASC or DESC.","schema":{"example":"ASC","type":"string"}},{"name":"_end","required":false,"in":"query","description":"Last item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":30,"type":"number"}},{"name":"_start","required":false,"in":"query","description":"First item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":0,"type":"number"}}],"responses":{"200":{"description":"List of users for the current tenant","headers":{"X-Total-Count":{"description":"Total count of results without applying `_start` and `_end` parameters","schema":{"type":"number"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserDto"}}}}}},"security":[{"bearer":[]},{"X-Api-Key":[]}],"summary":"Find current tenant users","tags":["Users"]}},"/users/{id}":{"get":{"description":"Returns the user data","operationId":"getUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"User data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDto"}}}}},"security":[{"bearer":[]},{"X-Api-Key":[]}],"summary":"Get user","tags":["Users"]},"patch":{"description":"Updates existing user. Fields can be updated individually, or multiple at once.","operationId":"updateUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]},{"X-Api-Key":[]}],"summary":"Update user","tags":["Users"]},"delete":{"description":"Deletes the given user from the system. Important: this action can not be reversed!","operationId":"deleteUser","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]},{"X-Api-Key":[]}],"summary":"Delete user","tags":["Users"]}},"/webhooks/notabene/{id}":{"post":{"description":"Receive incoming Travel Rule notifications from the Notabene network via Webhooks. This is a Tenant specific URL that a Tenant can use in Notabene platform as the Notification Webhook URL.","operationId":"receiveNotabeneWebhook","parameters":[{"name":"id","required":true,"in":"path","description":"Your tenant id","schema":{"type":"number"}}],"responses":{"201":{"description":""}},"security":[],"summary":"Accept incoming Travel Rule notifications from Notabene network","tags":["External Integrations"]}},"/wallet-verification/widget":{"post":{"description":"Starts a short-lived verification flow via a widget for self-hosted wallets. The response includes a URL and display details that VASP must present to their end-customers to complete the verification","operationId":"createWalletVerificationWidget","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetCreateRequestDto"}}}},"responses":{"201":{"description":"Creates a widget flow for self-hosted wallet verification","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WidgetCreateResponseDto"}}}},"400":{"description":"Invalid payload (unsupported flow parameters, unsupported chain/asset, invalid addresses).","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing deposit address for Satoshi Test","value":{"statusCode":400,"message":"Deposit address cannot be null","error":"Bad Request"}},"unsupportedSignatureBlockchain":{"summary":"Blockchain is not supported for Signature Proof","value":{"statusCode":400,"message":"UnknownChain is not supported by Signature Proof Test.","error":"Bad Request"}},"unsupportedAssetCombination":{"summary":"Satoshi Test requested with unsupported asset","value":{"statusCode":400,"message":"Unsupported asset provided for Satoshi Test","error":"INVALID_PAYLOAD","timestamp":"2024-05-18T12:00:00.000Z"}},"invalidWithdrawalAddress":{"summary":"Provided withdrawal address failed validation","value":{"statusCode":400,"message":"The provided address is not valid","error":"INVALID_PAYLOAD","timestamp":"2024-05-18T12:00:00.000Z"}},"invalidDepositAddress":{"summary":"Provided deposit address failed validation","value":{"statusCode":400,"message":"The provided deposit address is not valid","error":"INVALID_PAYLOAD","timestamp":"2024-05-18T12:00:00.000Z"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Creates a widget flow for self-hosted wallet verification","tags":["Self-Hosted Wallet Verification"]}},"/wallet-verification/satoshi-test":{"post":{"description":"This verification method involves the customer sending a minimal amount of a virtual asset to verify they own the self-hosted wallet account","operationId":"createWalletVerificationSatoshiTest","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationSatoshiRequestDto"}}}},"responses":{"201":{"description":"Data of the wallet verification request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationSatoshiResponseDto"}}}},"400":{"description":"Invalid payload (unsupported asset or malformed address).","content":{"application/json":{"examples":{"unsupportedAsset":{"summary":"Asset not supported","value":{"statusCode":400,"message":"Unsupported asset provided.","error":"Bad Request"}},"blockcypherValidationError":{"summary":"Address validation error (e.g. malformed address)","value":{"statusCode":400,"message":"Address is not valid.","error":"INVALID_PAYLOAD","timestamp":"2024-05-18T12:00:00.000Z"}},"blockcypherGenericError":{"summary":"Generic custom error message","value":{"statusCode":400,"message":"There was an error with you request, please contact the customer support.","error":"INVALID_PAYLOAD","timestamp":"2024-05-18T12:00:00.000Z"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Verify a self-hosted wallet using the Satoshi Test method","tags":["Self-Hosted Wallet Verification"]}},"/wallet-verification/visual-proof":{"post":{"description":"This verification method allows you to upload a screenshot to prove the ownership of a customer's self-hosted wallet","operationId":"createWalletVerificationVisualProof","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/WalletVerificationVisualProofRequestDto"}}}},"responses":{"201":{"description":"Data of the wallet verification request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationVisualProofResponseDto"}}}},"400":{"description":"Invalid payload or file upload rejected.","content":{"application/json":{"examples":{"missingFile":{"summary":"No file uploaded","value":{"statusCode":400,"message":"Visual proof file was not provided","error":"Bad Request"}},"invalidFileType":{"summary":"Unsupported mime type provided","value":{"statusCode":400,"message":"Invalid file type. Only images (jpg, jpeg, png) and PDFs are allowed","error":"Bad Request"}},"imageFileTooLarge":{"summary":"Image file exceeds 5MB limit","value":{"statusCode":400,"message":"File too large","error":"Bad Request"}},"videoFileTooLarge":{"summary":"Video file exceeds 50MB limit","value":{"statusCode":400,"message":"File too large","error":"Bad Request"}},"tooManyFiles":{"summary":"Too many files","value":{"statusCode":400,"message":"Maximum 3 files allowed","error":"Bad Request"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Verify a self-hosted wallet using the Visual Proof method","tags":["Self-Hosted Wallet Verification"]}},"/wallet-verification/self-declared":{"post":{"description":"This verification method allows you to self-declare ownership of the self-hosted wallet account","operationId":"createWalletVerificationSelfDeclared","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationSelfDeclaredRequestDto"}}}},"responses":{"201":{"description":"Data of the wallet verification request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationSelfDeclaredResponseDto"}}}},"400":{"description":"Invalid payload when the declaration is not approved or required fields fail validation.","content":{"application/json":{"examples":{"notApproved":{"summary":"Self declaration not approved","value":{"statusCode":400,"message":"Self declaration must be approved (true)","error":"Bad Request"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Verify a self-hosted wallet using the Self Declaration method","tags":["Self-Hosted Wallet Verification"]}},"/wallet-verification/signature-proof":{"post":{"description":"This verification method allows you to verify self-hosted wallet address ownership through a digital signature. The digital signature should be created on a self-hosted wallet.","operationId":"createWalletVerificationSignatureProof","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationSignatureProofRequestDto"}}}},"responses":{"201":{"description":"Data of the wallet verification request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationSignatureProofResponseDto"}}}},"400":{"description":"Invalid payload, unsupported blockchain, or signature/content validation failure.","content":{"application/json":{"examples":{"unsupportedBlockchain":{"summary":"Unsupported blockchain provided","value":{"statusCode":400,"message":"SomeChain is not currently supported in signature proof verification flow.","error":"Bad Request"}},"invalidSignature":{"summary":"Signature verification failed","value":{"statusCode":400,"message":"The provided signature is invalid for this address.","error":"Bad Request"}},"contentMismatch":{"summary":"Signed message contents do not match expected data","value":{"statusCode":400,"message":"The message contents do not match the expected host/domain.","error":"Bad Request"}}}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Verify a self-hosted wallet using the Signature Proof method","tags":["Self-Hosted Wallet Verification"]}},"/wallet-verification":{"get":{"description":"Returns a list of self-hosted wallets verification requests connected to (owned by) the current tenant, based on the provided parameters.","operationId":"getWalletVerifications","parameters":[{"name":"q","required":false,"in":"query","description":"Search string to filter the results. Searches for depositAddress, asset, withdrawalAddress and withdrawalMetadata.","schema":{"example":"BTC","type":"string"}},{"name":"_status","required":false,"in":"query","description":"Search string to filter the result by status.","schema":{"enum":["PENDING","VERIFIED","FAILED","DELETED","DECLINED","ACTION_REQUIRED"],"type":"string"}},{"name":"_flow","required":false,"in":"query","description":"Search string to filter the result by flow type.","schema":{"enum":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"],"type":"string"}},{"name":"_sort","required":false,"in":"query","description":"Sort field.","schema":{"example":"asset","type":"string"}},{"name":"_order","required":false,"in":"query","description":"Order results: ASC or DESC.","schema":{"example":"ASC","type":"string"}},{"name":"_end","required":false,"in":"query","description":"Last item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":30,"type":"number"}},{"name":"_start","required":false,"in":"query","description":"First item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":0,"type":"number"}}],"responses":{"200":{"description":"List of associated self-hosted wallet verification requests","headers":{"X-Total-Count":{"description":"Total count of results without applying `_start` and `_end` parameters","schema":{"type":"number"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WalletVerificationListResponseDto"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Find self-hosted wallet verification requests","tags":["Self-Hosted Wallet Verification"]}},"/wallet-verification/{id}":{"get":{"description":"Returns the self-hosted verification request","operationId":"getWalletVerification","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Self-hosted wallet verification request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationListResponseDto"}}}},"400":{"description":"The provided id is not a valid UUID","content":{"application/json":{"example":{"statusCode":400,"message":"Validation failed (uuid  is expected)","error":"Bad Request"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Wallet verification request not found","content":{"application/json":{"schema":{"example":{"statusCode":404,"message":"Not Found","error":"Not Found"}}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Get self-hosted wallet verification request","tags":["Self-Hosted Wallet Verification"]},"patch":{"operationId":"updateWalletVerification","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationUpdateRequestDto"}}}},"responses":{"204":{"description":""},"400":{"description":"The provided id is not a valid UUID or payload validation failed.","content":{"application/json":{"example":{"statusCode":400,"message":["id must be a UUID","status must be a valid enum value"],"error":"Bad Request"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Wallet verification request not found","content":{"application/json":{"example":{"statusCode":404,"message":"Not Found","error":"Not Found"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Update a self-hosted wallet verification request.","tags":["Self-Hosted Wallet Verification"]},"delete":{"description":"Deletes the self-hosted wallet verification request from the system. Important: this action can not be reversed!","operationId":"deleteWalletVerification","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"description":"The provided id is not a valid UUID","content":{"application/json":{"example":{"statusCode":400,"message":"Validation failed (uuid is expected)","error":"Bad Request"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Wallet verification request not found","content":{"application/json":{"example":{"statusCode":404,"message":"Not Found","error":"Not Found"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Delete self-hosted wallet verification request","tags":["Self-Hosted Wallet Verification"]}},"/wallet-verification/visual-proof/{id}/signed-url":{"get":{"operationId":"getWalletVerificationVisualProofSignedUrl","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Temporarily accessible URL of Visual Proof of the wallet verification request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalletVerificationVisualProofSignedUrlResponseDto"}}}},"400":{"description":"The provided id is not a valid UUID","content":{"application/json":{"example":{"statusCode":400,"message":"Validation failed (uuid is expected)","error":"Bad Request"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"examples":{"missingDepositAddress":{"summary":"Missing or invalid API key","value":{"statusCode":401,"message":"Unauthorized"}}}}}},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"Visual proof was not found or does not belong to the tenant","content":{"application/json":{"example":{"statusCode":404,"message":"Not Found","error":"Not Found"}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalServerError"}},"security":[{"X-Api-Key":[]}],"summary":"Get a temporarily accessible URL of the Visual Proof","tags":["Self-Hosted Wallet Verification"]}},"/claims":{"post":{"description":"Claim an incoming transactions without travel rule data","operationId":"createClaim","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClaimDto"}}}},"responses":{"201":{"description":"Data of the claim request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetailedClaimDto"}}}}},"security":[{"X-Api-Key":[]}],"summary":"Create claim","tags":["Claims"]},"get":{"description":"Returns a list of claim requests connected to (owned by) the current tenant, based on the provided parameters.","operationId":"getClaims","parameters":[{"name":"q","required":false,"in":"query","description":"Search string to filter the results. Searches for transactionHash, origin address, destination address, asset and blockchain.","schema":{"example":"BTC","type":"string"}},{"name":"_status","required":false,"in":"query","description":"Search string to filter the result by status.","schema":{"enum":["PENDING","DELIVERED","CONFIRMED"],"type":"string"}},{"name":"_sort","required":false,"in":"query","description":"Sort field.","schema":{"example":"asset","type":"string"}},{"name":"_order","required":false,"in":"query","description":"Order results: ASC or DESC.","schema":{"example":"ASC","type":"string"}},{"name":"_end","required":false,"in":"query","description":"Last item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":30,"type":"number"}},{"name":"_start","required":false,"in":"query","description":"First item index to be returned from the search results (total count provided in the `X-Total-Count` header of the response), can be used for pagination.","schema":{"example":0,"type":"number"}}],"responses":{"200":{"description":"List of associated claim requests","headers":{"X-Total-Count":{"description":"Total count of results without applying `_start` and `_end` parameters","schema":{"type":"number"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DetailedClaimDto"}}}}}},"security":[{"X-Api-Key":[]}],"summary":"Find claim requests","tags":["Claims"]}},"/blockchains":{"get":{"description":"Returns a list of known all supported blockchains by CryptoSwift. Use the returned \"name\" field to identify the blockchain across different API endpoints that require the blockchain (eg Create Transaction, Create Self-hosted Wallet Verification, Create Wallet).","operationId":"getBlockchains","parameters":[{"name":"supportedVerificationFlow","required":false,"in":"query","style":"form","explode":true,"description":"Filter blockchains by one or more wallet verification flows. When this query parameter is present, the response also includes the supportedVerificationFlow field.","examples":{"singleFlow":{"summary":"Filter by one verification flow","description":"Returns blockchains that support Signature Proof.","value":["SIGNATURE_PROOF"]},"multipleFlows":{"summary":"Filter by multiple verification flows","description":"Repeat the query parameter to return blockchains that support any of the provided flows.","value":["SIGNATURE_PROOF","SATOSHI_TEST"]}},"schema":{"type":"array","items":{"type":"string","enum":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"]}}}],"responses":{"200":{"description":"List of blockchains.","headers":{"X-Total-Count":{"description":"Total count of results without applying `_start` and `_end` parameters","schema":{"type":"number"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlockchainNameDto"}}}}}},"security":[{"X-Api-Key":[]}],"summary":"List blockchains","tags":["Blockchains"]}},"/utils/checkTIN":{"get":{"description":"Validates the provided TIN (Tax Identification Number). The check is based on the European Commission validation service that can be found at: https://ec.europa.eu/taxation_customs/tin/#/check-tin.\n\nThe online check module confirms whether the structure of the TIN you enter is valid (types and number of characters). It can also validate the syntax (algorithm/internal logic) only when the national authority has provided the Commission with that algorithm.\n\nContrary to VAT number checks carried out on the VIES portal, it does NOT confirm the identity of a person nor whether the TIN you enter actually exists or has been allocated. As national authorities must supply updates, the information cannot be guaranteed to be up to date.\n\nWarning: the TIN online check module can validate only the structure of TINs referring to a natural person. EU Countries may use a different format for legal entities, which cannot be validated with this module.","operationId":"checkTin","parameters":[{"name":"country","required":true,"in":"query","description":"Two-letter ISO 3166-1 alpha-2 country code.","schema":{"example":"EE","type":"string"}},{"name":"tin","required":true,"in":"query","description":"Tax Identification Number to validate.","schema":{"example":"37605030299","type":"string"}}],"responses":{"200":{"description":"TIN validation result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckTinResponseDto"}}}}},"security":[],"summary":"Validate a TIN number","tags":["Utilities"]}}},"info":{"title":"CryptoSwift API","description":"## Introduction\nThe CryptoSwift API is a JSON based REST API: both the request bodies and responses are based on JSON objects.\nThe live OpenAPI specification is available as JSON at [`/api-json`](/api-json) and YAML at [`/api-yaml`](/api-yaml) for on-the-fly API documentation, SDK generation, and agent/tool integration.\n\n### For AI agents and developer tools\n- Agent manifest: [`/.well-known/cryptoswift-agent.json`](/.well-known/cryptoswift-agent.json)\n- OpenAPI JSON: [`/api-json`](/api-json)\n- OpenAPI YAML: [`/api-yaml`](/api-yaml)\n- Developer portal: [https://dev.cryptoswift.eu](https://dev.cryptoswift.eu)\n\nAll API requests should:\n\n- use HTTPS, plain HTTP requests will fail\n- include the API key for authentication\n\nTo get the CryptoSwift API key and start using the API, you need to sign up first. [Sign up for instant access and start building with CryptoSwift today](https://dashboard-dev.cryptoswift.eu/register).\n\n### New to the CryptoSwift API?\n- Find out more about the CryptoSwift API including integration examples in our [Developer Portal](https://dev.cryptoswift.eu/).\n- If you are looking for a UI based solution to manage your Travel Rule transactions, go to our [Client Dashboard](https://dashboard.cryptoswift.eu/).\n\nCryptoSwift provides a JSON REST API over HTTPS for crypto Travel Rule compliance, transaction messaging, VASP/entity discovery, self-hosted wallet verification, reporting, and compliance automation. Use the test environment first, authenticate with the X-Api-Key header, and follow the developer documentation for workflow-level integration guidance.","version":"1.0.0","contact":{"name":"CryptoSwift support","url":"https://cryptoswift.eu"},"summary":"Travel Rule compliance API for crypto asset service providers."},"tags":[{"name":"Authentication","description":"As mentioned above, all API requests need to include the API key. The API key has to be placed inside the request header, in a custom header called `X-Api-Key`"},{"name":"Blockchains","description":"Endpoints related to Blockchains"},{"name":"Entities","description":"Search for entities (VASP's) based on specific parameters.\n- Enables CryptoSwift customers to implement a VASP search functionality in their applications.\n- Users can then specify the beneficiary VASP name when initiating crypto transactions.\n- Helps improve Travel Rule transaction delivery by providing beneficiary VASP data in Travel Rule transaction messages."},{"name":"Transactions","description":"Everything related to managing your Travel Rule transactions: creation, listing, updating and details.\n- These are the main endpoints for managing your Travel Rule transactions and the base for the minimal Travel Rule compliance.\n- See our [Developer Portal](https://dev.cryptoswift.eu/) for more information."},{"name":"Claims","description":"Endpoints related to managing your claims.\n      \n- Claiming Incoming Transactions Without Travel Rule Data"},{"name":"Tenant","description":"Endpoints related to managing your organisation (tenant).\n- Get your tenant data (including your tenant ID).\n- Update your tenant data.\n- The tenant data also allows you to set the Webhook URL for receiving incoming Travel Rule messages from CryptoSwift to your backend/API."},{"name":"Users","description":"Manage your organisation users.\n- CRUD operations for your organisation users.\n- Users can be used to access the CryptoSwift API and the Client Dashboard.\n- In case you wish to access the CryptoSwift API using JWT tokens instead of API keys, you can use the users endpoints and functionality."},{"name":"My Wallets","description":"Endpoints related to managing your wallets. \n- Add your organisation wallets to improve delivery rates for incoming Travel Rule messages.\n- Confirm auto-detected wallets (auto detected by CryptoSwift) to access the Travel Rule messages sent to them.\n- Once you as a licensed VASP add or confirm ownership of a wallet, you are responsible for ensuring that all provided information is accurate and truthful."},{"name":"Rule Engine","description":"Manage tenant rule engine configurations, draft rules, published versions, and restores.\n- By default, each tenant has two policies created automatically: INCOMING and OUTGOING.\n- Currently, only one policy can be active per direction (scope) for a tenant."}],"servers":[{"url":"https://api.cryptoswift.eu","description":"Production environment"},{"url":"https://api-dev.cryptoswift.eu","description":"Test environment"}],"components":{"securitySchemes":{"X-Api-Key":{"type":"apiKey","in":"header","name":"X-Api-Key"},"X-Partner-Api-Key":{"type":"apiKey","in":"header","name":"X-Partner-Api-Key"},"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"TransactionDirection":{"type":"string","enum":["INCOMING","OUTGOING"],"description":"The transaction direction: outgoing or incoming transaction. Set to \"OUTGOING\" automatically if not provided when creating the transaction."},"BlockchainDto":{"type":"object","properties":{"blockchain":{"type":"string","description":"The blockchain name. You can find the list of supported blockchains <a target=\"_blank\" href=\"/#tag/Blockchains/operation/findAll\">here</a> (use the returned \"name\" field). In the required blockchain is not included in the list, you can define your blockchain as free text, but be aware that this might affect Travel Rule message delivery rates."},"transactionHash":{"type":"string","description":"The transaction hash of the on-chain transaction"},"origin":{"type":"string","description":"The origin wallet address"},"destination":{"type":"string","description":"The destination wallet address"},"destinationType":{"type":"string","description":"The destination wallet type","enum":["CUSTODIAL","NON_CUSTODIAL"]}},"required":["destination"]},"VaspDto":{"type":"object","properties":{"originatorVaspEntityId":{"type":"string","description":"The originator VASP entity ID.","readOnly":true},"originatorVaspName":{"type":"string","description":"The originator VASP name. Can be left blank when creating a new transaction, as it is set automatically by the CryptoSwift API"},"originatorVaspEmail":{"type":"string","description":"The originator VASP e-mail address. Can be left blank when creating a new transaction, as it is set automatically by the CryptoSwift API"},"beneficiaryVaspEntityId":{"type":"string","description":"The beneficiary VASP entity ID.","readOnly":true},"beneficiaryVaspName":{"type":"string","description":"The beneficiary VASP name."},"beneficiaryVaspEmail":{"type":"string","description":"The beneficiary VASP e-mail address"},"beneficiaryVaspExtraInfo":{"type":"string","description":"Extra information about the beneficiary VASP (contacts etc in free form)"}}},"OriginatorDto":{"type":"object","properties":{"type":{"type":"string","description":"Originator type: natural or legal person.","enum":["NATURAL","LEGAL"]},"name":{"type":"string","description":"Originator name: the name of the natural or legal person of the originator."},"accountNumber":{"type":"string","description":"Originator account identificator: wallet address or account identificator used by the VASP."},"address":{"type":"string","description":"Address of the originator"},"country":{"type":"string","description":"The country of residence (in case of natural person) or registration (in case of legal person)"},"nationalIdentificatorType":{"type":"string","description":"Provides the national identificator type.            \n* `ALN` Alien registration number assigned by a government agency to identify foreign nationals.            \n* `DRV` Driver license number.            \n* `FIN` Foreign investment identity number - Number assigned to a foreign investor (other than the alien number).            \n* `IDC` Identity card number assigned by a national authority.            \n* `LEI` Legal Entity Identifier (LEI), assigned in accordance with ISO 17442 11 .            \n* `PAS` Passport number assigned by a passport authority.            \n* `RAI` Registration authority identifier - Identifier of a legal entity as maintained by a registration authority.            \n* `SSN` Social security number - Number assigned by a social security agency.            \n* `TXN` Tax identification number - Number assigned by a tax authority to an entity.            \n* `OTH` Other - A national identificator that does not fit any of the defined types or can not be determined.            ","enum":["ALN","DRV","FIN","IDC","LEI","PAS","RAI","SSN","TXN","OTH"]},"nationalIdentificator":{"type":"string","description":"The national identification number of the originator"},"customerNumber":{"type":"string","description":"The customer number/identifier in case of legal person"},"dateOfBirth":{"type":"string","description":"Date of birth (used in case of natural person)"},"placeOfBirth":{"type":"string","description":"Place of birth (used in case of natural person)"}}},"BeneficiaryDto":{"type":"object","properties":{"type":{"type":"string","description":"Beneficiary type: natural or legal person.","enum":["NATURAL","LEGAL"]},"name":{"type":"string","description":"Beneficiary name: the name of the natural or legal person of the beneficiary."},"accountNumber":{"type":"string","description":"Beneficiary account identificator: wallet address or account identificator used by the VASP."},"country":{"type":"string","description":"The country of residence (in case of natural person) or registration (in case of legal person)"},"nationalIdentificatorType":{"type":"string","description":"Provides the national identificator type.            \n* `ALN` Alien registration number assigned by a government agency to identify foreign nationals.            \n* `DRV` Driver license number.            \n* `FIN` Foreign investment identity number - Number assigned to a foreign investor (other than the alien number).            \n* `IDC` Identity card number assigned by a national authority.            \n* `LEI` Legal Entity Identifier (LEI), assigned in accordance with ISO 17442 11 .            \n* `PAS` Passport number assigned by a passport authority.            \n* `RAI` Registration authority identifier - Identifier of a legal entity as maintained by a registration authority.            \n* `SSN` Social security number - Number assigned by a social security agency.            \n* `TXN` Tax identification number - Number assigned by a tax authority to an entity.            \n* `OTH` Other - A national identificator that does not fit any of the defined types or can not be determined.            ","enum":["ALN","DRV","FIN","IDC","LEI","PAS","RAI","SSN","TXN","OTH"]},"nationalIdentificator":{"type":"string","description":"The national identification number of the beneficiary"}}},"WarningDto":{"type":"object","properties":{"code":{"type":"string","description":"The warning code"},"message":{"type":"string","description":"The warning description"},"details":{"type":"string","description":"The warning details"}},"required":["code","message"]},"TransactionRiskScoreDto":{"type":"object","properties":{"originatorRiskScore":{"type":"number","description":"Overall numerical (0 - 100) risk score of the originator of the transaction. Higher values mean a higher risk."},"originatorRiskSeverity":{"type":"string","description":"Overall risk severity of the originator of the transaction.","enum":["low","medium","high"],"example":"medium"},"beneficiaryRiskScore":{"type":"number","description":"Overall numerical (0 - 100) risk score of the beneficiary of the transaction. Higher values mean a higher risk."},"beneficiaryRiskSeverity":{"type":"string","description":"Overall risk severity of the beneficiary of the transaction.","enum":["low","medium","high"],"example":"low"}}},"RuleDecision":{"type":"string","enum":["PROCEED","WAIT","REVIEW","BLOCK"],"description":"Final decision from the matched published rule. Null when no published rules exist."},"RuleConditionOperator":{"type":"string","enum":["EQ","NEQ","GT","GTE","LT","LTE","IN","NOT_IN","CONTAINS","STARTS_WITH","ENDS_WITH","EXISTS","NOT_EXISTS"],"description":"Condition operator."},"TenantCurrency":{"type":"string","enum":["EUR","USD"],"description":"Optional amount currency."},"TransactionRuleEngineConditionDto":{"type":"object","properties":{"field":{"type":"string","description":"Condition field.","example":"amount"},"operator":{"description":"Condition operator.","allOf":[{"$ref":"#/components/schemas/RuleConditionOperator"}]},"value":{"description":"Condition value.","oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}]},"currency":{"description":"Optional amount currency.","allOf":[{"$ref":"#/components/schemas/TenantCurrency"}]}},"required":["field","operator"]},"TransactionRuleEngineConditionsDto":{"type":"object","properties":{"all":{"description":"All conditions (AND).","type":"array","items":{"$ref":"#/components/schemas/TransactionRuleEngineConditionDto"}},"any":{"description":"Any conditions (OR).","type":"array","items":{"$ref":"#/components/schemas/TransactionRuleEngineConditionDto"}}},"required":["all","any"]},"RuleEngineScope":{"type":"string","enum":["OUTGOING","INCOMING"],"description":"Rule engine scope used for evaluation."},"RuleTimeoutDecision":{"type":"string","enum":["PROCEED","REVIEW","BLOCK"],"description":"Decision to apply when WAIT times out."},"TransactionRuleEngineDecisionDto":{"type":"object","properties":{"decision":{"description":"Final decision from the matched published rule. Null when no published rules exist.","nullable":true,"allOf":[{"$ref":"#/components/schemas/RuleDecision"}]},"ruleEngineId":{"type":"string","description":"Rule engine ID used for evaluation.","format":"uuid"},"ruleId":{"type":"string","description":"Matched published rule ID. Null when no published rules exist or no explicit rule matched.","nullable":true},"ruleName":{"type":"string","description":"Matched published rule name.","nullable":true},"conditions":{"description":"Full matched published rule condition info (`when` block).","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/TransactionRuleEngineConditionsDto"}]},"ruleEngineVersion":{"type":"number","description":"Rule engine version used for evaluation (0 means no published rules exist yet)."},"scope":{"description":"Rule engine scope used for evaluation.","allOf":[{"$ref":"#/components/schemas/RuleEngineScope"}]},"waitForSeconds":{"type":"number","description":"WAIT duration in seconds when decision=WAIT.","nullable":true},"onTimeoutDecision":{"nullable":true,"description":"Decision to apply when WAIT times out.","allOf":[{"$ref":"#/components/schemas/RuleTimeoutDecision"}]}},"required":["ruleEngineId","ruleEngineVersion","scope"]},"TransactionStatus":{"type":"string","enum":["PENDING","DELIVERED","CONFIRMED","DECLINED","FAILED"],"description":"Optional transaction status to set for incoming transactions only. Outgoing transactions ignore this field."},"CreateTransactionDto":{"type":"object","properties":{"direction":{"description":"The transaction direction: outgoing or incoming transaction. Set to \"OUTGOING\" automatically if not provided when creating the transaction.","allOf":[{"$ref":"#/components/schemas/TransactionDirection"}]},"createdAt":{"type":"string","format":"date-time","description":"Transaction creation date and time according to the ISO 8601 standard, eg. \"2025-01-28T14:38:00.000Z\". Set automatically to the current date and time when creating a new transaction if not provided with the request"},"asset":{"type":"string","description":"The asset symbol that was used for the transaction (BTC, ETH or other)"},"amount":{"type":"number","description":"Amount of asset transferred"},"blockchainInfo":{"description":"Blockchain information (transaction hash, origin and destination wallet addresses)","allOf":[{"$ref":"#/components/schemas/BlockchainDto"}]},"vaspInfo":{"description":"The originator and beneficiary VASP information","allOf":[{"$ref":"#/components/schemas/VaspDto"}]},"originator":{"description":"The originator data. Note: Originator data fields are optional for easier integration but some are required by regulation. See https://dev.cryptoswift.eu/docs/workflows/data-privacy-record-keeping/required-travel-rule-data for details.","allOf":[{"$ref":"#/components/schemas/OriginatorDto"}]},"beneficiary":{"description":"The beneficiary data.  Note: Beneficiary data fields are optional for easier integration but some are required by regulation. See https://dev.cryptoswift.eu/docs/workflows/data-privacy-record-keeping/required-travel-rule-data for details.","allOf":[{"$ref":"#/components/schemas/BeneficiaryDto"}]},"warnings":{"description":"Descriptive warning messages, if applicable.","readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/WarningDto"}},"riskScore":{"description":"Overall risk score and severity of the transaction.","readOnly":true,"allOf":[{"$ref":"#/components/schemas/TransactionRiskScoreDto"}]},"ruleEngine":{"description":"Rule engine evaluation result for this travel rule message.","readOnly":true,"allOf":[{"$ref":"#/components/schemas/TransactionRuleEngineDecisionDto"}]},"status":{"description":"Optional transaction status to set for incoming transactions only. Outgoing transactions ignore this field.","allOf":[{"$ref":"#/components/schemas/TransactionStatus"}]}},"required":["asset","amount","blockchainInfo"]},"BlockchainReadDto":{"type":"object","properties":{"blockchain":{"type":"string","description":"The blockchain name. You can find the list of supported blockchains <a target=\"_blank\" href=\"/#tag/Blockchains/operation/findAll\">here</a> (use the returned \"name\" field). In the required blockchain is not included in the list, you can define your blockchain as free text, but be aware that this might affect Travel Rule message delivery rates."},"transactionHash":{"type":"string","description":"The transaction hash of the on-chain transaction"},"origin":{"type":"string","description":"The origin wallet address"},"destination":{"type":"string","description":"The destination wallet address"},"destinationType":{"type":"string","description":"The destination wallet type","enum":["CUSTODIAL","NON_CUSTODIAL"]},"isDestinationConfirmed":{"type":"boolean","readOnly":true,"description":"Is the destination wallet confirmed by the tenant (true/false). Null if not applicable or not checked yet."},"destinationWalletId":{"type":"number","readOnly":true,"description":"The destination wallet id. Null if not applicable or not checked yet."}},"required":["destination","isDestinationConfirmed","destinationWalletId"]},"TransactionDto":{"type":"object","properties":{"id":{"type":"string","description":"The transaction ID"},"status":{"description":"The transaction status","allOf":[{"$ref":"#/components/schemas/TransactionStatus"}]},"statusReasoning":{"type":"string","description":"The transaction status reasoning"},"direction":{"description":"The transaction direction: outgoing or incoming transaction. Set to \"OUTGOING\" automatically if not provided when creating the transaction.","allOf":[{"$ref":"#/components/schemas/TransactionDirection"}]},"createdAt":{"type":"string","format":"date-time","description":"Transaction creation date and time according to the ISO 8601 standard, eg. \"2025-01-28T14:38:00.000Z\". Set automatically to the current date and time when creating a new transaction if not provided with the request"},"asset":{"type":"string","description":"The asset symbol that was used for the transaction (BTC, ETH or other)"},"amount":{"type":"number","description":"Amount of asset transferred"},"amountUsd":{"type":"number","readOnly":true,"description":"Converted transaction amount in USD"},"amountEur":{"type":"number","readOnly":true,"description":"Converted transaction amount in EUR"},"blockchainInfo":{"description":"Blockchain information (transaction hash, origin and destination wallet addresses)","allOf":[{"$ref":"#/components/schemas/BlockchainReadDto"}]},"vaspInfo":{"description":"The originator and beneficiary VASP information","allOf":[{"$ref":"#/components/schemas/VaspDto"}]},"originator":{"description":"The originator data. Note: Originator data fields are optional for easier integration but some are required by regulation. See https://dev.cryptoswift.eu/docs/workflows/data-privacy-record-keeping/required-travel-rule-data for details.","allOf":[{"$ref":"#/components/schemas/OriginatorDto"}]},"beneficiary":{"description":"The beneficiary data.  Note: Beneficiary data fields are optional for easier integration but some are required by regulation. See https://dev.cryptoswift.eu/docs/workflows/data-privacy-record-keeping/required-travel-rule-data for details.","allOf":[{"$ref":"#/components/schemas/BeneficiaryDto"}]},"travelRuleMessageSource":{"type":"string","description":"The originating network of the travel rule message. Note: CryptoSwift integrates seamlessly with multiple networks; this property specifies which network the message came from."},"warnings":{"description":"Descriptive warning messages, if applicable.","readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/WarningDto"}},"riskScore":{"description":"Overall risk score and severity of the transaction.","readOnly":true,"allOf":[{"$ref":"#/components/schemas/TransactionRiskScoreDto"}]},"ruleEngine":{"description":"Rule engine evaluation result for this travel rule message.","readOnly":true,"allOf":[{"$ref":"#/components/schemas/TransactionRuleEngineDecisionDto"}]}},"required":["id","status","asset","amount","blockchainInfo"]},"UpdateBlockchainInfoDto":{"type":"object","properties":{"blockchain":{"type":"string","description":"The blockchain name. You can find the list of supported blockchains <a target=\"_blank\" href=\"/#tag/Blockchains/operation/findAll\">here</a> (use the returned \"name\" field). In the required blockchain is not included in the list, you can define your blockchain as free text, but be aware that this might affect Travel Rule message delivery rates."},"transactionHash":{"type":"string","description":"The transaction hash of the on-chain transaction"},"origin":{"type":"string","description":"The origin wallet address"},"destinationType":{"type":"string","description":"The destination wallet type","enum":["CUSTODIAL","NON_CUSTODIAL"]}}},"UpdateTransactionDto":{"type":"object","properties":{"status":{"description":"The transaction status","allOf":[{"$ref":"#/components/schemas/TransactionStatus"}]},"statusReasoning":{"type":"string","description":"The transaction status reasoning"},"direction":{"description":"The transaction direction: outgoing or incoming transaction. Set to \"OUTGOING\" automatically if not provided when creating the transaction.","allOf":[{"$ref":"#/components/schemas/TransactionDirection"}]},"createdAt":{"type":"string","format":"date-time","description":"Transaction creation date and time according to the ISO 8601 standard, eg. \"2025-01-28T14:38:00.000Z\". Set automatically to the current date and time when creating a new transaction if not provided with the request"},"asset":{"type":"string","description":"The asset symbol that was used for the transaction (BTC, ETH or other)"},"amount":{"type":"number","description":"Amount of asset transferred"},"vaspInfo":{"description":"The originator and beneficiary VASP information","allOf":[{"$ref":"#/components/schemas/VaspDto"}]},"originator":{"description":"The originator data. Note: Originator data fields are optional for easier integration but some are required by regulation. See https://dev.cryptoswift.eu/docs/workflows/data-privacy-record-keeping/required-travel-rule-data for details.","allOf":[{"$ref":"#/components/schemas/OriginatorDto"}]},"beneficiary":{"description":"The beneficiary data.  Note: Beneficiary data fields are optional for easier integration but some are required by regulation. See https://dev.cryptoswift.eu/docs/workflows/data-privacy-record-keeping/required-travel-rule-data for details.","allOf":[{"$ref":"#/components/schemas/BeneficiaryDto"}]},"warnings":{"description":"Descriptive warning messages, if applicable.","readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/WarningDto"}},"riskScore":{"description":"Overall risk score and severity of the transaction.","readOnly":true,"allOf":[{"$ref":"#/components/schemas/TransactionRiskScoreDto"}]},"ruleEngine":{"description":"Rule engine evaluation result for this travel rule message.","readOnly":true,"allOf":[{"$ref":"#/components/schemas/TransactionRuleEngineDecisionDto"}]},"blockchainInfo":{"description":"Blockchain information (destination address cannot be modified through this endpoint)","allOf":[{"$ref":"#/components/schemas/UpdateBlockchainInfoDto"}]}}},"TransactionEventType":{"type":"string","enum":["TRANSACTION_CREATED","DATA_UPDATED","STATUS_UPDATED","SYSTEM_STATUS_UPDATED","MIRRORED_UPDATE_APPLIED"],"description":"Type of event."},"TransactionEventActorType":{"type":"string","enum":["SYSTEM","USER","API_KEY","COUNTERPARTY"],"description":"Actor type that triggered the event."},"UserSummaryDto":{"type":"object","properties":{"id":{"type":"number","description":"User ID of the actor that triggered the event."},"name":{"type":"string","description":"Display name of the user."},"email":{"type":"string","description":"Email of the user."}},"required":["id","name","email"]},"TransactionEventRuleConditionDto":{"type":"object","properties":{"field":{"type":"string","description":"Condition field name.","example":"amount"},"operator":{"description":"Condition operator.","allOf":[{"$ref":"#/components/schemas/RuleConditionOperator"}]},"value":{"description":"Condition value.","oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}]},"currency":{"description":"Optional currency for amount conditions.","allOf":[{"$ref":"#/components/schemas/TenantCurrency"}]}},"required":["field","operator"]},"TransactionEventRuleConditionsDto":{"type":"object","properties":{"all":{"description":"All conditions (logical AND).","type":"array","items":{"$ref":"#/components/schemas/TransactionEventRuleConditionDto"}},"any":{"description":"Any conditions (logical OR).","type":"array","items":{"$ref":"#/components/schemas/TransactionEventRuleConditionDto"}}},"required":["all","any"]},"TransactionEventRuleEngineDto":{"type":"object","properties":{"decision":{"description":"Decision calculated from published rules. Null when no published rules existed.","nullable":true,"allOf":[{"$ref":"#/components/schemas/RuleDecision"}]},"ruleEngineId":{"type":"string","format":"uuid","description":"Rule engine ID used when this event was logged."},"ruleId":{"type":"string","nullable":true,"description":"Matched rule ID."},"ruleName":{"type":"string","nullable":true,"description":"Matched rule name."},"conditions":{"nullable":true,"description":"Matched rule conditions (`when` block).","type":"object","allOf":[{"$ref":"#/components/schemas/TransactionEventRuleConditionsDto"}]},"ruleEngineVersion":{"type":"number","description":"Rule engine version used when this event was logged (0 means no published rules existed)."}},"required":["ruleEngineId","ruleEngineVersion"]},"TransactionEventDto":{"type":"object","properties":{"id":{"type":"string","description":"Transaction event ID."},"transactionId":{"type":"string","description":"Transaction ID this event belongs to."},"eventType":{"description":"Type of event.","allOf":[{"$ref":"#/components/schemas/TransactionEventType"}]},"actorType":{"description":"Actor type that triggered the event.","allOf":[{"$ref":"#/components/schemas/TransactionEventActorType"}]},"createdAt":{"type":"string","format":"date-time","description":"Event creation timestamp."},"userId":{"type":"number","description":"User ID when actorType is USER."},"user":{"description":"User details when the event has a userId.","allOf":[{"$ref":"#/components/schemas/UserSummaryDto"}]},"status":{"type":"string","description":"Status after the event."},"statusReasoning":{"type":"string","description":"Status reasoning after the event."},"changedFields":{"description":"List of changed field paths.","type":"array","items":{"type":"string"}},"piiChanged":{"type":"boolean","description":"True when any changed field is PII or under originator/beneficiary."},"ruleEngine":{"description":"Rule engine decision metadata captured at event write time.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/TransactionEventRuleEngineDto"}]}},"required":["id","transactionId","eventType","actorType","createdAt","changedFields","piiChanged"]},"AmlSearchResponseDto":{"type":"object","properties":{"wallets":{"type":"object","example":{"metadata":{"offset":0,"limit":10,"count":1,"total":1},"items":[{"blockchain":"Bitcoin","hash":"bc1qexample...","hasActivity":true}]}},"transactions":{"type":"object","example":{"metadata":{"offset":0,"limit":10,"count":1,"total":1},"items":[{"blockchain":"Bitcoin","hash":"d4f6e7..."}]}},"originalResponse":{"type":"object","description":"Original provider response for debugging purposes.","additionalProperties":true}},"required":["wallets","transactions"]},"AmlWalletAnalysisDto":{"type":"object","properties":{"wallet":{"type":"object","readOnly":true},"incoming":{"type":"object","readOnly":true},"outgoing":{"type":"object","readOnly":true}},"required":["wallet","incoming","outgoing"]},"AmlWalletOnChainActivityDto":{"type":"object","properties":{"firstActivityDate":{"format":"date-time","type":"string"},"lastActivityDate":{"format":"date-time","type":"string"},"balance":{"type":"number"},"totalReceived":{"type":"number"},"totalSent":{"type":"number"},"txCount":{"type":"number"},"fundedByTxHash":{"type":"string"}},"required":["firstActivityDate","lastActivityDate","balance","totalReceived","totalSent","txCount","fundedByTxHash"]},"AmlWalletEntityInfoDto":{"type":"object","properties":{}},"AmlCheckWalletResponseDto":{"type":"object","properties":{"analysis":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/AmlWalletAnalysisDto"}]},"onChainActivity":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/AmlWalletOnChainActivityDto"}]},"entityInfo":{"readOnly":true,"allOf":[{"$ref":"#/components/schemas/AmlWalletEntityInfoDto"}]},"interactions":{"readOnly":true,"type":"array","items":{"type":"string"}}},"required":["analysis","onChainActivity","entityInfo","interactions"]},"AmlMetadataDto":{"type":"object","properties":{"offset":{"type":"number","example":0},"limit":{"type":"number","example":10},"count":{"type":"number","example":3},"total":{"type":"number","example":42}},"required":["offset","limit","count","total"]},"AmlWalletTransactionsDto":{"type":"object","properties":{"metadata":{"$ref":"#/components/schemas/AmlMetadataDto"},"items":{"example":[{"hash":"9c8e0d...","date":"2026-03-19T10:00:00.000Z","originatorAddress":"bc1qorigin...","destinationAddress":"bc1qdest...","direction":"OUT","currency":"BTC","amount":"0.015"}],"type":"array","items":{"type":"string"}},"originalResponse":{"type":"object","description":"Original provider response for debugging purposes.","additionalProperties":true}},"required":["metadata","items"]},"AmlCheckSearchHistoryDto":{"type":"object","properties":{"id":{"type":"string"},"tenantId":{"type":"number"},"objectType":{"type":"string"},"objectId":{"type":"string"},"vaspName":{"type":"string"},"vaspType":{"type":"string"},"riskScore":{"type":"number"},"asset":{"type":"string"},"blockchain":{"type":"string"},"amount":{"type":"number"},"createdAt":{"format":"date-time","type":"string"}},"required":["id","tenantId","objectType","objectId","createdAt"]},"AmlTransactionAnalysisDto":{"type":"object","properties":{"transaction":{"type":"object","readOnly":true},"incoming":{"type":"object","readOnly":true},"outgoing":{"type":"object","readOnly":true}},"required":["transaction","incoming","outgoing"]},"AmlTransactionInfoResponseDto":{"type":"object","properties":{}},"AmlCheckTransactionAnalysisDto":{"type":"object","properties":{"analysis":{"$ref":"#/components/schemas/AmlTransactionAnalysisDto"},"transactionInfo":{"$ref":"#/components/schemas/AmlTransactionInfoResponseDto"},"origin":{"type":"object","description":"Origin wallet aggregated coin and activity data.","additionalProperties":true},"destination":{"type":"object","description":"Destination wallet aggregated coin and activity data.","additionalProperties":true}},"required":["analysis","transactionInfo","origin","destination"]},"UpdateTenantServiceKeyDto":{"type":"object","properties":{"feature":{"type":"string","description":"The feature associated with the service key","enum":["aml_check"]},"provider":{"type":"string","description":"The provider of the service key"},"key":{"type":"string","description":"The service key"}},"required":["feature","provider","key"]},"TenantServiceKeyDto":{"type":"object","properties":{"id":{"type":"string","description":"The service key ID","readOnly":true},"tenantId":{"type":"number","description":"The tenant ID","readOnly":true},"feature":{"type":"string","description":"The feature associated with the service key","enum":["aml_check"]},"provider":{"type":"string","description":"The provider of the service key"},"key":{"type":"string","description":"The service key"},"createdAt":{"format":"date-time","type":"string","description":"The createAt timestamp","readOnly":true},"updatedAt":{"format":"date-time","type":"string","description":"The updatedAt timestamp","readOnly":true}},"required":["id","tenantId","feature","provider","key","createdAt"]},"TenantMfaPolicy":{"type":"string","enum":["optional","required"],"description":"Tenant MFA policy"},"TenantDto":{"type":"object","properties":{"id":{"type":"number","description":"The tenant ID"},"name":{"type":"string","description":"The tenant's service name"},"legalName":{"type":"string","description":"The legal name of the tenant"},"email":{"type":"string","description":"The main email address of the tenant"},"isVerified":{"type":"boolean","description":"Has the tenant been verified by the platform?"},"webhookUrl":{"type":"string","description":"The webhook URL for Travel Rule message notifications"},"webhookSecret":{"type":"string","description":"The webhook Secret: can and should be used for verifying incoming webhook requests. Generated automatically each time when the webhook URL is updated. See the [Developer Portal](https://dev.cryptoswift.eu/docs/integration-guides/webhooks/signatures) for more information"},"apiKey":{"type":"string","description":"The API key"},"notabeneWebhookUrl":{"type":"string","description":"The Notabene webhook url for integration"},"notabeneSecret":{"type":"string","description":"The Notabene webhook secret for integration"},"country":{"type":"string","description":"The country"},"package":{"type":"string","description":"The active package"},"currency":{"description":"The currency","allOf":[{"$ref":"#/components/schemas/TenantCurrency"}]},"transactionsIncluded":{"type":"number","description":"The amount of included transactions"},"webpage":{"type":"string","description":"The webpage"},"townName":{"type":"string","description":"The town name"},"mfaPolicy":{"description":"Tenant MFA policy","default":"optional","allOf":[{"$ref":"#/components/schemas/TenantMfaPolicy"}]},"isWalletVerificationRiskScoringEnabled":{"type":"boolean","description":"Is wallet verification risk scoring enabled"}},"required":["id","name","email","isVerified","apiKey"]},"UpdateTenantDto":{"type":"object","properties":{"name":{"type":"string","description":"The tenant's service name"},"legalName":{"type":"string","description":"The legal name of the tenant"},"email":{"type":"string","description":"The main email address of the tenant"},"webhookUrl":{"type":"string","description":"The webhook URL for Travel Rule message notifications"},"apiKey":{"type":"string","description":"The API key"},"notabeneSecret":{"type":"string","description":"The Notabene webhook secret for integration"},"currency":{"description":"The currency","allOf":[{"$ref":"#/components/schemas/TenantCurrency"}]},"webpage":{"type":"string","description":"The webpage"},"townName":{"type":"string","description":"The town name"},"mfaPolicy":{"description":"Tenant MFA policy","default":"optional","allOf":[{"$ref":"#/components/schemas/TenantMfaPolicy"}]},"isWalletVerificationRiskScoringEnabled":{"type":"boolean","description":"Is wallet verification risk scoring enabled"}}},"TenantReportDto":{"type":"object","properties":{"reportMonth":{"type":"string","description":"Report month in YYYY-MM format","example":"2025-07"},"createdAt":{"type":"string","description":"Timestamp when the report was created (ISO 8601 format)","example":"2025-08-01T12:34:56.000Z","format":"date-time"},"downloadEndpoint":{"type":"string","description":"Relative API endpoint to retrieve a signed download URL for this report","example":"/tenant/me/reports/2025-07/download-url"}},"required":["reportMonth","createdAt","downloadEndpoint"]},"DownloadUrlDto":{"type":"object","properties":{"url":{"type":"string","description":"Short-lived signed URL to the PDF report","example":"https://storage.googleapis.com/bucket/reports/2025_07/tenant_3.pdf?..."},"expiresAt":{"type":"string","description":"ISO 8601 timestamp when the URL expires","example":"2025-08-17T19:30:15.000Z","format":"date-time"}},"required":["url","expiresAt"]},"StatisticsTenantDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"isVerified":{"type":"boolean","example":true},"package":{"type":"string","example":"Business"},"transactionsIncluded":{"type":"number","example":6000},"packageStartDate":{"type":"string","example":"2025-07-01"},"packageValidTillDate":{"type":"string","example":"2026-07-01"},"isOutOfCredits":{"type":"boolean","example":true}},"required":["id","name","isVerified","package","transactionsIncluded"]},"DailyPointDto":{"type":"object","properties":{"date":{"type":"string","example":"2025-07-01"},"count":{"type":"number","example":120}},"required":["date","count"]},"StatisticsUsageDto":{"type":"object","properties":{"used":{"type":"number","example":3237},"daily":{"type":"array","items":{"$ref":"#/components/schemas/DailyPointDto"}}},"required":["used","daily"]},"StatisticsTransactionsDto":{"type":"object","properties":{"last30dTotal":{"type":"number","example":3200},"incomingToConfirm":{"type":"number","example":37},"pending":{"type":"number","example":12}},"required":["last30dTotal","incomingToConfirm","pending"]},"StatisticsWalletsDto":{"type":"object","properties":{"last30dTotal":{"type":"number","example":462},"verified":{"type":"number","example":400},"failed":{"type":"number","example":2},"pending":{"type":"number","example":60},"clientWalletsToConfirm":{"type":"number","example":14}},"required":["last30dTotal","verified","failed","pending","clientWalletsToConfirm"]},"StatisticsClaimsDto":{"type":"object","properties":{"last30dTotal":{"type":"number","example":58},"incomingToConfirm":{"type":"number","example":7}},"required":["last30dTotal","incomingToConfirm"]},"TenantStatisticsResponseDto":{"type":"object","properties":{"tenant":{"$ref":"#/components/schemas/StatisticsTenantDto"},"month":{"type":"string","example":"2025-07"},"totalUsage":{"type":"number","example":18234},"usage":{"$ref":"#/components/schemas/StatisticsUsageDto"},"transactions":{"$ref":"#/components/schemas/StatisticsTransactionsDto"},"wallets":{"$ref":"#/components/schemas/StatisticsWalletsDto"},"claims":{"$ref":"#/components/schemas/StatisticsClaimsDto"}},"required":["tenant","month","usage","transactions","wallets","claims"]},"RiskAssessmentDto":{"type":"object","properties":{"score":{"type":"number","description":"A numerical score (0 - 100) representing the entity trust level. Higher values mean a higher risk.","example":42},"severity":{"type":"string","description":"The severity level of the risk","enum":["low","medium","high"],"example":"medium"}},"required":["score","severity"]},"EntityDto":{"type":"object","properties":{"id":{"type":"string","description":"The entity ID","example":"14f4fb9d-4c69-5843-8b18-dbb77540182b"},"name":{"type":"string","description":"The entity name"},"legalName":{"type":"string","description":"The legal name of the entitiy that is used to register their account with CryptoSwift. See \"legalEntities\" section in the single Entity details for a list of known legal entities for the Entity."},"type":{"type":"string","description":"The entity type"},"isVerified":{"type":"boolean","description":"Indicates if the entity is verified within CryptoSwift network"},"inNetwork":{"type":"boolean","description":"Indicates if the entity is part of the CryptoSwift network"},"updatedAt":{"type":"string","description":"Timestamp when the entity data was last updated","nullable":true,"format":"date-time"},"isRiskAssessed":{"type":"boolean","description":"Is the risk is assessed (by Scorechain) for this entity?"},"description":{"type":"string","description":"Description of the entity"},"isMicaCompliant":{"type":"boolean","description":"Flag showing if the entity is MiCA compliant"},"countries":{"description":"Associated countries for the entity","type":"array","items":{"type":"string"}},"url":{"type":"string","description":"URL/website of the entity"},"riskAssessment":{"description":"Risk assessment of the entity","allOf":[{"$ref":"#/components/schemas/RiskAssessmentDto"}]}},"required":["id","name","legalName","type","isVerified","inNetwork","isRiskAssessed","description","isMicaCompliant","countries","url"]},"EntityLegalEntityDto":{"type":"object","properties":{"entityName":{"type":"string","description":"Legal name of the entity","nullable":true},"country":{"type":"string","description":"Country associated with the legal entity record","nullable":true},"companyId":{"type":"string","description":"Company registration identifier","nullable":true},"referenceNo":{"type":"string","description":"Regulatory reference number assigned to the legal entity","nullable":true},"regulator":{"type":"string","description":"Name of the regulator associated with the legal entity entry","nullable":true}}},"EntityDetailedDto":{"type":"object","properties":{"id":{"type":"string","description":"The entity ID","example":"14f4fb9d-4c69-5843-8b18-dbb77540182b"},"name":{"type":"string","description":"The entity name"},"legalName":{"type":"string","description":"The legal name of the entitiy that is used to register their account with CryptoSwift. See \"legalEntities\" section in the single Entity details for a list of known legal entities for the Entity."},"type":{"type":"string","description":"The entity type"},"isVerified":{"type":"boolean","description":"Indicates if the entity is verified within CryptoSwift network"},"inNetwork":{"type":"boolean","description":"Indicates if the entity is part of the CryptoSwift network"},"updatedAt":{"type":"string","description":"Timestamp when the entity data was last updated","nullable":true,"format":"date-time"},"isRiskAssessed":{"type":"boolean","description":"Is the risk is assessed (by Scorechain) for this entity?"},"description":{"type":"string","description":"Description of the entity"},"isMicaCompliant":{"type":"boolean","description":"Flag showing if the entity is MiCA compliant"},"countries":{"description":"Associated countries for the entity","type":"array","items":{"type":"string"}},"url":{"type":"string","description":"URL/website of the entity"},"riskAssessment":{"description":"Risk assessment of the entity","allOf":[{"$ref":"#/components/schemas/RiskAssessmentDto"}]},"email":{"type":"string","description":"Contact email of the entity when available","nullable":true},"notice":{"type":"string","description":"Notice for the exchange","nullable":true},"logo":{"type":"string","description":"Exchange logo URL","nullable":true},"fiats":{"description":"Supported fiat currencies","type":"array","items":{"type":"string"}},"urls":{"type":"object","description":"Exchange URL groups (website, twitter, chat, etc.)","additionalProperties":{"type":"array","items":{"type":"string"}}},"dateLaunched":{"type":"string","description":"Exchange launch date","nullable":true,"format":"date-time"},"spotVolumeUsd":{"type":"number","description":"Spot volume in USD","nullable":true},"spotVolumeLastUpdated":{"type":"string","description":"Timestamp when spot volume was last updated","nullable":true,"format":"date-time"},"weeklyVisits":{"type":"number","description":"Weekly website visits","nullable":true},"legalEntities":{"description":"Known legal entities for this entity","type":"array","items":{"$ref":"#/components/schemas/EntityLegalEntityDto"}}},"required":["id","name","legalName","type","isVerified","inNetwork","isRiskAssessed","description","isMicaCompliant","countries","url"]},"WalletDto":{"type":"object","properties":{"id":{"type":"number","description":"The wallet ID"},"address":{"type":"string","description":"Wallet address"},"asset":{"type":"string","description":"Asset type. Use * to create a multi-asset wallet by adding all assets from the selected blockchain"},"blockchain":{"type":"string","description":"The blockchain name. You can find the list of supported blockchains <a target=\"_blank\" href=\"#tag/Blockchains/operation/findAll\">here</a> (use the returned \"name\" field). In the required blockchain is not included in the list, you can define your blockchain as free text, but be aware that this might affect Travel Rule message delivery rates."},"isConfirmed":{"type":"boolean","description":"Is tenant approved wallet","default":true},"metadata":{"type":"string","description":"Wallet metadata"},"createdAt":{"format":"date-time","type":"string","description":"Created at timestamp","example":"2026-05-08 07:32:49"}},"required":["id","address","asset","isConfirmed","createdAt"]},"CreateWalletDto":{"type":"object","properties":{"address":{"type":"string","description":"Wallet address"},"asset":{"type":"string","description":"Asset type. Use * to create a multi-asset wallet by adding all assets from the selected blockchain"},"blockchain":{"type":"string","description":"The blockchain name. You can find the list of supported blockchains <a target=\"_blank\" href=\"#tag/Blockchains/operation/findAll\">here</a> (use the returned \"name\" field). In the required blockchain is not included in the list, you can define your blockchain as free text, but be aware that this might affect Travel Rule message delivery rates."},"metadata":{"type":"string","description":"Wallet metadata"}},"required":["address","asset"]},"UpdateWalletDto":{"type":"object","properties":{"isConfirmed":{"type":"boolean","description":"Is tenant approved wallet","default":true},"metadata":{"type":"string","description":"Wallet metadata"}}},"WalletsUploadRequestDto":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Wallets CSV file with the size limit of up to 5MB"}},"required":["file"]},"WalletsUploadResponseDto":{"type":"object","properties":{"success":{"type":"boolean","description":"`true` in case any wallets has been created or there been 0 errors, otherwise `false`","example":true},"message":{"type":"string","description":"Details regarding the import","example":"Processing complete. Created 3 wallets with 1 errors"},"created":{"type":"number","description":"How many wallets were created","example":3},"errors":{"description":"All the errors occurred while importing the CSV file","example":["This wallet address (or addresses) 0x60d3cb411b5bd089bbdb17ea5fd41db08bcb0fbe has already been claimed. Please check your request details or contact customer support for assistance."],"items":{"type":"string"},"type":"array"}},"required":["success","message","created","errors"]},"RuleConditionDto":{"type":"object","properties":{"field":{"type":"string","description":"Condition field to evaluate.","enum":["status","riskSeverity","riskScore","amount","hasTxHash"]},"operator":{"description":"Condition operator.","allOf":[{"$ref":"#/components/schemas/RuleConditionOperator"}]},"value":{"description":"Condition value. Not required for EXISTS/NOT_EXISTS operators.","oneOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}]},"currency":{"description":"Optional currency for amount conditions.","allOf":[{"$ref":"#/components/schemas/TenantCurrency"}]}},"required":["field","operator"]},"RuleWhenDto":{"type":"object","properties":{"all":{"description":"All conditions must match (logical AND).","type":"array","items":{"$ref":"#/components/schemas/RuleConditionDto"}},"any":{"description":"Any condition may match (logical OR).","type":"array","items":{"$ref":"#/components/schemas/RuleConditionDto"}}},"required":["all","any"]},"RuleThenDto":{"type":"object","properties":{"decision":{"description":"Action to take when the rule matches.","allOf":[{"$ref":"#/components/schemas/RuleDecision"}]},"waitForSeconds":{"type":"number","description":"Required when decision is WAIT. Allowed range: 1..86400.","minimum":1,"maximum":86400},"onTimeoutDecision":{"description":"Required when decision is WAIT.","allOf":[{"$ref":"#/components/schemas/RuleTimeoutDecision"}]}},"required":["decision"]},"RuleDefinitionDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique rule ID within the rules array.","example":"high-amount-wait"},"name":{"type":"string","description":"Display name of the rule.","example":"Wait large transfers"},"enabled":{"type":"boolean","description":"Whether this rule is enabled.","example":true},"when":{"description":"Rule conditions block.","allOf":[{"$ref":"#/components/schemas/RuleWhenDto"}]},"then":{"description":"Rule action block.","allOf":[{"$ref":"#/components/schemas/RuleThenDto"}]}},"required":["id","name","enabled","when","then"]},"RuleEngineDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Rule engine ID."},"scope":{"description":"Rule engine direction scope.","allOf":[{"$ref":"#/components/schemas/RuleEngineScope"}]},"publishedVersion":{"type":"number","description":"Current published version number.","example":3},"latestComment":{"type":"string","description":"Latest publish comment for this rule engine.","nullable":true,"example":"Q1 rollout"},"hasUnpublishedDraft":{"type":"boolean","description":"True when draftRules differ from publishedRules and can be published.","example":true},"draftRules":{"description":"Current editable draft rule set.","type":"array","items":{"$ref":"#/components/schemas/RuleDefinitionDto"}},"publishedRules":{"description":"Currently active published rule set.","type":"array","items":{"$ref":"#/components/schemas/RuleDefinitionDto"}},"updatedAt":{"format":"date-time","type":"string","description":"Last update timestamp (ISO)."},"updatedByUser":{"description":"User details for who last updated the rule engine. Null for API key updates.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/UserSummaryDto"}]}},"required":["id","scope","publishedVersion","hasUnpublishedDraft","draftRules","publishedRules","updatedAt"]},"RuleEngineListResponseDto":{"type":"object","properties":{"engines":{"description":"All rule engine configurations for the tenant.","type":"array","items":{"$ref":"#/components/schemas/RuleEngineDto"}}},"required":["engines"]},"UpdateDraftDto":{"type":"object","properties":{"draftRules":{"description":"Draft rules evaluated top-to-bottom. First matching rule wins.","example":[{"id":"high-amount-wait","name":"Wait large transfers","enabled":true,"when":{"all":[{"field":"amount","operator":"GTE","value":10000,"currency":"USD"}],"any":[]},"then":{"decision":"WAIT","waitForSeconds":120,"onTimeoutDecision":"REVIEW"}},{"id":"default-outgoing","name":"Default rule","enabled":true,"when":{"all":[],"any":[]},"then":{"decision":"PROCEED"}}],"type":"array","items":{"$ref":"#/components/schemas/RuleDefinitionDto"}}},"required":["draftRules"]},"RuleEngineValidationIssueDto":{"type":"object","properties":{"path":{"type":"string","description":"Path to the invalid field.","example":"draftRules[0].then.waitForSeconds"},"issue":{"type":"string","description":"Validation issue details.","example":"Required when decision=WAIT"}},"required":["path","issue"]},"RuleEngineValidationErrorResponseDto":{"type":"object","properties":{"error":{"type":"string","example":"VALIDATION_ERROR"},"message":{"type":"string","example":"Rule Engine validation failed"},"details":{"type":"array","items":{"$ref":"#/components/schemas/RuleEngineValidationIssueDto"}}},"required":["error","message","details"]},"PublishDto":{"type":"object","properties":{"comment":{"type":"string","description":"Optional publish comment for this version snapshot."}}},"RuleEnginePublishResponseDto":{"type":"object","properties":{"scope":{"description":"Scope of the published rule engine.","allOf":[{"$ref":"#/components/schemas/RuleEngineScope"}]},"publishedVersion":{"type":"number","description":"New published version number.","example":4},"publishedRules":{"description":"Rules that were published.","type":"array","items":{"$ref":"#/components/schemas/RuleDefinitionDto"}},"ruleEngineId":{"type":"string","format":"uuid","description":"Rule engine ID."},"versionId":{"type":"string","format":"uuid","description":"Created immutable version record ID."}},"required":["scope","publishedVersion","publishedRules","ruleEngineId","versionId"]},"RuleEngineVersionMetadataDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Version snapshot ID."},"version":{"type":"number","description":"Published version number.","example":4},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp (ISO)."},"createdBy":{"type":"string","description":"Who created this version (userId or via api).","nullable":true,"example":"42"},"comment":{"type":"string","description":"Optional comment attached at publish time.","nullable":true,"example":"Q1 rollout"}},"required":["id","version","createdAt"]},"RuleEngineVersionsResponseDto":{"type":"object","properties":{"scope":{"description":"Scope of the listed version snapshots.","allOf":[{"$ref":"#/components/schemas/RuleEngineScope"}]},"versions":{"description":"Published version history.","type":"array","items":{"$ref":"#/components/schemas/RuleEngineVersionMetadataDto"}}},"required":["scope","versions"]},"RuleEngineVersionSnapshotResponseDto":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Version snapshot ID."},"scope":{"description":"Scope of this snapshot.","allOf":[{"$ref":"#/components/schemas/RuleEngineScope"}]},"version":{"type":"number","description":"Published version number.","example":4},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp (ISO)."},"createdBy":{"type":"string","description":"Who created this version (userId or via api).","nullable":true,"example":"42"},"comment":{"type":"string","description":"Optional publish comment.","nullable":true,"example":"Q1 rollout"},"rules":{"description":"Full published rules snapshot.","type":"array","items":{"$ref":"#/components/schemas/RuleDefinitionDto"}}},"required":["id","scope","version","createdAt","rules"]},"RestoreDto":{"type":"object","properties":{"version":{"type":"number","description":"Version number to restore into draft.","example":3}},"required":["version"]},"AuthDto":{"type":"object","properties":{"usernameOrEmail":{"type":"string","description":"The username or email"},"password":{"type":"string","description":"The password"}},"required":["usernameOrEmail","password"]},"UserWithJwtDto":{"type":"object","properties":{"id":{"type":"number","description":"The user ID"},"name":{"type":"string","description":"The full name of the user"},"email":{"type":"string","description":"E-mail address"},"username":{"type":"string","description":"The username"},"isAdmin":{"type":"boolean","description":"Is the user an admin for the organisation (tenant)","default":false},"accessToken":{"type":"string","description":"The JWT access token"},"refreshToken":{"type":"string","description":"The JWT refresh token"},"accessTokenExpiresIn":{"type":"number","description":"The JWT access token expiry time in seconds"},"refreshTokenExpiresIn":{"type":"number","description":"The JWT refresh token expiry time in seconds"}},"required":["id","name","email","username","isAdmin","accessToken","refreshToken","accessTokenExpiresIn","refreshTokenExpiresIn"]},"JwtDto":{"type":"object","properties":{"accessToken":{"type":"string","description":"The JWT access token"},"refreshToken":{"type":"string","description":"The JWT refresh token"},"accessTokenExpiresIn":{"type":"number","description":"The JWT access token expiry time in seconds"},"refreshTokenExpiresIn":{"type":"number","description":"The JWT refresh token expiry time in seconds"}},"required":["accessToken","refreshToken","accessTokenExpiresIn","refreshTokenExpiresIn"]},"ForgotPasswordDto":{"type":"object","properties":{"email":{"type":"string","description":"The user email address"},"recaptchaToken":{"type":"string","description":"reCAPTCHA token for the forgot-password action","example":"03AFcWeA7..."}},"required":["email","recaptchaToken"]},"ResetPasswordDto":{"type":"object","properties":{"token":{"type":"string","description":"The token to reset user password"},"newPassword":{"type":"string","description":"The new user password"},"recaptchaToken":{"type":"string","description":"reCAPTCHA token for the reset-password action","example":"03AFcWeA7..."}},"required":["token","newPassword","recaptchaToken"]},"MfaTokenDto":{"type":"object","properties":{"multiFactorToken":{"type":"string","description":"Short-lived MFA token received from the login flow.","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXAiOiJtZmEiLCJwdXJwb3NlIjoiZW5yb2xsIn0.signature"}},"required":["multiFactorToken"]},"MfaSetupResponseDto":{"type":"object","properties":{"otpauthUrl":{"type":"string","description":"OTPAuth URL that can be converted into a QR code by the client.","example":"otpauth://totp/CryptoSwift:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=CryptoSwift"}},"required":["otpauthUrl"]},"VerifyTotpDto":{"type":"object","properties":{"code":{"type":"string","description":"TOTP (6 digits) or backup code","example":"123456"},"multiFactorToken":{"type":"string","description":"Short-lived MFA token received from the login flow.","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXAiOiJtZmEiLCJwdXJwb3NlIjoidmVyaWZ5In0.signature"}},"required":["code","multiFactorToken"]},"MfaEnrollConfirmResponseDto":{"type":"object","properties":{"id":{"type":"number","description":"The user ID"},"name":{"type":"string","description":"The full name of the user"},"email":{"type":"string","description":"E-mail address"},"username":{"type":"string","description":"The username"},"isAdmin":{"type":"boolean","description":"Is the user an admin for the organisation (tenant)","default":false},"accessToken":{"type":"string","description":"The JWT access token"},"refreshToken":{"type":"string","description":"The JWT refresh token"},"accessTokenExpiresIn":{"type":"number","description":"The JWT access token expiry time in seconds"},"refreshTokenExpiresIn":{"type":"number","description":"The JWT refresh token expiry time in seconds"},"backupCodes":{"description":"One-time backup codes returned after completing MFA enrollment.","example":["ABCD-EFGH","IJKL-MNOP"],"type":"array","items":{"type":"string"}}},"required":["id","name","email","username","isAdmin","accessToken","refreshToken","accessTokenExpiresIn","refreshTokenExpiresIn","backupCodes"]},"EntityWithPublicKeyDto":{"type":"object","properties":{"id":{"type":"string","description":"The entity ID","example":"14f4fb9d-4c69-5843-8b18-dbb77540182b"},"name":{"type":"string","description":"The entity name"},"legalName":{"type":"string","description":"The legal name of the entitiy that is used to register their account with CryptoSwift. See \"legalEntities\" section in the single Entity details for a list of known legal entities for the Entity."},"type":{"type":"string","description":"The entity type"},"isVerified":{"type":"boolean","description":"Indicates if the entity is verified within CryptoSwift network"},"inNetwork":{"type":"boolean","description":"Indicates if the entity is part of the CryptoSwift network"},"updatedAt":{"type":"string","description":"Timestamp when the entity data was last updated","nullable":true,"format":"date-time"},"isRiskAssessed":{"type":"boolean","description":"Is the risk is assessed (by Scorechain) for this entity?"},"description":{"type":"string","description":"Description of the entity"},"isMicaCompliant":{"type":"boolean","description":"Flag showing if the entity is MiCA compliant"},"countries":{"description":"Associated countries for the entity","type":"array","items":{"type":"string"}},"url":{"type":"string","description":"URL/website of the entity"},"riskAssessment":{"description":"Risk assessment of the entity","allOf":[{"$ref":"#/components/schemas/RiskAssessmentDto"}]},"publicKey":{"type":"string","description":"Public key of the entity"}},"required":["id","name","legalName","type","isVerified","inNetwork","isRiskAssessed","description","isMicaCompliant","countries","url","publicKey"]},"ErrorResponseDto":{"type":"object","properties":{"statusCode":{"type":"number","example":500,"description":"HTTP status code returned by the API."},"message":{"type":"string","example":"Failed to fetch verified VASPs. Please contact the support.","description":"Human readable description of what went wrong."},"error":{"type":"string","example":"OPERATION_FAILED","description":"Machine readable error code that helps narrow down the issue."},"timestamp":{"type":"string","example":"2024-05-18T12:00:00.000Z","description":"Timestamp when the error was generated on the server."}},"required":["statusCode","message","error","timestamp"]},"IncomingTravelRuleMessageDto":{"type":"object","properties":{"asset":{"type":"string","description":"The asset symbol that was used for the transaction (BTC, ETH or other)"},"amount":{"type":"number","description":"Amount of asset transferred"},"blockchainInfo":{"description":"Blockchain information (transaction hash, origin and destination wallet addresses)","allOf":[{"$ref":"#/components/schemas/BlockchainDto"}]},"ivms101":{"type":"string","description":"Encrypted IVMS101 data"},"originatorVaspId":{"type":"string","description":"Originator VASP Id on the partner side"},"originatorVaspPubKey":{"type":"string","description":"Originator VASP public key on the partner side"},"beneficiaryVaspId":{"type":"string","description":"Beneficiary VASP Id on CryptoSwift side"},"createdAt":{"type":"string","format":"date-time","description":"Transaction creation date and time according to the ISO 8601 standard, eg. \"2025-01-28T14:38:00.000Z\". Set automatically to the current date and time when creating a new transaction if not provided with the request"}},"required":["asset","amount","blockchainInfo","ivms101","originatorVaspId","originatorVaspPubKey","beneficiaryVaspId"]},"TravelRuleMessageDto":{"type":"object","properties":{"id":{"type":"string","description":"The transaction ID"},"status":{"description":"The transaction status","allOf":[{"$ref":"#/components/schemas/TransactionStatus"}]},"statusReasoning":{"type":"string","description":"The transaction status reasoning"},"asset":{"type":"string","description":"The asset symbol that was used for the transaction (BTC, ETH or other)"},"amount":{"type":"number","description":"Amount of asset transferred"},"blockchainInfo":{"description":"Blockchain information (transaction hash, origin and destination wallet addresses)","allOf":[{"$ref":"#/components/schemas/BlockchainDto"}]},"ivms101":{"type":"string","description":"Encrypted IVMS101 data"},"originatorVaspId":{"type":"string","description":"Originator VASP Id on the partner side"},"originatorVaspPubKey":{"type":"string","description":"Originator VASP public key on the partner side"},"beneficiaryVaspId":{"type":"string","description":"Beneficiary VASP Id on CryptoSwift side"},"createdAt":{"type":"string","format":"date-time","description":"Transaction creation date and time according to the ISO 8601 standard, eg. \"2025-01-28T14:38:00.000Z\". Set automatically to the current date and time when creating a new transaction if not provided with the request"}},"required":["id","status","asset","amount","blockchainInfo","ivms101","originatorVaspId","originatorVaspPubKey","beneficiaryVaspId"]},"UpdateTravelRuleMessageDto":{"type":"object","properties":{"asset":{"type":"string","description":"The asset symbol that was used for the transaction (BTC, ETH or other)"},"amount":{"type":"number","description":"Amount of asset transferred"},"ivms101":{"type":"string","description":"Encrypted IVMS101 data"},"originatorVaspId":{"type":"string","description":"Originator VASP Id on the partner side"},"originatorVaspPubKey":{"type":"string","description":"Originator VASP public key on the partner side"},"createdAt":{"type":"string","format":"date-time","description":"Transaction creation date and time according to the ISO 8601 standard, eg. \"2025-01-28T14:38:00.000Z\". Set automatically to the current date and time when creating a new transaction if not provided with the request"},"beneficiaryVaspId":{"type":"string","description":"Beneficiary VASP Id on CryptoSwift side"},"blockchainInfo":{"description":"Blockchain information (destination address cannot be modified through this endpoint)","allOf":[{"$ref":"#/components/schemas/UpdateBlockchainInfoDto"}]}},"required":["beneficiaryVaspId"]},"WalletVerificationThemeDto":{"type":"object","properties":{"fontFamily":{"type":"string","description":"The Google Font name"},"fontWeight":{"type":"number","description":"The Google Font weight. Where normal is 400, medium is 500 and bold is 700. If not provided, normal (400) is used."},"fontSize":{"type":"number","description":"The font size in pixels. Headings and related text scale from this value. 16px is the default font size and is used if not provided."},"fontColor":{"type":"string","description":"The font color"},"primaryColor":{"type":"string","description":"The primary color"},"backgroundColor":{"type":"string","description":"The background color"},"buttonBorderRadius":{"type":"number","description":"The button border radius"},"buttonShadowEnabled":{"type":"boolean","description":"The button shadow enabled"},"flowsOrder":{"type":"array","description":"The order in which wallet verification flows should be displayed by the widget. Flows not included can use the widget default order.","example":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"],"items":{"type":"string","enum":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"]}}}},"UpdateTenantSettingsDto":{"type":"object","properties":{"logoUrl":{"type":"string","description":"The public URL to logo"},"logoIconUrl":{"type":"string","description":"The public URL to icon"},"walletVerificationTheme":{"description":"The wallet verification theme","allOf":[{"$ref":"#/components/schemas/WalletVerificationThemeDto"}]},"serviceName":{"type":"string","description":"The `service name` that overrides the `tenant name` during wallet verification"}}},"PartnerCreateTenantDto":{"type":"object","properties":{"name":{"type":"string","description":"The tenant's service name"},"legalName":{"type":"string","description":"The legal name of the tenant"},"email":{"type":"string","description":"The main email address of the tenant"},"webhookUrl":{"type":"string","description":"The webhook URL for Travel Rule message notifications"},"notabeneSecret":{"type":"string","description":"The Notabene webhook secret for integration"},"country":{"type":"string","description":"The country"},"webpage":{"type":"string","description":"The webpage"},"townName":{"type":"string","description":"The town name"},"mfaPolicy":{"description":"Tenant MFA policy","default":"optional","allOf":[{"$ref":"#/components/schemas/TenantMfaPolicy"}]},"isWalletVerificationRiskScoringEnabled":{"type":"boolean","description":"Is wallet verification risk scoring enabled"},"settings":{"description":"Tenant settings","allOf":[{"$ref":"#/components/schemas/UpdateTenantSettingsDto"}]}},"required":["name","email"]},"PartnerTenantDto":{"type":"object","properties":{"id":{"type":"number","description":"The tenant ID"},"name":{"type":"string","description":"The tenant's service name"},"legalName":{"type":"string","description":"The legal name of the tenant"},"email":{"type":"string","description":"The main email address of the tenant"},"isVerified":{"type":"boolean","description":"Has the tenant been verified by the platform?"},"webhookUrl":{"type":"string","description":"The webhook URL for Travel Rule message notifications"},"webhookSecret":{"type":"string","description":"The webhook Secret: can and should be used for verifying incoming webhook requests. Generated automatically each time when the webhook URL is updated. See the [Developer Portal](https://dev.cryptoswift.eu/docs/integration-guides/webhooks/signatures) for more information"},"apiKey":{"type":"string","description":"The API key"},"notabeneWebhookUrl":{"type":"string","description":"The Notabene webhook url for integration"},"notabeneSecret":{"type":"string","description":"The Notabene webhook secret for integration"},"country":{"type":"string","description":"The country"},"webpage":{"type":"string","description":"The webpage"},"townName":{"type":"string","description":"The town name"},"mfaPolicy":{"description":"Tenant MFA policy","default":"optional","allOf":[{"$ref":"#/components/schemas/TenantMfaPolicy"}]},"isWalletVerificationRiskScoringEnabled":{"type":"boolean","description":"Is wallet verification risk scoring enabled"}},"required":["id","name","email","isVerified","apiKey"]},"TenantSettingsDto":{"type":"object","properties":{"id":{"type":"string","description":"The settings ID"},"tenantId":{"type":"number","description":"The tenant ID"},"logoUrl":{"type":"string","description":"The public URL to logo"},"logoIconUrl":{"type":"string","description":"The public URL to icon"},"walletVerificationTheme":{"description":"The wallet verification theme","allOf":[{"$ref":"#/components/schemas/WalletVerificationThemeDto"}]},"serviceName":{"type":"string","description":"The `service name` that overrides the `tenant name` during wallet verification"},"createdAt":{"format":"date-time","type":"string","description":"The createAt timestamp"},"updatedAt":{"format":"date-time","type":"string","description":"The updatedAt timestamp"}},"required":["id","tenantId","createdAt","updatedAt"]},"UploadLogoDto":{"type":"object","properties":{"url":{"type":"string","description":"The publicly accessible URL of the uploaded logo"}},"required":["url"]},"CreateUserDto":{"type":"object","properties":{"name":{"type":"string","description":"The full name of the user"},"email":{"type":"string","description":"E-mail address"},"username":{"type":"string","description":"The username"},"password":{"type":"string","description":"The password","minLength":8},"isAdmin":{"type":"boolean","description":"Is the user an admin for the organisation (tenant)","default":false}},"required":["name","email","username","password","isAdmin"]},"UserDto":{"type":"object","properties":{"id":{"type":"number","description":"The user ID"},"name":{"type":"string","description":"The full name of the user"},"email":{"type":"string","description":"E-mail address"},"username":{"type":"string","description":"The username"},"password":{"type":"string","description":"The password","minLength":8},"isAdmin":{"type":"boolean","description":"Is the user an admin for the organisation (tenant)","default":false}},"required":["id","name","email","username","password","isAdmin"]},"UpdateUserDto":{"type":"object","properties":{"name":{"type":"string","description":"The full name of the user"},"email":{"type":"string","description":"E-mail address"},"username":{"type":"string","description":"The username"},"password":{"type":"string","description":"The password","minLength":8},"isAdmin":{"type":"boolean","description":"Is the user an admin for the organisation (tenant)","default":false}}},"AdminTopWalletDto":{"type":"object","properties":{"wallet":{"type":"string","description":"Beneficiary wallet address with pending outgoing transactions.","example":"bc1qw508d6qeztvexqzq2n0yrf2493p83kkfjhx0wlh"},"asset":{"type":"string","description":"Asset associated with the pending transactions.","example":"BTC"},"transactions":{"type":"number","description":"Number of matching pending transactions for the wallet.","example":12}},"required":["wallet","asset","transactions"]},"AdminUpdatedWalletDto":{"type":"object","properties":{"wallet":{"type":"string","description":"Beneficiary wallet address with pending outgoing transactions.","example":"bc1qw508d6qeztvexqzq2n0yrf2493p83kkfjhx0wlh"},"asset":{"type":"string","description":"Asset associated with the pending transactions.","example":"BTC"},"transactions":{"type":"number","description":"Number of matching pending transactions for the wallet.","example":12},"bcaAttempted":{"type":"boolean","description":"Whether blockchain analytics identification was attempted during the update run.","example":true},"updated":{"type":"number","description":"Number of transactions updated for the originating tenant during the update run.","example":12},"beneficiary":{"description":"Resolved beneficiary tenant when the wallet was matched to a known or newly created tenant.","allOf":[{"$ref":"#/components/schemas/TenantDto"}]}},"required":["wallet","asset","transactions"]},"AdminOrganizationDto":{"type":"object","properties":{"tenantId":{"type":"number","description":"Tenant id for VASP organizations. Null for partner rows.","example":42,"nullable":true},"partnerId":{"type":"number","description":"Partner id for partner organizations. Null for VASP rows.","example":7,"nullable":true},"type":{"type":"string","description":"Organization type.","example":"VASP"},"name":{"type":"string","description":"Display name of the organization.","example":"CryptoSwift"},"legalName":{"type":"string","description":"Legal name of the organization.","example":"CryptoSwift OÜ","nullable":true},"country":{"type":"string","description":"Country code or country name stored for the organization.","example":"EE","nullable":true},"logoUrl":{"type":"string","description":"Logo URL when available.","example":"https://cdn.example.com/logo.png","nullable":true},"webpage":{"type":"string","description":"Organization website URL when available.","example":"https://cryptoswift.eu","nullable":true}},"required":["type","name"]},"AdminCampaignDto":{"type":"object","properties":{"id":{"type":"string","description":"Campaign id.","example":"0b1f5d4d-e1d7-4e8b-b6de-4b84d67a1b86"},"type":{"type":"string","description":"Campaign type.","enum":["CLAIM_YOUR_ACCOUNT"],"example":"CLAIM_YOUR_ACCOUNT"},"brevoListId":{"type":"number","description":"Brevo list id associated with the campaign.","example":28,"nullable":true},"brevoCampaignId":{"type":"number","description":"Brevo campaign id associated with the campaign.","example":91011,"nullable":true},"brevoImportProcessId":{"type":"number","description":"Brevo import process id for the contacts import.","example":12345,"nullable":true},"status":{"type":"string","description":"Current campaign status.","enum":["importing","ready","scheduled","failed","initializing"],"example":"importing"},"statusReasoning":{"type":"string","description":"Failure or status reasoning when available.","example":"Cannot run campaign - last run was less than 2 weeks ago","nullable":true},"createdAt":{"format":"date-time","type":"string","description":"Campaign creation timestamp.","example":"2026-03-19T12:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","description":"Campaign last update timestamp.","example":"2026-03-19T12:05:00.000Z"},"scheduledAt":{"format":"date-time","type":"string","description":"When the campaign was scheduled in Brevo.","example":"2026-03-19T12:10:00.000Z","nullable":true}},"required":["id","type","status","createdAt","updatedAt"]},"EntitiesCsvEnrichmentUnmatchedItemDto":{"type":"object","properties":{"rowNumber":{"type":"number","description":"CSV row number in the source file, including the header row offset.","example":37},"domain":{"type":"string","description":"Normalized domain extracted from the CSV row.","example":"example.com"},"row":{"type":"object","description":"Original CSV row values keyed by CSV column name.","example":{"VASP Name":"Example VASP","Website":"https://example.com","Country":"Estonia"},"additionalProperties":true}},"required":["rowNumber","domain","row"]},"EntitiesCsvEnrichmentSummaryDto":{"type":"object","properties":{"csvPath":{"type":"string","description":"Absolute path of the CSV file used for the enrichment run.","example":"/Users/indrek/workspace/cryptoswift-api/scripts/db/vasp-list.csv"},"rowsRead":{"type":"number","description":"Number of CSV rows read from the source file.","example":1250},"uniqueDomains":{"type":"number","description":"Number of unique domains extracted from the CSV.","example":940},"matchedEntities":{"type":"number","description":"Number of entities matched to at least one CSV domain.","example":320},"updatedEntities":{"type":"number","description":"Number of entities that were actually updated in the database.","example":280},"unmatchedItemsCount":{"type":"number","description":"Number of CSV items that could not be matched to an entity.","example":620},"unmatchedItems":{"description":"CSV rows that could not be matched to an existing entity.","type":"array","items":{"$ref":"#/components/schemas/EntitiesCsvEnrichmentUnmatchedItemDto"}}},"required":["csvPath","rowsRead","uniqueDomains","matchedEntities","updatedEntities","unmatchedItemsCount","unmatchedItems"]},"AdminTenantListItemDto":{"type":"object","properties":{"tenantId":{"type":"number","description":"Tenant id.","example":42},"productionTenantId":{"type":"number","description":"Production tenant id associated through onboarding.","example":101,"nullable":true},"name":{"type":"string","description":"Tenant display name.","example":"Acme Exchange"},"legalName":{"type":"string","description":"Tenant legal name.","example":"Acme Digital Assets LLC","nullable":true},"email":{"type":"string","description":"Primary tenant email.","example":"ops@acme.exchange"},"webpage":{"type":"string","description":"Tenant webpage.","example":"https://acme.exchange","nullable":true},"country":{"type":"string","description":"Country code or country name stored for the tenant.","example":"US","nullable":true},"town":{"type":"string","description":"Town or city stored for the tenant.","example":"New York","nullable":true},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp.","example":"2026-03-19T10:30:00.000Z"},"verified":{"type":"boolean","description":"Whether the tenant is verified.","example":false},"isSelfServiceSignup":{"type":"boolean","description":"Whether the tenant was created through self-service signup.","example":true},"onboardingStarted":{"type":"boolean","description":"Whether onboarding has been started.","example":true},"onboardingSubmitted":{"type":"boolean","description":"Whether onboarding has been submitted.","example":true},"onboardingStatus":{"type":"string","description":"Derived onboarding summary status.","enum":["NONE","STARTED","SUBMITTED","COMPLETED"],"example":"SUBMITTED"},"submittedAt":{"format":"date-time","type":"string","description":"When onboarding was submitted for review.","example":"2026-03-19T10:30:00.000Z","nullable":true},"freeOrPaidPreference":{"type":"string","description":"Free or paid preference if captured in onboarding details.","example":"PAID","nullable":true}},"required":["tenantId","name","email","createdAt","verified","isSelfServiceSignup","onboardingStarted","onboardingSubmitted","onboardingStatus"]},"AdminTenantCreateRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"Tenant display name.","example":"Acme Exchange"},"legalName":{"type":"string","description":"Tenant legal name.","example":"Acme Digital Assets LLC"},"email":{"type":"string","description":"Primary tenant email.","example":"ops@acme.exchange"},"webpage":{"type":"string","description":"Tenant webpage.","example":"https://acme.exchange"},"country":{"type":"string","description":"Country code or country name stored for the tenant.","example":"US"},"town":{"type":"string","description":"Town or city stored for the tenant.","example":"New York"},"package":{"type":"string","description":"Commercial package name.","example":"growth"},"minMonthlyPrice":{"type":"object","description":"Minimum monthly price.","example":99},"currency":{"type":"string","description":"Tenant billing currency.","enum":["EUR","USD"],"example":"EUR"},"transactionsIncluded":{"type":"number","description":"Included transaction count in the package.","example":500},"pricePerAdditionalTransaction":{"type":"object","description":"Price per additional transaction.","example":0.4},"verified":{"type":"boolean","description":"Whether the tenant should be marked verified immediately. Defaults to true.","example":true,"default":true}},"required":["name","email"]},"AdminTenantDto":{"type":"object","properties":{"id":{"type":"number","description":"Tenant id.","example":42},"name":{"type":"string","description":"Tenant display name.","example":"Acme Exchange"},"legalName":{"type":"string","description":"Tenant legal name.","example":"Acme Digital Assets LLC","nullable":true},"email":{"type":"string","description":"Primary tenant email.","example":"ops@acme.exchange"},"webpage":{"type":"string","description":"Tenant webpage.","example":"https://acme.exchange","nullable":true},"country":{"type":"string","description":"Country code or country name stored for the tenant.","example":"US","nullable":true},"town":{"type":"string","description":"Town or city stored for the tenant.","example":"New York","nullable":true},"package":{"type":"string","description":"Commercial package name.","example":"growth","nullable":true},"minMonthlyPrice":{"type":"string","description":"Minimum monthly price.","example":"99.00","nullable":true},"currency":{"type":"string","description":"Tenant billing currency.","enum":["EUR","USD"],"example":"EUR","nullable":true},"transactionsIncluded":{"type":"number","description":"Included transaction count in the package.","example":500,"nullable":true},"pricePerAdditionalTransaction":{"type":"string","description":"Price per additional transaction.","example":"0.40","nullable":true},"verified":{"type":"boolean","description":"Whether the tenant is verified.","example":true},"isSelfServiceSignup":{"type":"boolean","description":"Whether the tenant was created through self-service signup.","example":false},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp.","example":"2026-03-19T10:30:00.000Z"}},"required":["id","name","email","verified","isSelfServiceSignup","createdAt"]},"AdminTenantApiKeyMetadataDto":{"type":"object","properties":{"present":{"type":"boolean","description":"Whether the tenant currently has an API key configured.","example":true},"last4":{"type":"string","description":"Last four characters of the tenant API key.","example":"02d7","nullable":true}},"required":["present"]},"AdminTenantCreateResponseDto":{"type":"object","properties":{"tenantId":{"type":"number","description":"Created tenant id.","example":42},"tenant":{"description":"Created tenant payload.","allOf":[{"$ref":"#/components/schemas/AdminTenantDto"}]},"apiKeyMetadata":{"description":"Safe API key metadata for admin UX.","allOf":[{"$ref":"#/components/schemas/AdminTenantApiKeyMetadataDto"}]}},"required":["tenantId","tenant","apiKeyMetadata"]},"TenantOnboardingFileDto":{"type":"object","properties":{"id":{"type":"string","description":"Uploaded onboarding document id.","example":"38349f67-fcc6-4a89-8c3c-71d9eb80df97"},"originalName":{"type":"string","description":"Original uploaded file name.","example":"license.pdf"},"mimeType":{"type":"string","description":"Uploaded file MIME type.","example":"application/pdf"},"size":{"type":"number","description":"Uploaded file size in bytes.","example":245231},"createdAt":{"format":"date-time","type":"string","description":"File creation timestamp.","example":"2026-03-19T10:25:00.000Z"},"tag":{"type":"string","description":"UI grouping tag assigned to the uploaded file.","example":"certificate_of_registration","nullable":true},"downloadUrl":{"type":"string","description":"Download URL when one is available for the current viewer.","example":"https://storage.googleapis.com/bucket/uploads/onboarding/license.pdf","nullable":true}},"required":["id","originalName","mimeType","size","createdAt"]},"AdminTenantOnboardingDto":{"type":"object","properties":{"tenantId":{"type":"number","description":"Tenant id associated with the onboarding.","example":42},"status":{"type":"string","description":"Current onboarding status.","enum":["STARTED","SUBMITTED","COMPLETED"],"example":"SUBMITTED"},"details":{"type":"object","description":"Arbitrary onboarding details collected from the tenant.","additionalProperties":true,"example":{"countryOfIncorporation":"EE","regulator":"FIU","licenseNumber":"FVT000123"}},"reviewNotes":{"type":"string","description":"Review notes added during the review process.","example":"Reviewed and approved.","nullable":true},"submittedAt":{"format":"date-time","type":"string","description":"When the onboarding was submitted for review.","example":"2026-03-19T10:30:00.000Z","nullable":true},"completedAt":{"format":"date-time","type":"string","description":"When the onboarding was marked complete.","example":"2026-03-20T09:15:00.000Z","nullable":true},"createdAt":{"format":"date-time","type":"string","description":"When the onboarding record was created.","example":"2026-03-18T08:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","description":"When the onboarding record was last updated.","example":"2026-03-19T10:30:00.000Z"},"files":{"description":"Uploaded onboarding documents.","type":"array","items":{"$ref":"#/components/schemas/TenantOnboardingFileDto"}},"productionTenantId":{"type":"number","description":"Production tenant id associated with this onboarding.","example":101,"nullable":true},"tenantName":{"type":"string","description":"Tenant display name.","example":"CryptoSwift"},"tenantLegalName":{"type":"string","description":"Tenant legal name.","example":"CryptoSwift OÜ","nullable":true},"tenantEmail":{"type":"string","description":"Primary tenant email.","example":"compliance@example.com"},"tenantIsVerified":{"type":"boolean","description":"Whether the tenant is already verified.","example":true}},"required":["tenantId","status","createdAt","updatedAt","files","tenantName","tenantEmail","tenantIsVerified"]},"AdminTenantUserDto":{"type":"object","properties":{"id":{"type":"number","description":"User id.","example":7},"name":{"type":"string","description":"Full name.","example":"Jane Admin"},"email":{"type":"string","description":"Email address.","example":"jane.admin@acme.exchange"},"username":{"type":"string","description":"Username.","example":"jane_admin"},"isAdmin":{"type":"boolean","description":"Whether the user is a tenant admin.","example":true}},"required":["id","name","email","username","isAdmin"]},"AdminTenantReviewVerificationDto":{"type":"object","properties":{"verified":{"type":"boolean","description":"Whether the tenant is verified.","example":false},"onboardingStatus":{"type":"string","description":"Derived onboarding summary status.","enum":["NONE","STARTED","SUBMITTED","COMPLETED"],"example":"SUBMITTED"},"submittedAt":{"format":"date-time","type":"string","description":"When onboarding was submitted for review.","example":"2026-03-19T10:30:00.000Z","nullable":true},"completedAt":{"format":"date-time","type":"string","description":"When onboarding was marked complete.","example":"2026-03-20T09:15:00.000Z","nullable":true}},"required":["verified","onboardingStatus"]},"AdminTenantReviewDerivedDto":{"type":"object","properties":{"onboardingStarted":{"type":"boolean","description":"Whether onboarding has been started.","example":true},"onboardingSubmitted":{"type":"boolean","description":"Whether onboarding has been submitted.","example":true},"freeOrPaidPreference":{"type":"string","description":"Free or paid preference if captured in onboarding details.","example":"PAID","nullable":true}},"required":["onboardingStarted","onboardingSubmitted"]},"AdminTenantReviewDto":{"type":"object","properties":{"tenant":{"description":"Tenant payload.","allOf":[{"$ref":"#/components/schemas/AdminTenantDto"}]},"onboarding":{"description":"Detailed onboarding payload when onboarding exists.","nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/AdminTenantOnboardingDto"}]},"users":{"description":"Users belonging to the tenant.","type":"array","items":{"$ref":"#/components/schemas/AdminTenantUserDto"}},"verification":{"description":"Verification status summary.","allOf":[{"$ref":"#/components/schemas/AdminTenantReviewVerificationDto"}]},"derived":{"description":"Derived review fields for the UI.","allOf":[{"$ref":"#/components/schemas/AdminTenantReviewDerivedDto"}]}},"required":["tenant","users","verification","derived"]},"AdminTenantUpdateRequestDto":{"type":"object","properties":{"legalName":{"type":"string","description":"Tenant legal name.","example":"Acme Digital Assets LLC"},"email":{"type":"string","description":"Primary tenant email.","example":"ops@acme.exchange"},"webpage":{"type":"string","description":"Tenant webpage.","example":"https://acme.exchange"},"country":{"type":"string","description":"Country code or country name stored for the tenant.","example":"US"},"town":{"type":"string","description":"Town or city stored for the tenant.","example":"New York"},"package":{"type":"string","description":"Commercial package name.","example":"growth"},"minMonthlyPrice":{"type":"object","description":"Minimum monthly price.","example":99},"currency":{"type":"string","description":"Tenant billing currency.","enum":["EUR","USD"],"example":"EUR"},"transactionsIncluded":{"type":"number","description":"Included transaction count in the package.","example":500},"pricePerAdditionalTransaction":{"type":"object","description":"Price per additional transaction.","example":0.4},"verified":{"type":"boolean","description":"Whether the tenant should be marked verified immediately. Defaults to true.","example":true,"default":true}}},"AdminTenantUserCreateRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"Full name.","example":"Jane Admin"},"email":{"type":"string","description":"Email address.","example":"jane.admin@acme.exchange"},"username":{"type":"string","description":"Username.","example":"jane_admin"},"isAdmin":{"type":"boolean","description":"Whether the user should be a tenant admin.","example":true,"default":false}},"required":["name","email","username"]},"AdminTenantUserUpdateRequestDto":{"type":"object","properties":{"name":{"type":"string","description":"Full name.","example":"Jane Admin"},"email":{"type":"string","description":"Email address.","example":"jane.admin@acme.exchange"},"username":{"type":"string","description":"Username.","example":"jane_admin"},"isAdmin":{"type":"boolean","description":"Whether the user should be a tenant admin.","example":true,"default":false}}},"AdminTenantUserInviteResponseDto":{"type":"object","properties":{"tenantId":{"type":"number","description":"Tenant id.","example":42},"userId":{"type":"number","description":"User id.","example":7},"email":{"type":"string","description":"Invite target email.","example":"jane.admin@acme.exchange"},"sent":{"type":"boolean","description":"Whether the invite email dispatch was requested successfully.","example":true},"invitedAt":{"format":"date-time","type":"string","description":"When the invite was triggered.","example":"2026-03-19T10:30:00.000Z"}},"required":["tenantId","userId","email","sent","invitedAt"]},"TenantOnboardingDto":{"type":"object","properties":{"tenantId":{"type":"number","description":"Tenant id associated with the onboarding.","example":42},"status":{"type":"string","description":"Current onboarding status.","enum":["STARTED","SUBMITTED","COMPLETED"],"example":"SUBMITTED"},"details":{"type":"object","description":"Arbitrary onboarding details collected from the tenant.","additionalProperties":true,"example":{"countryOfIncorporation":"EE","regulator":"FIU","licenseNumber":"FVT000123"}},"reviewNotes":{"type":"string","description":"Review notes added during the review process.","example":"Reviewed and approved.","nullable":true},"submittedAt":{"format":"date-time","type":"string","description":"When the onboarding was submitted for review.","example":"2026-03-19T10:30:00.000Z","nullable":true},"completedAt":{"format":"date-time","type":"string","description":"When the onboarding was marked complete.","example":"2026-03-20T09:15:00.000Z","nullable":true},"createdAt":{"format":"date-time","type":"string","description":"When the onboarding record was created.","example":"2026-03-18T08:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","description":"When the onboarding record was last updated.","example":"2026-03-19T10:30:00.000Z"},"files":{"description":"Uploaded onboarding documents.","type":"array","items":{"$ref":"#/components/schemas/TenantOnboardingFileDto"}}},"required":["tenantId","status","createdAt","updatedAt","files"]},"TenantOnboardingUpsertRequestDto":{"type":"object","properties":{"details":{"type":"object","description":"Onboarding details to merge into the current onboarding draft.","additionalProperties":true,"example":{"countryOfIncorporation":"EE","regulator":"FIU","licenseNumber":"FVT000123"}},"submitForReview":{"type":"boolean","description":"Set to true to submit the onboarding for admin review after saving the details.","example":true}}},"AdminTenantOnboardingListItemDto":{"type":"object","properties":{"tenantId":{"type":"number","description":"Tenant id.","example":42},"productionTenantId":{"type":"number","description":"Production tenant id associated with this onboarding.","example":101,"nullable":true},"tenantName":{"type":"string","description":"Tenant display name.","example":"CryptoSwift"},"tenantLegalName":{"type":"string","description":"Tenant legal name.","example":"CryptoSwift OÜ","nullable":true},"tenantEmail":{"type":"string","description":"Primary tenant email.","example":"compliance@example.com"},"tenantIsVerified":{"type":"boolean","description":"Whether the tenant is already verified.","example":false},"status":{"type":"string","description":"Current onboarding status.","enum":["STARTED","SUBMITTED","COMPLETED"],"example":"SUBMITTED"},"fileCount":{"type":"number","description":"Number of uploaded onboarding files.","example":3},"submittedAt":{"format":"date-time","type":"string","description":"When the onboarding was submitted for review.","example":"2026-03-19T10:30:00.000Z","nullable":true},"completedAt":{"format":"date-time","type":"string","description":"When the onboarding was marked complete.","example":"2026-03-20T09:15:00.000Z","nullable":true},"createdAt":{"format":"date-time","type":"string","description":"Creation timestamp.","example":"2026-03-18T08:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","description":"Last update timestamp.","example":"2026-03-19T10:30:00.000Z"}},"required":["tenantId","tenantName","tenantEmail","tenantIsVerified","status","fileCount","createdAt","updatedAt"]},"TenantOnboardingAdminUpdateRequestDto":{"type":"object","properties":{"status":{"type":"string","description":"Target onboarding status. Admin updates support moving onboarding back to STARTED or marking it COMPLETED.","enum":["STARTED","COMPLETED"],"example":"COMPLETED"},"reviewNotes":{"type":"string","description":"Optional review note stored together with the updated onboarding status.","example":"Documents checked and tenant marked as verified."},"productionTenantId":{"type":"number","description":"Optional production tenant id to associate with this onboarding. Stored only when this field is included in the payload.","example":101,"nullable":true}},"required":["status"]},"AMLBotWebhookDto":{"type":"object","properties":{}},"WidgetCreateSatoshiFlowDto":{"type":"object","properties":{"depositAddress":{"type":"string","description":"VASP deposit wallet address is required for satoshi-test","example":"025ecb213e8322af685473d2e4c8b23b5c104a9e57822027380a9bf6cd68dc2bfc"},"amount":{"type":"number","description":"Amount to deposit for satoshi-test. If not provided CryptoSwift will generate one","example":5e-8}},"required":["depositAddress"]},"WidgetCreateRequestDto":{"type":"object","properties":{"allowedFlows":{"type":"array","description":"Allowed self-hosted wallet verification flows. If not provided, CryptoSwift will automatically select the most suitable verification flows","example":["SATOSHI_TEST","SIGNATURE_PROOF"],"items":{"type":"string","enum":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"]}},"satoshiFlow":{"description":"In case of a satoshi-test the next properties should be provided","example":{"depositAddress":"025ecb213e8322af685473d2e4c8b23b5c104a9e57822027380a9bf6cd68dc2bfc","amount":5e-8},"allOf":[{"$ref":"#/components/schemas/WidgetCreateSatoshiFlowDto"}]},"asset":{"type":"string","description":"Asset type<br/>\n    In case of satoshi-test, it should be a native asset of the blockchain (e.g., 'BTC' for Bitcoin, 'ETH' for Ethereum). <br/>","example":"BTC"},"blockchain":{"type":"string","description":"The name of blockchain network or a 'chainId' for EVM only.<br/>\n    You can find the supported chains listed <a target=\"_blank\" href=\"#tag/Blockchains/operation/getBlockchains\">here</a>, use the blockchain name to initiate the widget.","example":"Bitcoin"},"address":{"type":"string","description":"Self hosted wallet address to verify","example":"1LqBGSKuX8PhvWpExwi2u3CeptkUM3N4cS"},"metadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"redirectUrl":{"type":"string","description":"This field is required when the widget is hosted by CryptoSwift. For more details, refer to the [documentation ](https://dev.cryptoswift.eu/docs/self-hosted-wallet-verification/widget)."},"origin":{"type":"string","description":"The origin `<scheme>://<hostname>[:<port>]` that will be used to host the widget. It will enforce security both on the client-side and while validating the signature (if applicable). <br /><br />\n    In case you are using the widget as a Web Component, make sure to set the origin to the URL you are serving the widget from (without the trailing / in the URL!).","example":"https://wallet.cryptoswift.eu"},"allowedLanguages":{"type":"array","description":"List of allowed languages for the self-hosted wallet interface. If not provided, all available languages will be shown","example":["en","ko"],"items":{"type":"string","enum":["en","de","et","cs","hu","pl","ru","uk","es","ko"]}}},"required":["asset","blockchain","address"]},"WidgetCreateResponseDto":{"type":"object","properties":{"token":{"type":"string","description":"The short lived token which is valid for 24 hours. The token is used to start the verification flow for the widget. In case you are using the widget as a Web Component, set the token as the `token` parameter when loading the widget.","example":"3d361a62-194a-4ddc-a7cc-c7e7ea78076e"},"walletVerificationId":{"type":"string","description":"The wallet verification id for further validation","example":"3d361a62-194a-4ddc-a7cc-c7e7ea78076e"},"url":{"type":"string","description":"The URL to start the verification flow. Can be used to redirect the user to the widget. The URL contains the token as a query parameter.","example":"http://wallet.cryptoswift.eu?token=3d361a62-194a-4ddc-a7cc-c7e7ea78076e"}},"required":["token","walletVerificationId","url"]},"WidgetThemeDto":{"type":"object","properties":{"fontFamily":{"type":"string","description":"The Google Font name"},"fontWeight":{"type":"number","description":"The Google Font weight. Where normal is 400, medium is 500 and bold is 700. If not provided, normal (400) is used."},"fontSize":{"type":"number","description":"The font size in pixels. Headings and related text scale from this value. 16px is the default font size and is used if not provided."},"fontColor":{"type":"string","description":"The font color"},"primaryColor":{"type":"string","description":"The primary color"},"backgroundColor":{"type":"string","description":"The background color"},"buttonBorderRadius":{"type":"number","description":"The button border radius"},"buttonShadowEnabled":{"type":"boolean","description":"The button shadow enabled"},"flowsOrder":{"type":"array","description":"The order in which wallet verification flows should be displayed by the widget. Flows not included can use the widget default order.","example":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"],"items":{"type":"string","enum":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"]}},"brandLogo":{"type":"string","description":"The public URL to the tenant logo"},"brandIcon":{"type":"string","description":"The public URL to the tenant icon"}}},"WidgetGetResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the widget","example":"e04fbd02-edb4-4f21-8c8c-11dc9a0b3bbd"},"allowedFlows":{"type":"array","description":"Allowed self-hosted wallet verification flows. If not provided, CryptoSwift will automatically select the most suitable verification flows","example":["SATOSHI_TEST","SIGNATURE_PROOF"],"items":{"type":"string","enum":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"]}},"satoshiFlow":{"description":"In case of a satoshi-test the next properties should be provided","example":{"depositAddress":"025ecb213e8322af685473d2e4c8b23b5c104a9e57822027380a9bf6cd68dc2bfc","amount":5e-8},"allOf":[{"$ref":"#/components/schemas/WidgetCreateSatoshiFlowDto"}]},"asset":{"type":"string","description":"Asset type<br/>\n    In case of satoshi-test, it should be a native asset of the blockchain (e.g., 'BTC' for Bitcoin, 'ETH' for Ethereum). <br/>","example":"BTC"},"blockchain":{"type":"string","description":"The name of blockchain network or a 'chainId' for EVM only.<br/>\n    You can find the supported chains listed <a target=\"_blank\" href=\"#tag/Blockchains/operation/getBlockchains\">here</a>, use the blockchain name to initiate the widget.","example":"Bitcoin"},"address":{"type":"string","description":"Self hosted wallet address to verify","example":"1LqBGSKuX8PhvWpExwi2u3CeptkUM3N4cS"},"metadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"redirectUrl":{"type":"string","description":"This field is required when the widget is hosted by CryptoSwift. For more details, refer to the [documentation ](https://dev.cryptoswift.eu/docs/self-hosted-wallet-verification/widget)."},"origin":{"type":"string","description":"The origin `<scheme>://<hostname>[:<port>]` that will be used to host the widget. It will enforce security both on the client-side and while validating the signature (if applicable). <br /><br />\n    In case you are using the widget as a Web Component, make sure to set the origin to the URL you are serving the widget from (without the trailing / in the URL!).","example":"https://wallet.cryptoswift.eu"},"theme":{"$ref":"#/components/schemas/WidgetThemeDto"},"allowedLanguages":{"type":"array","description":"List of allowed languages for the self-hosted wallet interface. If not provided, all available languages will be shown","example":["en","ko"],"items":{"type":"string","enum":["en","de","et","cs","hu","pl","ru","uk","es","ko"]}},"tenantName":{"type":"string","description":"Tenant name associated with the widget","example":"CryptoSwift"}},"required":["id","asset","blockchain","address"]},"WidgetPatchResponseDto":{"type":"object","properties":{"walletVerificationId":{"type":"string","description":"The wallet verification id for further validation"}},"required":["walletVerificationId"]},"WalletVerificationSatoshiRequestDto":{"type":"object","properties":{"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"02f852bec98de40721fe0c5188c7255f7bc8592c1a1bcddb7d0c8edbf47f0f503c"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"depositAddress":{"type":"string","description":"VASP deposit wallet address","example":"025ecb213e8322af685473d2e4c8b23b5c104a9e57822027380a9bf6cd68dc2bfc"},"asset":{"type":"string","description":"Asset type","example":"BTC"},"blockchain":{"type":"string","description":"The blockchain network","example":"Bitcoin"},"amount":{"type":"number","description":"Amount to deposit. If not provided CryptoSwift will generate one","example":5e-8}},"required":["withdrawalAddress","depositAddress","asset","blockchain"]},"WalletVerificationStatus":{"type":"string","enum":["PENDING","VERIFIED","FAILED","DELETED","DECLINED","ACTION_REQUIRED"],"description":"Self hosted wallet verification status"},"WalletVerificationSatoshiResponseDto":{"type":"object","properties":{"verificationRequestId":{"type":"string","description":"The ID of the wallet verification request","example":"e04fbd02-edb4-4f21-8c8c-11dc9a0b3bbd"},"asset":{"type":"string","description":"Asset type","example":"BTC"},"blockchain":{"type":"string","description":"The blockchain network","example":"Bitcoin"},"amount":{"type":"number","description":"Amount to deposit","example":5e-8},"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"02f852bec98de40721fe0c5188c7255f7bc8592c1a1bcddb7d0c8edbf47f0f503c"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"depositAddress":{"type":"string","description":"VASP deposit wallet address","example":"025ecb213e8322af685473d2e4c8b23b5c104a9e57822027380a9bf6cd68dc2bfc"},"status":{"description":"Self hosted wallet verification status","example":"VERIFIED","allOf":[{"$ref":"#/components/schemas/WalletVerificationStatus"}]},"statusReasoning":{"type":"string","description":"Self hosted wallet verification status reasoning","example":"Verification has expired"},"verifiedTransactionHash":{"type":"string","description":"Self hosted wallet verification transaction hash","example":"5edb2795e524a4b5b9191433348171da35af0c8cd1c04489c5b093e54882963d"},"createdAt":{"format":"date-time","type":"string","description":"When self hosted wallet verification been created","example":"2026-05-08 07:32:48"},"updatedAt":{"format":"date-time","type":"string","description":"When self hosted wallet verification been updated","example":"2026-05-08 07:32:48"},"riskScore":{"type":"number","description":"Overall numerical (0 - 100) risk score of the wallet.","example":42},"riskSeverity":{"type":"string","description":"Overall risk severity of the wallet.","enum":["low","medium","high"],"example":"medium"},"withdrawalAddressDetectedEntity":{"type":"string","description":"Entity name associated with the withdrawal address, when detected by blockchain analytics.","example":"Binance"},"warnings":{"description":"Descriptive warning messages, if applicable.","readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/WarningDto"}}},"required":["verificationRequestId","asset","blockchain","amount","withdrawalAddress","depositAddress","status","createdAt","updatedAt"]},"WalletVerificationVisualProofRequestDto":{"type":"object","properties":{"files":{"description":"Upload up to 3 files.<br/><br/>\n        - Images: jpeg, png, jpg or pdf max 5MB each<br/>\n        - Videos: mp4, webm, mov, avi, wmv, mkv, mpeg, m4v or 3gp max 50MB each","type":"array","items":{"type":"string","format":"binary"}},"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"02f852bec98de40721fe0c5188c7255f7bc8592c1a1bcddb7d0c8edbf47f0f503c"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"asset":{"type":"string","description":"Asset type","example":"BTC"},"blockchain":{"type":"string","description":"The blockchain network","example":"Bitcoin"}},"required":["files","withdrawalAddress","asset","blockchain"]},"WalletVerificationVisualProofResponseDto":{"type":"object","properties":{"verificationRequestId":{"type":"string","description":"The ID of the wallet verification request","example":"e04fbd02-edb4-4f21-8c8c-11dc9a0b3bbd"},"asset":{"type":"string","description":"Asset type","example":"BTC"},"blockchain":{"type":"string","description":"The blockchain network","example":"Bitcoin"},"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"02f852bec98de40721fe0c5188c7255f7bc8592c1a1bcddb7d0c8edbf47f0f503c"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"status":{"type":"string","description":"Self hosted wallet verification status","example":"VERIFIED"},"createdAt":{"format":"date-time","type":"string","description":"When self hosted wallet verification been created","example":"2026-05-08 07:32:48"},"riskScore":{"type":"number","description":"Overall numerical (0 - 100) risk score of the wallet.","example":42},"riskSeverity":{"type":"string","description":"Overall risk severity of the wallet.","enum":["low","medium","high"],"example":"medium"},"withdrawalAddressDetectedEntity":{"type":"string","description":"Entity name associated with the withdrawal address, when detected by blockchain analytics.","example":"Binance"},"warnings":{"description":"Descriptive warning messages, if applicable.","readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/WarningDto"}}},"required":["verificationRequestId","asset","blockchain","withdrawalAddress","status","createdAt"]},"WalletVerificationSelfDeclaredRequestDto":{"type":"object","properties":{"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"02f852bec98de40721fe0c5188c7255f7bc8592c1a1bcddb7d0c8edbf47f0f503c"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"asset":{"type":"string","description":"Asset type","example":"BTC"},"blockchain":{"type":"string","description":"The blockchain network","example":"Bitcoin"},"approved":{"type":"boolean","description":"A boolean declaration (TRUE) that confirms ownership of the wallet","example":"true"}},"required":["withdrawalAddress","asset","blockchain","approved"]},"WalletVerificationSelfDeclaredResponseDto":{"type":"object","properties":{"verificationRequestId":{"type":"string","description":"The ID of the wallet verification request","example":"e04fbd02-edb4-4f21-8c8c-11dc9a0b3bbd"},"asset":{"type":"string","description":"Asset type","example":"BTC"},"blockchain":{"type":"string","description":"The blockchain network","example":"Bitcoin"},"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"02f852bec98de40721fe0c5188c7255f7bc8592c1a1bcddb7d0c8edbf47f0f503c"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"status":{"type":"string","description":"Self hosted wallet verification status","example":"VERIFIED"},"createdAt":{"format":"date-time","type":"string","description":"When self hosted wallet verification been created","example":"2026-05-08 07:32:48"},"riskScore":{"type":"number","description":"Overall numerical (0 - 100) risk score of the wallet.","example":42},"riskSeverity":{"type":"string","description":"Overall risk severity of the wallet.","enum":["low","medium","high"],"example":"medium"},"withdrawalAddressDetectedEntity":{"type":"string","description":"Entity name associated with the withdrawal address, when detected by blockchain analytics.","example":"Binance"},"warnings":{"description":"Descriptive warning messages, if applicable.","readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/WarningDto"}}},"required":["verificationRequestId","asset","blockchain","withdrawalAddress","status","createdAt"]},"WalletVerificationSignatureProofRequestDto":{"type":"object","properties":{"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"0x32Be343B94f860124dC4fEe278FDCBD38C102D88"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"asset":{"type":"string","description":"Asset type","example":"ETH"},"blockchain":{"type":"string","description":"The blockchain network to interact with.<br/>\n      Supported values include all chains listed in <a target=\"_blank\" href=\"https://github.com/wevm/viem/blob/main/src/chains/index.ts\">Viem's chain definitions</a>, such as Ethereum, Goerli Ether, Polygon, Arbitrum One, OP Mainnet, and many more. The value must match one of the supported chain names from the Viem library or match Bitcoin or Solana","example":"Ethereum"},"signedMessage":{"type":"string","description":"The original message that was signed to prove ownership of the wallet address. This must be exactly the same as what the user signed","example":"app.cryptoswift.eu:8080 wants you to sign in with your **blockchain** account:\n0x32Be343B94f860124dC4fEe278FDCBD38C102D88\n\nURI:https://app.cryptoswift.eu:8080/\nVersion: 1\nChain ID: eip155:1\nNonce: 1961\nIssued At: 2026-05-08 07:32:57"},"signature":{"type":"string","description":"The cryptographic signature generated by signing the above message with the private key of the wallet address","example":"q7XUz9XJbWjK9YO2iA8eW3OmEDCuqKDG12tzmPVNlDb9X6G6MxwGqv8J8B4gEZq43vU3D9VaGRKqB1wnyCrR7A="},"origin":{"type":"string","description":"The origin `<scheme>://<hostname>[:<port>]` that will be used while validating the signature","example":"https://app.cryptoswift.eu:8080"}},"required":["withdrawalAddress","asset","blockchain","signedMessage","signature","origin"]},"WalletVerificationSignatureProofResponseDto":{"type":"object","properties":{"verificationRequestId":{"type":"string","description":"The ID of the wallet verification request","example":"e04fbd02-edb4-4f21-8c8c-11dc9a0b3bbd"},"asset":{"type":"string","description":"Asset type","example":"BTC"},"blockchain":{"type":"string","description":"The blockchain network","example":"Ethereum"},"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"02f852bec98de40721fe0c5188c7255f7bc8592c1a1bcddb7d0c8edbf47f0f503c"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"signedMessage":{"type":"string","description":"The original message that was signed to prove ownership of the wallet address. This must be exactly the same as what the user signed.","example":"I own this wallet as of 2026-05-08 07:32:48"},"signature":{"type":"string","description":"The cryptographic signature generated by signing the above message with the private key of the wallet address.","example":"q7XUz9XJbWjK9YO2iA8eW3OmEDCuqKDG12tzmPVNlDb9X6G6MxwGqv8J8B4gEZq43vU3D9VaGRKqB1wnyCrR7A="},"status":{"type":"string","description":"Self hosted wallet verification status","example":"VERIFIED"},"createdAt":{"format":"date-time","type":"string","description":"When self hosted wallet verification been created","example":"2026-05-08 07:32:48"},"riskScore":{"type":"number","description":"Overall numerical (0 - 100) risk score of the wallet.","example":42},"riskSeverity":{"type":"string","description":"Overall risk severity of the wallet.","enum":["low","medium","high"],"example":"medium"},"withdrawalAddressDetectedEntity":{"type":"string","description":"Entity name associated with the withdrawal address, when detected by blockchain analytics.","example":"Binance"},"warnings":{"description":"Descriptive warning messages, if applicable.","readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/WarningDto"}}},"required":["verificationRequestId","asset","blockchain","withdrawalAddress","signedMessage","signature","status","createdAt"]},"WalletVerificationFlow":{"type":"string","enum":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"],"description":"Self hosted wallet verification flow"},"WalletVerificationListResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"The ID of the wallet verification request","example":"e04fbd02-edb4-4f21-8c8c-11dc9a0b3bbd"},"widgetUrl":{"type":"string","description":"The widget url of the wallet verification request","example":"e04fbd02-edb4-4f21-8c8c-11dc9a0b3bbd"},"depositAddress":{"type":"string","description":"VASP deposit wallet address","example":"025ecb213e8322af685473d2e4c8b23b5c104a9e57822027380a9bf6cd68dc2bfc"},"withdrawalAddress":{"type":"string","description":"Self hosted wallet address to verify","example":"02f852bec98de40721fe0c5188c7255f7bc8592c1a1bcddb7d0c8edbf47f0f503c"},"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"asset":{"type":"string","description":"Asset type","example":"BTC"},"blockchain":{"type":"string","description":"The blockchain network to interact with.<br/>\n      Supported values include all chains listed in <a target=\"_blank\" href=\"https://github.com/wevm/viem/blob/main/src/chains/index.ts\">Viem's chain definitions</a>, such as Ethereum, Goerli Ether, Polygon, Arbitrum One, OP Mainnet, and many more. The value must match one of the supported chain names from the Viem library or match Bitcoin or Solana","example":"Bitcoin"},"amount":{"type":"number","description":"Amount to deposit","example":5e-8},"verifiedTransactionHash":{"type":"string","description":"Self hosted wallet verification transaction hash","example":"5edb2795e524a4b5b9191433348171da35af0c8cd1c04489c5b093e54882963d"},"status":{"description":"Self hosted wallet verification status","example":"VERIFIED","allOf":[{"$ref":"#/components/schemas/WalletVerificationStatus"}]},"statusReasoning":{"type":"string","description":"Self hosted wallet verification status reasoning","example":"Verification has expired"},"updatedAt":{"format":"date-time","type":"string","description":"When self hosted wallet verification been updated","example":"2026-05-08 07:32:48"},"flow":{"description":"Self hosted wallet verification flow","example":"SATOSHI_TEST","allOf":[{"$ref":"#/components/schemas/WalletVerificationFlow"}]},"signedMessage":{"type":"string","description":"The original message that was signed to prove ownership of the wallet address. This must be exactly the same as what the user signed.","example":"I own this wallet as of 2026-05-08 07:32:48"},"signature":{"type":"string","description":"The cryptographic signature generated by signing the above message with the private key of the wallet address.","example":"q7XUz9XJbWjK9YO2iA8eW3OmEDCuqKDG12tzmPVNlDb9X6G6MxwGqv8J8B4gEZq43vU3D9VaGRKqB1wnyCrR7A="},"createdAt":{"format":"date-time","type":"string","description":"When self hosted wallet verification been created","example":"2026-05-08 07:32:48"},"riskScore":{"type":"number","description":"Overall numerical (0 - 100) risk score of the wallet.","example":42},"riskSeverity":{"type":"string","description":"Overall risk severity of the wallet.","enum":["low","medium","high"],"example":"medium"},"withdrawalAddressDetectedEntity":{"type":"string","description":"Entity name associated with the withdrawal address, when detected by blockchain analytics.","example":"Binance"},"warnings":{"description":"Descriptive warning messages, if applicable.","readOnly":true,"type":"array","items":{"$ref":"#/components/schemas/WarningDto"}}},"required":["id","widgetUrl","withdrawalAddress","asset","blockchain","status","flow","signedMessage","signature","createdAt"]},"WalletVerificationVisualProofSignedUrlResponseDto":{"type":"object","properties":{"urls":{"description":"A temporary array of URLs to access the visual proof that is valid for 15 minutes","type":"array","items":{"type":"string"}}},"required":["urls"]},"WalletVerificationUpdateRequestDto":{"type":"object","properties":{"withdrawalMetadata":{"type":"string","description":"Self hosted wallet metadata that can be used to identify the wallet or user outside of the CryptoSwift system","example":"be0bf82b-426e-40a6-a4e5-09800db30908"},"status":{"description":"Self hosted wallet verification status","example":"FAILED","allOf":[{"$ref":"#/components/schemas/WalletVerificationStatus"}]},"statusReasoning":{"type":"string","description":"Self hosted wallet verification status reasoning","example":"Verification has expired"}},"required":["status"]},"BlockchainInfoDto":{"type":"object","properties":{"transactionHash":{"type":"string","description":"The transaction hash"},"origin":{"type":"string","description":"The originator wallet address"},"destination":{"type":"string","description":"The destination wallet address"},"blockchain":{"type":"string","description":"The blockchain name"}},"required":["transactionHash","origin","destination","blockchain"]},"VaspInfoDto":{"type":"object","properties":{"originatorVaspName":{"type":"string","description":"The originator VASP name"}}},"CreateClaimDto":{"type":"object","properties":{"asset":{"type":"string","description":"The asset"},"blockchainInfo":{"description":"The blockchain information","allOf":[{"$ref":"#/components/schemas/BlockchainInfoDto"}]},"vaspInfo":{"description":"The VASP information","allOf":[{"$ref":"#/components/schemas/VaspInfoDto"}]},"transactionId":{"type":"string","readOnly":true,"description":"ID of related transaction. Null if not applicable or not checked yet."}},"required":["asset","blockchainInfo"]},"ClaimStatus":{"type":"string","enum":["PENDING","DELIVERED","CONFIRMED"],"description":"The claim status"},"DetailedVaspInfoDto":{"type":"object","properties":{"providedOriginatorVasp":{"type":"string","description":"The provided originator VASP name"},"identifiedOriginatorVasp":{"type":"string","description":"The identified originator VASP name"}}},"DetailedClaimDto":{"type":"object","properties":{"id":{"type":"string","description":"The claim ID"},"asset":{"type":"string","description":"The asset"},"blockchainInfo":{"description":"The blockchain information","allOf":[{"$ref":"#/components/schemas/BlockchainInfoDto"}]},"status":{"description":"The claim status","allOf":[{"$ref":"#/components/schemas/ClaimStatus"}]},"transactionId":{"type":"string","readOnly":true,"description":"ID of related transaction. Null if not applicable or not checked yet."},"createdAt":{"format":"date-time","type":"string","description":"Created at timestamp"},"updatedAt":{"format":"date-time","type":"string","description":"Updated at timestamp"},"vaspInfo":{"description":"The VASP information","allOf":[{"$ref":"#/components/schemas/DetailedVaspInfoDto"}]}},"required":["id","asset","blockchainInfo","status","createdAt","updatedAt","vaspInfo"]},"BlockchainNameDto":{"type":"object","properties":{"name":{"type":"string","description":"The blockchain name"},"chainId":{"type":"string","description":"The EVM chain ID if applicable"},"supportedVerificationFlow":{"type":"array","description":"List of supported wallet verification flows for this blockchain (eg Satoshi-Test, Signature Proof, etc).","example":["SATOSHI_TEST","SIGNATURE_PROOF"],"items":{"type":"string","enum":["SATOSHI_TEST","VISUAL_PROOF","SELF_DECLARED","SIGNATURE_PROOF"]}}},"required":["name"]},"CheckTinResponseDto":{"type":"object","properties":{"country":{"type":"string","description":"Human readable country name for the provided code.","example":"Estonia"},"error":{"type":"boolean","description":"Indicates whether the upstream service flagged an error.","example":false},"structureValid":{"type":"boolean","description":"Structural validity of the TIN according to the EU service. This represents if the format of the TIN (e.g., the total number of characters, the mix of letters/numbers, the position of separators) matches the known pattern for that country.","example":true},"syntaxValid":{"type":"boolean","description":"Syntax validity of the TIN according to the EU service. This is a more sophisticated check that uses a mathematical rule or algorithm (like a checksum calculation) provided by the national tax authority to verify the internal consistency of the numbers themselves.","example":true},"syntaxUnavailable":{"type":"boolean","description":"If set to true, the national tax authority of that country has NOT provided the syntax validation algorithm to the service. Therefore, the system cannot perform a complete syntax check on the TIN you submitted.","example":false}},"required":["country","error","structureValid","syntaxValid","syntaxUnavailable"]},"ErrorResponse":{"type":"object","required":["message","statusCode"],"additionalProperties":true,"properties":{"statusCode":{"type":"integer","example":400},"message":{"oneOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"example":"Request validation failed"},"error":{"type":"string","example":"Bad Request"},"timestamp":{"type":"string","format":"date-time","example":"2026-01-15T10:20:30.000Z"}}},"TransactionWebhookEvent":{"description":"Current transaction webhook payload for integrations that receive transaction notifications from CryptoSwift. The request body is the transaction object itself (`TransactionDto`).\n\nEvent type header: `X-Event-Type` with value `transaction` for transaction notifications.\n\nSignature header: `CryptoSwift-Signature` with the format `t=<unix_epoch_ms>,s=<hex_hmac_sha256>`. Timestamp header: no separate timestamp header is currently sent; use the `t` value from `CryptoSwift-Signature`.\n\nTo verify the signature, compute `HMAC-SHA256` over `<t>.<raw JSON request body>` using your tenant `webhookSecret`, encode it as lowercase hexadecimal, and compare it with the `s` value using a timing-safe comparison. Reject stale timestamps according to your replay-protection policy.\n\nRetry behavior: webhook delivery logs failed requests and does not perform automatic retries.\n\nTimeout expectations: no custom HTTP timeout is configured. Webhook receivers should return a 2xx response quickly, ideally within 10 seconds, and process long-running work asynchronously.\n\nDuplicate handling: transaction status and update notifications can be delivered more than once by operational replays. Use the transaction `id`, latest `status`, and your own processed-event state to avoid duplicate side effects.","allOf":[{"$ref":"#/components/schemas/TransactionDto"}]}},"responses":{"BadRequest":{"description":"Bad request. The request payload, parameters, or headers are invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"malformedJson":{"summary":"Malformed JSON","value":{"message":"Expected ',' or '}' after property value in JSON at position 26 (line 3 column 5)","error":"Bad Request","statusCode":400}},"genericBadRequest":{"summary":"Generic bad request","value":{"message":"Bad request, please check the provided data or contact customer support","error":"Bad Request","statusCode":400}}}}}},"Unauthorized":{"description":"Authentication failed or the X-Api-Key header is missing.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"default":{"value":{"message":"Unauthorized","statusCode":401}}}}}},"Forbidden":{"description":"The authenticated caller is not allowed to perform this action.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"detailedApiException":{"summary":"Detailed API exception","value":{"statusCode":403,"message":"Access Denied","error":"FORBIDDEN","timestamp":"2026-01-15T10:20:30.000Z"}}}}}},"NotFound":{"description":"The requested resource was not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"default":{"value":{"message":"Cannot POST /transactionss","error":"Not Found","statusCode":404}}}}}},"RateLimited":{"description":"Too many requests.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"default":{"value":{"message":"ThrottlerException: Too Many Requests","error":"Too Many Requests","statusCode":429}}}}}},"InternalServerError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"},"examples":{"default":{"value":{"message":"Internal server error","error":"Internal Server Error","statusCode":500}}}}}}}},"externalDocs":{"description":"CryptoSwift Developer Portal","url":"https://dev.cryptoswift.eu"}}