{
  "openapi": "3.1.0",
  "info": {
    "title": "Ospree Address API",
    "description": "Blockchain address screening: screen and manage addresses, and verify wallet ownership.",
    "version": "2.0.0"
  },
  "paths": {
    "/api/v2/analytics/chains/{chain}/addresses/{address}/details": {
      "get": {
        "tags": [
          "Addresses"
        ],
        "summary": "Get Address Verification Details",
        "operationId": "Get_address_verification_details_api_v2_analytics_chains__chain__addresses__address__details_get",
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Address"
            }
          },
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Chain"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The verification and custody state held for this address.",
            "content": {
              "application/json": {
                "schema": {},
                "examples": {
                  "verified_self_hosted": {
                    "summary": "A verified, declared self-hosted wallet",
                    "description": "`is_self_hosted` is the tenant's declared custody claim (ADR-0037); `is_verified` is what a wallet-control signature actually established.",
                    "value": {
                      "status": "success",
                      "data": {
                        "address": "1JjYpRXfPntVEJqAjxsYmvFjjJBdJyaJ2k",
                        "chain": "bitcoin",
                        "is_validated": true,
                        "is_self_hosted": true,
                        "is_verified": true,
                        "is_customer": true,
                        "reference_id": "acct-orig-1042"
                      }
                    }
                  },
                  "unverified": {
                    "summary": "Known address, never verified",
                    "value": {
                      "status": "success",
                      "data": {
                        "address": "0x88c6c46ebf353a52bdbab708c23d0c81daa8134a",
                        "chain": "ethereum",
                        "is_validated": true,
                        "is_self_hosted": false,
                        "is_verified": false,
                        "is_customer": false
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Authentication required.",
                  "error_code": "auth.unauthenticated"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Payment required.",
                  "error_code": "billing.payment_required"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Address not found"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "error",
                  "code": 500,
                  "message": "Something went wrong.",
                  "error_code": "internal_error"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2/analytics/chains/{chain}/addresses/{address}/verifications": {
      "get": {
        "tags": [
          "Addresses"
        ],
        "summary": "List Wallet Verification Evidence",
        "description": "Retrieve the retained wallet-control verification evidence for an address: for each redemption attempt, the exact challenge string that was signed, its nonce, the signature and the envelope it was produced under, the address form, and — on bitcoin — the public key. This is the record a VASP files with a supervisor for a self-hosted-wallet transfer, and it is independently re-verifiable without Ospree.\n\nA signature proves control of the signing key for this address at the recorded instant. It does not prove that the wallet is self-hosted (a custodian can sign on a user's behalf), and it does not identify the tenant's customer, whom the challenge never names.\n\nWallets verified before evidence retention shipped return an empty list: nothing was retained for them and nothing can be reconstructed.",
        "operationId": "List_wallet_verification_evidence_api_v2_analytics_chains__chain__addresses__address__verifications_get",
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Blockchain network name.",
              "examples": [
                "bitcoin"
              ],
              "title": "Chain"
            },
            "description": "Blockchain network name."
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Unique blockchain identifier.",
              "examples": [
                "1JjYpRXfPntVEJqAjxsYmvFjjJBdJyaJ2k"
              ],
              "title": "Address"
            },
            "description": "Unique blockchain identifier."
          }
        ],
        "responses": {
          "200": {
            "description": "Retained wallet-control evidence for this address, newest first.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiSuccessResponse"
                },
                "examples": {
                  "bitcoin_evidence": {
                    "summary": "One redemption on bitcoin",
                    "description": "`pubkey` is present on bitcoin, the one chain where the address is not the key. `message` is the exact string that was signed -- the proof is re-verifiable without Ospree.",
                    "value": {
                      "status": "success",
                      "data": {
                        "address": "1JjYpRXfPntVEJqAjxsYmvFjjJBdJyaJ2k",
                        "chain": "bitcoin",
                        "verifications": [
                          {
                            "id": "018f5e3a-8d4c-7f6a-9e5f-3a8d4c7f6a10",
                            "chain": "bitcoin",
                            "address": "1JjYpRXfPntVEJqAjxsYmvFjjJBdJyaJ2k",
                            "address_form": "p2pkh",
                            "status": "verified",
                            "message": "Acme Exchange wants you to sign with your bitcoin account: 1JjYpRXfPntVEJqAjxsYmvFjjJBdJyaJ2k\n\nDomain: verify.ospree.io\nURI: https://verify.ospree.io/address/verification\nNonce: 9f2c1d7e4b0a6835\nIssued at: 2026-08-31:09:18:44",
                            "nonce": "9f2c1d7e4b0a6835",
                            "signature": "H1kR8mQ2vZ7pYxT4nC6bA9wE3sD5fG8hJ0kL2mN4oP6qR8sT0uV2wX4yZ6aB8cD0eF2gH4iJ6kL8mN0oP2q=",
                            "signature_format": "bip137",
                            "pubkey": "02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc",
                            "verified_at": "2026-08-31T09:20:11+00:00",
                            "challenge_issued_at": "2026-08-31T09:18:44+00:00",
                            "verifier_version": "acv-2"
                          }
                        ]
                      }
                    }
                  },
                  "no_retained_evidence": {
                    "summary": "Verified before evidence retention shipped",
                    "description": "An empty list, not a 404: the wallet may well be verified, but nothing was retained for it and nothing can be reconstructed.",
                    "value": {
                      "status": "success",
                      "data": {
                        "address": "0x88c6c46ebf353a52bdbab708c23d0c81daa8134a",
                        "chain": "ethereum",
                        "verifications": []
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Authentication required.",
                  "error_code": "auth.unauthenticated"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Payment required.",
                  "error_code": "billing.payment_required"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Entity - Validation Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Validation error",
                  "data": [
                    {
                      "loc": [
                        "path",
                        "chain"
                      ],
                      "msg": "Field required",
                      "type": "missing"
                    }
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "error",
                  "code": 500,
                  "message": "Something went wrong.",
                  "error_code": "internal_error"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2/analytics/chains/{chain}/addresses/{address}": {
      "post": {
        "tags": [
          "Addresses"
        ],
        "summary": "Screen Address",
        "description": "Screen address hashes to identify potential irregularities or suspicious activities within the\n        blockchain ecosystem, gaining detailed insights into associated entities and flagged risk indicators.",
        "operationId": "Screen_an_address_api_v2_analytics_chains__chain__addresses__address__post",
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 3,
              "title": "Blockchain network name",
              "description": "Blockchain network name.",
              "examples": [
                "bitcoin"
              ]
            },
            "description": "Blockchain network name."
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 3,
              "description": "Unique blockchain identifier.",
              "examples": [
                "1JjYpRXfPntVEJqAjxsYmvFjjJBdJyaJ2k"
              ],
              "title": "Address"
            },
            "description": "Unique blockchain identifier."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScreenAddressRequestCom"
              },
              "examples": {
                "record_only": {
                  "summary": "Record the address without a risk scan",
                  "description": "`scan_for_risk: false` records the address and returns it with `risk_data: null`. No risk provider is called, so no provider charge is incurred.",
                  "value": {
                    "scan_for_risk": false,
                    "is_self_hosted": false,
                    "account_ref_id": "acct-orig-1042"
                  }
                },
                "screen_with_risk": {
                  "summary": "Screen against a risk provider",
                  "description": "Calls the named provider (or the business default when `provider_name` is omitted).",
                  "value": {
                    "scan_for_risk": true,
                    "provider_name": "RDBIG",
                    "is_self_hosted": false,
                    "account_ref_id": "acct-orig-1042"
                  }
                },
                "self_hosted_wallet": {
                  "summary": "Record a declared self-hosted wallet",
                  "description": "`is_self_hosted` is a custody claim declared by the caller (ADR-0037). It is not established by screening, and Ospree does not independently verify it here.",
                  "value": {
                    "scan_for_risk": true,
                    "is_self_hosted": true,
                    "account_ref_id": "acct-orig-1042"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The address was screened and recorded.",
            "content": {
              "application/json": {
                "schema": {},
                "examples": {
                  "screened_with_risk": {
                    "summary": "Screened with a risk provider",
                    "value": {
                      "status": "success",
                      "data": {
                        "address": "0x88c6c46ebf353a52bdbab708c23d0c81daa8134a",
                        "chain": "ethereum",
                        "symbol": "ETH",
                        "is_self_hosted": false,
                        "financial_data": {
                          "balance": 1.24830533458673,
                          "balance_usd": 41.241
                        },
                        "risk_data": [
                          {
                            "provider_name": "RDBIG",
                            "risk_ratio": 39,
                            "risk_descriptors": [
                              "exchange_client",
                              "binance_client_deposit"
                            ],
                            "vasp_name_legal": "Binance",
                            "vasp_name_business": "binance",
                            "vasp_website": "https://www.binance.com",
                            "vasp_category": "exchange",
                            "created": "2026-08-31T09:14:22.418293+00:00"
                          }
                        ],
                        "created": "2026-08-31T09:14:22.418293"
                      }
                    }
                  },
                  "recorded_without_risk": {
                    "summary": "Recorded with no risk scan",
                    "description": "`risk_data` is null -- not an empty list -- when no scan was requested.",
                    "value": {
                      "status": "success",
                      "data": {
                        "address": "0x88c6c46ebf353a52bdbab708c23d0c81daa8134a",
                        "chain": "ethereum",
                        "symbol": "ETH",
                        "is_self_hosted": false,
                        "financial_data": {
                          "balance": 1.24830533458673,
                          "balance_usd": 41.241
                        },
                        "created": "2026-08-31T09:14:22.418293"
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Authentication required.",
                  "error_code": "auth.unauthenticated"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Payment required.",
                  "error_code": "billing.payment_required"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Entity - Validation Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Validation error",
                  "data": [
                    {
                      "loc": [
                        "path",
                        "address"
                      ],
                      "msg": "Field required",
                      "type": "missing"
                    }
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "424": {
            "description": "The provider refused the business's own API key for it. `error_code` says why; `Retry-After` accompanies a rate limit. Only a screen on a key the business connected itself.",
            "content": {
              "application/json": {
                "examples": {
                  "key_rejected": {
                    "summary": "The provider rejected the business's own key",
                    "value": {
                      "status": "fail",
                      "message": "TRM Labs rejected your own API key.",
                      "error_code": "provider_key.rejected"
                    }
                  },
                  "chain_not_entitled": {
                    "summary": "The business's own provider plan does not cover the chain",
                    "value": {
                      "status": "fail",
                      "message": "Your own TRM Labs plan does not cover bitcoin.",
                      "error_code": "provider_key.not_entitled"
                    }
                  },
                  "rate_limited": {
                    "summary": "The provider rate-limited the business's own key",
                    "value": {
                      "status": "fail",
                      "message": "TRM Labs rate-limited your own API key. Try again later.",
                      "error_code": "provider_key.rate_limited"
                    }
                  }
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "error",
                  "code": 500,
                  "message": "Something went wrong.",
                  "error_code": "internal_error"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The business's own provider key could not be read. Only a screen on a key it connected itself.",
            "content": {
              "application/json": {
                "example": {
                  "status": "error",
                  "code": 503,
                  "message": "Something went wrong.",
                  "error_code": "internal_error"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "Addresses"
        ],
        "summary": "Retrieve Address",
        "description": "Returns an screening result for the requesting address hash or referral id.",
        "operationId": "Retrieve_an_address_api_v2_analytics_chains__chain__addresses__address__get",
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Blockchain network name.",
              "examples": [
                "bitcoin"
              ],
              "title": "Chain"
            },
            "description": "Blockchain network name."
          },
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Unique blockchain identifier.",
              "examples": [
                "1JjYpRXfPntVEJqAjxsYmvFjjJBdJyaJ2k"
              ],
              "title": "Address"
            },
            "description": "Unique blockchain identifier."
          }
        ],
        "responses": {
          "200": {
            "description": "The most recent screening result held for this address.",
            "content": {
              "application/json": {
                "schema": {},
                "example": {
                  "status": "success",
                  "data": {
                    "address": "0x88c6c46ebf353a52bdbab708c23d0c81daa8134a",
                    "chain": "ethereum",
                    "symbol": "ETH",
                    "is_self_hosted": false,
                    "financial_data": {
                      "balance": 1.24830533458673,
                      "balance_usd": 41.241
                    },
                    "risk_data": [
                      {
                        "provider_name": "RDBIG",
                        "risk_ratio": 39,
                        "risk_descriptors": [
                          "exchange_client",
                          "binance_client_deposit"
                        ],
                        "vasp_name_legal": "Binance",
                        "vasp_name_business": "binance",
                        "vasp_website": "https://www.binance.com",
                        "vasp_category": "exchange",
                        "created": "2026-08-31T09:14:22.418293+00:00"
                      }
                    ],
                    "created": "2026-08-31T09:14:22.418293"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Authentication required.",
                  "error_code": "auth.unauthenticated"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Payment required.",
                  "error_code": "billing.payment_required"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Address not found"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "error",
                  "code": 500,
                  "message": "Something went wrong.",
                  "error_code": "internal_error"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2/analytics/chains/{chain}/addresses": {
      "get": {
        "tags": [
          "Addresses"
        ],
        "summary": "List Addresses",
        "description": "Retrieve the paginated list of address screening results based on the requesting business identity",
        "operationId": "List_all_addresses_api_v2_analytics_chains__chain__addresses_get",
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "parameters": [
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Blockchain network name.",
              "example": {
                "all": {
                  "summary": "All networks",
                  "description": "All networks",
                  "value": "all"
                },
                "bitcoin": {
                  "summary": "Bitcoin network",
                  "description": "Bitcoin network",
                  "value": "bitcoin"
                }
              },
              "title": "Chain"
            },
            "description": "Blockchain network name."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1,
              "title": "Page"
            }
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 100,
              "minimum": 1,
              "default": 30,
              "title": "Size"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Sort"
            }
          },
          {
            "name": "start_range",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Start Range"
            }
          },
          {
            "name": "end_range",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date"
                },
                {
                  "type": "null"
                }
              ],
              "title": "End Range"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of screened addresses for the requesting business.",
            "content": {
              "application/json": {
                "schema": {},
                "examples": {
                  "one_page": {
                    "summary": "A page of results",
                    "description": "Paging is the nested `pagination` object, not flat top-level keys. Pass `chain=all` to list across every network.",
                    "value": {
                      "status": "success",
                      "data": {
                        "items": [
                          {
                            "id": "b7029c9d-1f8d-4bd0-81fc-ec1fa74c0caf",
                            "address": "0x88c6c46ebf353a52bdbab708c23d0c81daa8134a",
                            "chain": "ethereum",
                            "dti": "4H95J0R2X",
                            "is_self_hosted": false,
                            "risk_ratio": 39,
                            "balance_usd": 41.241,
                            "balance": 1.24830533458673,
                            "symbol": "ETH",
                            "last_modified": "2026-08-31T10:14:47.278398+00:00",
                            "created": "2026-08-31T09:14:19.671922+00:00"
                          }
                        ],
                        "pagination": {
                          "total": 1,
                          "size": 50,
                          "page": 1
                        }
                      }
                    }
                  },
                  "empty_page": {
                    "summary": "No addresses recorded",
                    "value": {
                      "status": "success",
                      "data": {
                        "items": [],
                        "pagination": {
                          "total": 0,
                          "size": 50,
                          "page": 1
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Authentication required.",
                  "error_code": "auth.unauthenticated"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Payment required.",
                  "error_code": "billing.payment_required"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Entity - Validation Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Validation error",
                  "data": [
                    {
                      "loc": [
                        "query",
                        "page"
                      ],
                      "msg": "Field required",
                      "type": "missing"
                    }
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "error",
                  "code": 500,
                  "message": "Something went wrong.",
                  "error_code": "internal_error"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/v2/analytics/verification/chains/{chain}/addresses/{address}": {
      "post": {
        "tags": [
          "Address Verification"
        ],
        "summary": "Request Wallet Verification",
        "operationId": "Request_for_wallet_verification_api_v2_analytics_verification_chains__chain__addresses__address__post",
        "security": [
          {
            "HTTPBearer": []
          }
        ],
        "parameters": [
          {
            "name": "address",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 3,
              "title": "Address"
            }
          },
          {
            "name": "chain",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 3,
              "title": "Chain"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/RequestVerificationRequestCom"
                  },
                  {
                    "type": "null"
                  }
                ],
                "title": "Params"
              },
              "examples": {
                "link_only": {
                  "summary": "Mint a link",
                  "description": "The body may be omitted entirely; the link is returned for the caller to deliver.",
                  "value": {}
                },
                "with_deprecated_email": {
                  "summary": "Mint a link, with the deprecated `email` still supplied",
                  "description": "Accepted for backwards compatibility and ignored. Ospree sends nothing to the address and does not store it; the response is identical to omitting the body.",
                  "value": {
                    "email": "wallet.holder@example.com"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "A wallet-verification link was minted.",
            "content": {
              "application/json": {
                "schema": {},
                "example": {
                  "status": "success",
                  "data": {
                    "link": "https://verify.ospree.io/acv/9f2c1d7e4b0a68350c4d1e2f3a4b5c6d"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Authentication required.",
                  "error_code": "auth.unauthenticated"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "402": {
            "description": "Payment Required",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Payment required.",
                  "error_code": "billing.payment_required"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Entity - Validation Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "fail",
                  "message": "Validation error",
                  "data": [
                    {
                      "loc": [
                        "path",
                        "address"
                      ],
                      "msg": "Field required",
                      "type": "missing"
                    }
                  ]
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiFailResponse"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "example": {
                  "status": "error",
                  "code": 500,
                  "message": "Something went wrong.",
                  "error_code": "internal_error"
                },
                "schema": {
                  "$ref": "#/components/schemas/ApiErrorResponse"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ApiErrorResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "default": "error"
          },
          "code": {
            "type": "integer",
            "title": "Code",
            "description": "Duplicates the HTTP status; use `error_code`. Removed in v3."
          },
          "message": {
            "type": "string",
            "title": "Message"
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Code",
            "description": "Stable, machine-readable error code, e.g. `auth.unauthenticated`. Additive-only."
          },
          "data": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "Data"
          }
        },
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "title": "ApiErrorResponse",
        "description": "*summary*: Api error response model"
      },
      "ApiFailResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "default": "fail"
          },
          "message": {
            "type": "string",
            "title": "Message"
          },
          "error_code": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Code",
            "description": "Stable, machine-readable error code, e.g. `auth.unauthenticated`. Additive-only."
          },
          "data": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "Data"
          }
        },
        "type": "object",
        "required": [
          "message"
        ],
        "title": "ApiFailResponse",
        "description": "*summary*: Api fail response model"
      },
      "ApiSuccessResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status",
            "default": "success"
          },
          "data": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "Data"
          }
        },
        "type": "object",
        "title": "ApiSuccessResponse",
        "description": "*summary*: Api success response model"
      },
      "RequestVerificationRequestCom": {
        "properties": {
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email",
            "description": "Deprecated and ignored. Ospree does not send anything to this address. The verification link is returned in the response body, and delivering it to the wallet holder is the caller's responsibility. Any value supplied is discarded rather than stored.",
            "deprecated": true,
            "example": "wallet.holder@example.com"
          }
        },
        "type": "object",
        "title": "RequestVerificationRequestCom"
      },
      "ScreenAddressRequestCom": {
        "properties": {
          "scan_for_risk": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Scan For Risk",
            "description": "Whether to scan for risk when creating new address",
            "default": false
          },
          "provider_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Provider Name",
            "description": "The name of the risk provider to screen with, for example `RDBIG`. Leave it out, or send `null`, to use your business's default risk provider. When sent, it must be a non-empty provider name: a blank or whitespace-only value is rejected with 422."
          },
          "is_self_hosted": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Is Self Hosted",
            "description": "Whether the wallet is self-hosted",
            "default": false
          },
          "account_ref_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Account Ref Id",
            "description": "The reference ID of the account"
          },
          "link_type": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Link Type",
            "description": "The type of link",
            "default": 1
          }
        },
        "type": "object",
        "title": "ScreenAddressRequestCom"
      }
    },
    "securitySchemes": {
      "HTTPBearer": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  },
  "tags": [
    {
      "name": "Addresses",
      "description": "Screen blockchain addresses and manage the screening results."
    },
    {
      "name": "Address Verification",
      "description": "Verify ownership of a wallet address.\n\n**Webhook delivery.** A verification that settles notifies every endpoint registered for the `ADDRESS_VERIFICATION` event family: `ADDRESS_VERIFICATION_COMPLETED` when the signature checks out, `ADDRESS_VERIFICATION_FAILED` otherwise. Delivery is **at-least-once and retried** — an endpoint that answers `5xx`, or that cannot be reached at all, is retried with exponential backoff (1s, doubling to a 120s cap) for up to 12 attempts spanning roughly 10 minutes. Every attempt of one delivery repeats the same `request_id`, so a receiver may dedupe on it. An endpoint that answers `4xx` is **not** retried: a definitive rejection cannot be changed by re-sending identical content. A delivery that exhausts the retry window is not redelivered later."
    }
  ],
  "servers": [
    {
      "url": "https://dev-api.ospree.io",
      "description": "Development"
    }
  ]
}
