> For the complete documentation index, see [llms.txt](https://docs.ospree.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ospree.io/developers/travel-rule/openapi/transfers.md).

# Transfers

Create and manage travel-rule transfers through their lifecycle.

## List Transfers

> Retrieve a paginated overview of all transfers initiated between entities, with support for filtering by VASP identifiers, blockchain addresses, transfer status, and date ranges.

```json
{"openapi":"3.1.0","info":{"title":"Ospree Travel Rule API","version":"2.0.0"},"tags":[{"name":"Transfers","description":"Create and manage travel-rule transfers through their lifecycle."}],"servers":[{"url":"https://dev-api.ospree.io","description":"Development"}],"security":[{"HTTPBearer":[]}],"components":{"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}},"schemas":{"ApiSuccessResponse_Page_ListTransfersResponse__":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/Page_ListTransfersResponse_"},{"type":"null"}]}},"type":"object","title":"ApiSuccessResponse[Page[ListTransfersResponse]]"},"Page_ListTransfersResponse_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ListTransfersResponse"},"type":"array","title":"Items"},"total":{"type":"integer","minimum":0,"title":"Total"},"page":{"type":"integer","minimum":1,"title":"Page"},"size":{"type":"integer","minimum":1,"title":"Size"},"pages":{"type":"integer","minimum":0,"title":"Pages"}},"type":"object","required":["items","total","page","size","pages"],"title":"Page[ListTransfersResponse]"},"ListTransfersResponse":{"properties":{"transfer_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Transfer Id"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"dti":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dti"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"},"originator_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Vasp Id"},"beneficiary_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Vasp Id"},"originator_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Address"},"beneficiary_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Address"},"originator_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Originator Address Is Self Hosted"},"beneficiary_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beneficiary Address Is Self Hosted"},"routing_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Routing Number"},"originator_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Account Reference Id"},"beneficiary_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Account Reference Id"},"direction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"},"transaction_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Hash"},"transfer_status":{"type":"string","title":"Transfer Status"},"transfer_type":{"anyOf":[{"$ref":"#/components/schemas/TypeTransfer"},{"type":"null"}]}},"type":"object","required":["transfer_status"],"title":"ListTransfersResponse","description":""},"TypeTransfer":{"type":"string","enum":["INSTRUCTION","RECORD"],"title":"TypeTransfer","description":"\"INSTRUCTION\" is for:\n - VASP-VASP deposits initiated by counterparty, and\n - withdrawals initiated by logged-in VASP.\n\n\"RECORD\" is for:\n - self-hosted transfers and\n - VASP-VASP deposits not initiated by counterparty."},"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"},"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"}}},"paths":{"/api/v2/travelrule/transfers":{"get":{"tags":["Transfers"],"summary":"List Transfers","description":"Retrieve a paginated overview of all transfers initiated between entities, with support for filtering by VASP identifiers, blockchain addresses, transfer status, and date ranges.","operationId":"list_transfers_api_v2_travelrule_transfers_get","parameters":[{"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":50,"title":"Size"}},{"name":"sort","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort"}},{"name":"dti","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dti"}},{"name":"beneficiary_vasp_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Vasp Id"}},{"name":"originator_address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Address"}},{"name":"beneficiary_address","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Address"}},{"name":"originator_account_reference_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Account Reference Id"}},{"name":"beneficiary_account_reference_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Account Reference Id"}},{"name":"direction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Direction"}},{"name":"transfer_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transfer Status"}},{"name":"beneficiary_account_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Account Type"}},{"name":"transaction_hash","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Hash"}},{"name":"protocol","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"string"},{"type":"null"}],"title":"End Date"}}],"responses":{"200":{"description":"A page of transfers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiSuccessResponse_Page_ListTransfersResponse__"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}}}}}}
```

## Create Transfer

> Initiate a Travel Rule transfer between crypto service providers or to a self-hosted wallet. Combines account creation, wallet address verification, and transfer initiation into a single call. Supports VASP-to-VASP withdrawals, self-hosted wallet withdrawals, and self-hosted wallet deposits.\
> \
> \`reference\_id\` is the idempotency key, scoped to your account. A request repeating a \`reference\_id\` you have already used creates nothing: it returns that original transfer unchanged and ignores the rest of the body, answering \`200 OK\` with the header \`Idempotent-Replayed: true\`. A fresh create answers \`201 Created\` and carries no such header. A request without a \`reference\_id\` never replays.\
> \
> A \`flow\` transfer whose beneficiary VASP is not active on Ospree is refused with \`422 Unprocessable Entity\`.

```json
{"openapi":"3.1.0","info":{"title":"Ospree Travel Rule API","version":"2.0.0"},"tags":[{"name":"Transfers","description":"Create and manage travel-rule transfers through their lifecycle."}],"servers":[{"url":"https://dev-api.ospree.io","description":"Development"}],"security":[{"HTTPBearer":[]}],"components":{"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}},"schemas":{"CreateTransferRequest":{"properties":{"amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Amount Usd"},"dti":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dti","description":"Digital Token Identifier (ISO 24165) of the asset being transferred, and the documented way to name it — list the accepted identifiers with GET /travelrule/tokens. Optional only because one legacy alternative is still accepted: a request that names no asset at all is rejected."},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol","description":"The rail to send this transfer over, from GET /travelrule/protocols. Required whenever the transfer resolves to an instruction. A record dispatches nothing and carries no protocol: any value sent on one is accepted and discarded, and the transfer reads back with a null protocol. A self-hosted leg has no counterparty VASP to instruct, so naming any rail other than the deprecated 'flow' on one — or naming none — is rejected unless is_record is true."},"originator_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Vasp Id"},"beneficiary_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Vasp Id"},"originator_address":{"type":"string","title":"Originator Address"},"originator_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Originator Address Is Self Hosted","description":"Declare that this transfer's originator wallet is self-hosted — nobody operates it on the sender's behalf. It describes this transfer, so the transfer reads back with exactly what you send: absent or false means this is not a self-hosted transfer, whatever any earlier transfer declared about the same wallet. A self-hosted leg can only ride a record — set is_record — and the reserved 'SLFHST' VASP ID is applied automatically, so do not send originator_vasp_id with it.","default":false},"beneficiary_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Address"},"beneficiary_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beneficiary Address Is Self Hosted","description":"Declare that this transfer's beneficiary wallet is self-hosted — nobody operates it on the recipient's behalf. It describes this transfer, so the transfer reads back with exactly what you send: absent or false means this is not a self-hosted transfer, whatever any earlier transfer declared about the same wallet. A self-hosted leg can only ride a record — set is_record — and the reserved 'SLFHST' VASP ID is applied automatically, so do not send beneficiary_vasp_id with it.","default":false},"travel_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Travel Address"},"originator_account_reference_id":{"type":"string","title":"Originator Account Reference Id"},"beneficiary_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Account Reference Id"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"transaction_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Hash"},"routing_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Routing Number"},"originator_account":{"anyOf":[{"$ref":"#/components/schemas/CreateAccountInput"},{"type":"null"}]},"beneficiary_account":{"anyOf":[{"$ref":"#/components/schemas/CreateAccountInput"},{"type":"null"}]},"transfer_type":{"anyOf":[{"$ref":"#/components/schemas/TypeTransfer"},{"type":"null"}],"description":"Deprecated and inert: the server derives the transfer type from the transfer's shape. Any value sent is accepted and discarded — it never reaches the persisted transfer."},"is_record":{"type":"boolean","title":"Is Record","description":"Book this transfer as a unilateral record rather than an instruction to a counterparty: nothing is dispatched and only the creating tenant ever sees it. A record carries no protocol — send none, and any value sent is discarded. True narrows the derived transfer type to RECORD; false or absent defers to the derivation, and it can never promote a derived RECORD to an INSTRUCTION. Use it for a self-recorded VASP-VASP deposit, and for a self-hosted leg: naming originator_vasp_id, or a self-hosted address, with protocol 'flow' and no is_record is the deprecated spelling of the same thing. On a self-hosted leg it is the only spelling under any other rail, or under none — those are rejected.","default":false},"response_timeout":{"anyOf":[{"type":"string","format":"duration"},{"type":"null"}],"title":"Response Timeout"}},"type":"object","required":["amount","originator_address","originator_account_reference_id"],"title":"CreateTransferRequest","description":"POST /travelrule/transfers"},"CreateAccountInput":{"properties":{"reference_id":{"anyOf":[{"type":"string","maxLength":50,"minLength":4},{"type":"null"}],"title":"Reference Id","description":"Unique identifier for the account."},"account_type":{"$ref":"#/components/schemas/AccountType","description":"Type of account, either 'individual' or 'entity'."},"account_category":{"anyOf":[{"$ref":"#/components/schemas/AccountCategory"},{"type":"null"}],"description":"Account category, defaults to 'customer'","default":"customer"},"customer_id":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Customer Id","description":"Customer ID associated with the account."},"email":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Email","description":"Email address of the account holder."},"individual":{"anyOf":[{"$ref":"#/components/schemas/IndividualDetails"},{"type":"null"}]},"entity":{"anyOf":[{"$ref":"#/components/schemas/EntityDetails"},{"type":"null"}]},"address":{"anyOf":[{"$ref":"#/components/schemas/AddressDetails"},{"type":"null"}]},"national_id":{"anyOf":[{"$ref":"#/components/schemas/NationalIdDetails"},{"type":"null"}]},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created"},"last_modified":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Modified"},"account_role":{"anyOf":[{"$ref":"#/components/schemas/AccountRole"},{"type":"null"}],"description":"Optional role this account plays in a transfer. When set to 'beneficiary', the 'must have at least one identifying field' check is skipped to match IVMS101 rules (constraint C1 applies only to the originator's natural person)."}},"type":"object","required":["account_type"],"title":"CreateAccountInput"},"AccountType":{"type":"string","enum":["individual","entity"],"title":"AccountType"},"AccountCategory":{"type":"string","enum":["customer","non-customer"],"title":"AccountCategory"},"IndividualDetails":{"properties":{"individual_name":{"$ref":"#/components/schemas/IndividualName","description":"Object that contains the individual name fields"},"individual_localname":{"anyOf":[{"$ref":"#/components/schemas/IndividualName"},{"type":"null"}],"description":"Object that contains the individual local name fields"},"other_names":{"anyOf":[{"items":{"$ref":"#/components/schemas/OtherIndividualName"},"type":"array"},{"type":"null"}],"title":"Other Names","description":"Alias (ALIA), birth (BIRT) and maiden (MAID) names of the account holder."},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth","description":"Date of birth of the account holder."},"place_of_birth":{"anyOf":[{"type":"string","maxLength":70},{"type":"null"}],"title":"Place Of Birth","description":"Place of birth of the account holder."},"nationality_country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Nationality Country","description":"Country code of the nationality of the account holder."},"residence_country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Residence Country","description":"Country code of the place of residence of the account holder."}},"type":"object","required":["individual_name"],"title":"IndividualDetails"},"IndividualName":{"properties":{"name_type":{"$ref":"#/components/schemas/NameType"},"name_first":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name First","description":"First name of the account holder."},"name_middle":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name Middle","description":"Middle name of the account holder."},"name_last":{"type":"string","maxLength":100,"title":"Name Last","description":"Last name of the account holder. Required if account_type is individual."}},"type":"object","required":["name_type","name_last"],"title":"IndividualName"},"NameType":{"type":"string","enum":["LEGL"],"title":"NameType"},"OtherIndividualName":{"properties":{"name_type":{"$ref":"#/components/schemas/OtherNameType"},"name_first":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name First","description":"Secondary identifier of the name."},"name_last":{"type":"string","maxLength":100,"title":"Name Last","description":"Primary identifier of the name."}},"type":"object","required":["name_type","name_last"],"title":"OtherIndividualName","description":"An alias (ALIA), birth (BIRT) or maiden (MAID) name of the account holder."},"OtherNameType":{"type":"string","enum":["ALIA","BIRT","MAID"],"title":"OtherNameType"},"EntityDetails":{"properties":{"entity_name":{"$ref":"#/components/schemas/EntityName","description":"The object that contains the entity name fields."},"entity_localname":{"anyOf":[{"$ref":"#/components/schemas/EntityName"},{"type":"null"}],"description":"The object that contains the entity local name fields."},"registration_country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Registration Country","description":"Country code of incorporation for the business."}},"type":"object","required":["entity_name"],"title":"EntityDetails"},"EntityName":{"properties":{"name_type":{"$ref":"#/components/schemas/NameType"},"name_legal":{"type":"string","maxLength":100,"title":"Name Legal","description":"Name of the business. Required if account_type is entity."},"name_business":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name Business","description":"Short name of the business (SHRT)."},"name_trading":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Name Trading","description":"Trading name of the business (TRAD)."}},"type":"object","required":["name_type","name_legal"],"title":"EntityName"},"AddressDetails":{"properties":{"address_type":{"$ref":"#/components/schemas/AddressType"},"address_line":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}],"title":"Address Line","description":"Free-form address lines. A value you submit is limited to 256 characters at runtime; the field holds up to 512 so that an address a counterparty declares (up to seven 70-character IVMS101 addressLine entries) is kept whole."},"address_street_no":{"anyOf":[{"type":"string","maxLength":16},{"type":"null"}],"title":"Address Street No"},"address_street_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Address Street Name"},"address_building_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Address Building Name"},"address_floor":{"anyOf":[{"type":"string","maxLength":70},{"type":"null"}],"title":"Address Floor"},"address_room":{"anyOf":[{"type":"string","maxLength":70},{"type":"null"}],"title":"Address Room"},"address_department":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Address Department"},"address_subdepartment":{"anyOf":[{"type":"string","maxLength":70},{"type":"null"}],"title":"Address Subdepartment"},"address_postbox":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Address Postbox"},"address_city_location":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Address City Location"},"address_city":{"type":"string","maxLength":50,"title":"Address City"},"address_region":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Address Region"},"address_district":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Address District"},"address_postcode":{"anyOf":[{"type":"string","maxLength":25},{"type":"null"}],"title":"Address Postcode"},"address_country_code":{"type":"string","maxLength":2,"title":"Address Country Code"}},"type":"object","required":["address_type","address_city","address_country_code"],"title":"AddressDetails"},"AddressType":{"type":"string","enum":["HOME","BIZZ","GEOG"],"title":"AddressType"},"NationalIdDetails":{"properties":{"national_id_type":{"$ref":"#/components/schemas/NationalIdType","description":"Required when national_id object is specified. Type of national identification."},"national_id":{"type":"string","maxLength":35,"title":"National Id","description":"National identification number."},"issue_country":{"anyOf":[{"type":"string","maxLength":2},{"type":"null"}],"title":"Issue Country","description":"Country that issued the national identification."},"registration_authority":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Registration Authority","description":"GLEIF Registration Authority code of the register that issued the national identification: `RA` followed by six digits, e.g. `RA000583`. This is the register's code, not the authority's name. Required for entity national IDs other than `LEIX`, and must be omitted for `LEIX`. Case-insensitive; normalised to upper case."}},"type":"object","required":["national_id_type","national_id"],"title":"NationalIdDetails"},"NationalIdType":{"type":"string","enum":["ARNU","CCPT","RAID","DRLC","FIIN","TXID","SOCS","IDCD","LEIX","MISC"],"title":"NationalIdType"},"AccountRole":{"type":"string","enum":["originator","beneficiary"],"title":"AccountRole","description":"The role this account plays in a transfer.\n\nUsed to scope validation: per IVMS101 (constraint C1), only the originator's\nnatural person is required to provide at least one of address / customer ID /\nnational ID / date+place of birth. The beneficiary may have only a name."},"TypeTransfer":{"type":"string","enum":["INSTRUCTION","RECORD"],"title":"TypeTransfer","description":"\"INSTRUCTION\" is for:\n - VASP-VASP deposits initiated by counterparty, and\n - withdrawals initiated by logged-in VASP.\n\n\"RECORD\" is for:\n - self-hosted transfers and\n - VASP-VASP deposits not initiated by counterparty."},"ApiSuccessResponse_CreateTransferResponse_":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/CreateTransferResponse"},{"type":"null"}]}},"type":"object","title":"ApiSuccessResponse[CreateTransferResponse]"},"CreateTransferResponse":{"properties":{"transfer_id":{"type":"string","format":"uuid","title":"Transfer Id"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"amount":{"type":"number","title":"Amount"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"dti":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dti"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"},"originator_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Vasp Id"},"beneficiary_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Vasp Id"},"originator_address":{"type":"string","title":"Originator Address"},"beneficiary_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Address"},"originator_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Originator Address Is Self Hosted"},"beneficiary_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beneficiary Address Is Self Hosted"},"routing_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Routing Number"},"originator_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Account Reference Id"},"beneficiary_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Account Reference Id"},"transaction_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Hash"},"transfer_status":{"type":"string","title":"Transfer Status"},"transfer_type":{"$ref":"#/components/schemas/TypeTransfer"},"amount_str":{"type":"string","title":"Amount Str","description":"Exact decimal-string form of the stored Display Amount.\n\nAdditive, output-only. The numeric ``amount`` is display-precision\nlimited (serialized as a JSON number for backwards compatibility);\n``amount_str`` is the precision-faithful field. The numeric/string\nsplit is transitional, to be consolidated in the next API version.\n\nAlways fixed-point notation, never scientific: the amount is written\nout in full at its stored scale, with no normalising, rounding or\ntrimming.","readOnly":true}},"type":"object","required":["transfer_id","amount","originator_address","transfer_status","transfer_type","amount_str"],"title":"CreateTransferResponse","description":""},"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"},"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"}}},"paths":{"/api/v2/travelrule/transfers":{"post":{"tags":["Transfers"],"summary":"Create Transfer","description":"Initiate a Travel Rule transfer between crypto service providers or to a self-hosted wallet. Combines account creation, wallet address verification, and transfer initiation into a single call. Supports VASP-to-VASP withdrawals, self-hosted wallet withdrawals, and self-hosted wallet deposits.\n\n`reference_id` is the idempotency key, scoped to your account. A request repeating a `reference_id` you have already used creates nothing: it returns that original transfer unchanged and ignores the rest of the body, answering `200 OK` with the header `Idempotent-Replayed: true`. A fresh create answers `201 Created` and carries no such header. A request without a `reference_id` never replays.\n\nA `flow` transfer whose beneficiary VASP is not active on Ospree is refused with `422 Unprocessable Entity`.","operationId":"create_transfer_api_v2_travelrule_transfers_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransferRequest"}}}},"responses":{"200":{"description":"Idempotent replay. This `reference_id` already identifies one of your transfers, so nothing was created: the original transfer is returned unchanged and the rest of the request body was ignored.","headers":{"Idempotent-Replayed":{"description":"Always `true` on an idempotent replay. Absent when the transfer was created.","schema":{"type":"string","enum":["true"]}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiSuccessResponse_CreateTransferResponse_"}}}},"201":{"description":"Transfer Created Successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiSuccessResponse_CreateTransferResponse_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"402":{"description":"Payment Required - VASP Customer Status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"422":{"description":"Unprocessable Entity - Validation and Business Logic Errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}}}}}}
```

## Get Transfer Details

> Retrieve comprehensive details about a specific Travel Rule transfer, including originator and beneficiary information, amount, timestamps, and transfer status.

```json
{"openapi":"3.1.0","info":{"title":"Ospree Travel Rule API","version":"2.0.0"},"tags":[{"name":"Transfers","description":"Create and manage travel-rule transfers through their lifecycle."}],"servers":[{"url":"https://dev-api.ospree.io","description":"Development"}],"security":[{"HTTPBearer":[]}],"components":{"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}},"schemas":{"ApiSuccessResponse_GetTransferDetailsResponse_":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/GetTransferDetailsResponse"},{"type":"null"}]}},"type":"object","title":"ApiSuccessResponse[GetTransferDetailsResponse]"},"GetTransferDetailsResponse":{"properties":{"transfer_data":{"$ref":"#/components/schemas/_TransferData"},"originator_record":{"$ref":"#/components/schemas/_Record"},"beneficiary_record":{"$ref":"#/components/schemas/_Record"},"originator_vasp":{"$ref":"#/components/schemas/_VASP"},"beneficiary_vasp":{"$ref":"#/components/schemas/_VASP"},"originator_declared_record":{"anyOf":[{"$ref":"#/components/schemas/_Record"},{"type":"null"}]},"beneficiary_declared_record":{"anyOf":[{"$ref":"#/components/schemas/_Record"},{"type":"null"}]},"originator_vasp_declared_record":{"anyOf":[{"$ref":"#/components/schemas/_VASP"},{"type":"null"}]},"beneficiary_vasp_declared_record":{"anyOf":[{"$ref":"#/components/schemas/_VASP"},{"type":"null"}]}},"type":"object","required":["transfer_data","originator_record","beneficiary_record","originator_vasp","beneficiary_vasp"],"title":"GetTransferDetailsResponse","description":""},"_TransferData":{"properties":{"transfer_id":{"type":"string","format":"uuid","title":"Transfer Id"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"amount":{"type":"number","title":"Amount"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"dti":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dti"},"chain":{"type":"string","title":"Chain"},"symbol":{"type":"string","title":"Symbol"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"},"originator_address":{"type":"string","title":"Originator Address"},"beneficiary_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Address"},"originator_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Originator Address Is Self Hosted"},"beneficiary_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beneficiary Address Is Self Hosted"},"routing_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Routing Number"},"transaction_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Hash"},"transfer_status":{"type":"string","title":"Transfer Status"},"transfer_type":{"$ref":"#/components/schemas/TypeTransfer"},"created":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created"},"created_by_desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Desc"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason","description":"Why the last outbound message for this transfer did not reach the counterparty; null when none failed"},"reject_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Error","description":"The return status the counterparty rejected this transfer with, by name (e.g. HIGH_RISK); null unless the transfer is REJECTED"},"reject_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Message","description":"The counterparty's explanation of the rejection; null unless the transfer is REJECTED"}},"type":"object","required":["transfer_id","amount","chain","symbol","protocol","originator_address","transfer_status","transfer_type"],"title":"_TransferData"},"TypeTransfer":{"type":"string","enum":["INSTRUCTION","RECORD"],"title":"TypeTransfer","description":"\"INSTRUCTION\" is for:\n - VASP-VASP deposits initiated by counterparty, and\n - withdrawals initiated by logged-in VASP.\n\n\"RECORD\" is for:\n - self-hosted transfers and\n - VASP-VASP deposits not initiated by counterparty."},"_Record":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Id"},"account_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Type"},"account_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account No"},"name_first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name First"},"name_middle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Middle"},"name_last":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Last"},"name_local_first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Local First"},"name_local_middle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Local Middle"},"name_local_last":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Local Last"},"date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Of Birth"},"place_of_birth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Place Of Birth"},"nationality_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nationality Code"},"residence_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Residence Country Code"},"name_legal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Legal"},"name_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Business"},"name_local_legal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Local Legal"},"name_local_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Local Business"},"registration_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Country Code"},"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"address_street_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Street No"},"address_street_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Street Name"},"address_building_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Building Name"},"address_floor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Floor"},"address_room":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Room"},"address_department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Department"},"address_subdepartment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Subdepartment"},"address_postbox":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Postbox"},"address_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address City"},"address_city_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address City Location"},"address_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Region"},"address_district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address District"},"address_postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Postcode"},"address_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country Code"},"national_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"National Id"},"national_id_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"National Id Type Code"},"national_id_issue_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"National Id Issue Country"},"national_id_registration_authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"National Id Registration Authority"}},"type":"object","title":"_Record"},"_VASP":{"properties":{"vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vasp Id"},"name_legal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Legal"},"name_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Business"},"name_local_legal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Local Legal"},"name_local_business":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name Local Business"},"registration_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Registration Country Code"},"address_type_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Type Code"},"address_line":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line"},"address_street_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Street No"},"address_street_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Street Name"},"address_building_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Building Name"},"address_floor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Floor"},"address_room":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Room"},"address_department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Department"},"address_subdepartment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Subdepartment"},"address_postbox":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Postbox"},"address_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address City"},"address_city_location":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address City Location"},"address_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Region"},"address_district":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address District"},"address_postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Postcode"},"address_country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country Code"},"address_country_desc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Country Desc"},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"national_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"National Id"},"national_id_issue_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"National Id Issue Country"}},"type":"object","title":"_VASP"},"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"},"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"}}},"paths":{"/api/v2/travelrule/transfers/{transfer_id}":{"get":{"tags":["Transfers"],"summary":"Get Transfer Details","description":"Retrieve comprehensive details about a specific Travel Rule transfer, including originator and beneficiary information, amount, timestamps, and transfer status.","operationId":"get_transfer_details_api_v2_travelrule_transfers__transfer_id__get","parameters":[{"name":"transfer_id","in":"path","required":true,"schema":{"type":"string","description":"System-generated identifier unique to each transfer.","title":"Transfer Id"},"description":"System-generated identifier unique to each transfer."}],"responses":{"200":{"description":"The full transfer, with both sides' records and VASPs. A counterparty's own *declared* record, when the wire carried one, sits beside ours rather than merged into it -- the disagreement between the two is the compliance artifact.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiSuccessResponse_GetTransferDetailsResponse_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}}}}}}
```

## Update Transfer

> Update the details of an existing transfer.

```json
{"openapi":"3.1.0","info":{"title":"Ospree Travel Rule API","version":"2.0.0"},"tags":[{"name":"Transfers","description":"Create and manage travel-rule transfers through their lifecycle."}],"servers":[{"url":"https://dev-api.ospree.io","description":"Development"}],"security":[{"HTTPBearer":[]}],"components":{"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}},"schemas":{"UpdateTransferRequest":{"properties":{"transaction_hash":{"type":"string","title":"Transaction Hash"}},"type":"object","required":["transaction_hash"],"title":"UpdateTransferRequest","description":""},"ApiSuccessResponse_UpdateTransferResponse_":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/UpdateTransferResponse"},{"type":"null"}]}},"type":"object","title":"ApiSuccessResponse[UpdateTransferResponse]"},"UpdateTransferResponse":{"properties":{"transfer_id":{"type":"string","format":"uuid","title":"Transfer Id"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"amount":{"type":"number","title":"Amount"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"dti":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dti"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"},"originator_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Vasp Id"},"beneficiary_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Vasp Id"},"originator_address":{"type":"string","title":"Originator Address"},"beneficiary_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Address"},"originator_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Originator Address Is Self Hosted"},"beneficiary_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beneficiary Address Is Self Hosted"},"routing_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Routing Number"},"originator_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Account Reference Id"},"beneficiary_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Account Reference Id"},"transaction_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Hash"},"transfer_status":{"type":"string","title":"Transfer Status"},"transfer_type":{"$ref":"#/components/schemas/TypeTransfer"},"amount_str":{"type":"string","title":"Amount Str","description":"Exact decimal-string form of the stored Display Amount.\n\nAdditive, output-only. The numeric ``amount`` is display-precision\nlimited (serialized as a JSON number for backwards compatibility);\n``amount_str`` is the precision-faithful field. The numeric/string\nsplit is transitional, to be consolidated in the next API version.\n\nAlways fixed-point notation, never scientific: the amount is written\nout in full at its stored scale, with no normalising, rounding or\ntrimming.","readOnly":true}},"type":"object","required":["transfer_id","amount","originator_address","transfer_status","transfer_type","amount_str"],"title":"UpdateTransferResponse","description":""},"TypeTransfer":{"type":"string","enum":["INSTRUCTION","RECORD"],"title":"TypeTransfer","description":"\"INSTRUCTION\" is for:\n - VASP-VASP deposits initiated by counterparty, and\n - withdrawals initiated by logged-in VASP.\n\n\"RECORD\" is for:\n - self-hosted transfers and\n - VASP-VASP deposits not initiated by counterparty."},"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"},"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"}}},"paths":{"/api/v2/travelrule/transfers/{transfer_id}":{"patch":{"tags":["Transfers"],"summary":"Update Transfer","description":"Update the details of an existing transfer.","operationId":"update_transfer_api_v2_travelrule_transfers__transfer_id__patch","parameters":[{"name":"transfer_id","in":"path","required":true,"schema":{"type":"string","description":"System-generated identifier unique to each transfer.","title":"Transfer Id"},"description":"System-generated identifier unique to each transfer."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTransferRequest"}}}},"responses":{"200":{"description":"The transfer was updated with its on-chain transaction hash.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiSuccessResponse_UpdateTransferResponse_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"422":{"description":"Unprocessable Entity - Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}}}}}}
```

## Action Transfer

> Perform an action on a transfer based on its current status, such as accepting, rejecting, canceling, or completing it.

```json
{"openapi":"3.1.0","info":{"title":"Ospree Travel Rule API","version":"2.0.0"},"tags":[{"name":"Transfers","description":"Create and manage travel-rule transfers through their lifecycle."}],"servers":[{"url":"https://dev-api.ospree.io","description":"Development"}],"security":[{"HTTPBearer":[]}],"components":{"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}},"schemas":{"ActionTransferStatus":{"type":"string","enum":["complete","reject","cancel","accept","repair"],"title":"ActionTransferStatus"},"ActionTransferRequest":{"properties":{"transaction_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Hash"},"reject_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reject Error"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"beneficiary_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Address","description":"Optional, `accept` only: the beneficiary Payment Address to answer the counterparty's Inquiry with, for an inbound transfer whose Inquiry named no beneficiary wallet. The wallet must already be registered against one of your own customer accounts. Supplying it on a transfer that already has one is accepted when the two agree and refused when they do not."}},"type":"object","title":"ActionTransferRequest","description":""},"ApiSuccessResponse_ActionTransferResponse_":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"data":{"anyOf":[{"$ref":"#/components/schemas/ActionTransferResponse"},{"type":"null"}]}},"type":"object","title":"ApiSuccessResponse[ActionTransferResponse]"},"ActionTransferResponse":{"properties":{"transfer_id":{"type":"string","format":"uuid","title":"Transfer Id"},"reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference Id"},"amount":{"type":"number","title":"Amount"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd"},"dti":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dti"},"chain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chain"},"symbol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Symbol"},"protocol":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Protocol"},"originator_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Vasp Id"},"beneficiary_vasp_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Vasp Id"},"originator_address":{"type":"string","title":"Originator Address"},"beneficiary_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Address"},"originator_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Originator Address Is Self Hosted"},"beneficiary_address_is_self_hosted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Beneficiary Address Is Self Hosted"},"routing_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Routing Number"},"originator_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Originator Account Reference Id"},"beneficiary_account_reference_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Beneficiary Account Reference Id"},"transaction_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Hash"},"transfer_status":{"type":"string","title":"Transfer Status"},"transfer_type":{"$ref":"#/components/schemas/TypeTransfer"},"failure_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Failure Reason","description":"Why the last outbound message for this transfer did not reach the counterparty; null when none failed"},"amount_str":{"type":"string","title":"Amount Str","description":"Exact decimal-string form of the stored Display Amount.\n\nAdditive, output-only. The numeric ``amount`` is display-precision\nlimited (serialized as a JSON number for backwards compatibility);\n``amount_str`` is the precision-faithful field. The numeric/string\nsplit is transitional, to be consolidated in the next API version.\n\nAlways fixed-point notation, never scientific: the amount is written\nout in full at its stored scale, with no normalising, rounding or\ntrimming.","readOnly":true}},"type":"object","required":["transfer_id","amount","originator_address","transfer_status","transfer_type","amount_str"],"title":"ActionTransferResponse","description":"The action's answer, including whether the transfer's last message left.\n\n``failure_reason`` is what stops an ``accept``/``reject`` whose Inquiry\nResolution never reached the counterparty from reading as unqualified success:\nthe local transition stands — a transient callback failure must not undo a\nsettlement that is already real on-chain — but the body says the resolution is\nundelivered, and why (issue #1093).\n\nIt is the *transfer's* last recorded send failure, the same value both detail\nsurfaces carry, and it is deliberately not phrased as \"this action's\": nothing\nclears it, so an action that sends cleanly over a transfer whose earlier message\nfailed still reports that earlier failure. Claiming otherwise in the description\nwould be the quiet kind of wrong this field exists to remove."},"TypeTransfer":{"type":"string","enum":["INSTRUCTION","RECORD"],"title":"TypeTransfer","description":"\"INSTRUCTION\" is for:\n - VASP-VASP deposits initiated by counterparty, and\n - withdrawals initiated by logged-in VASP.\n\n\"RECORD\" is for:\n - self-hosted transfers and\n - VASP-VASP deposits not initiated by counterparty."},"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"},"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"}}},"paths":{"/api/v2/travelrule/transfers/{transfer_id}/{action}":{"patch":{"tags":["Transfers"],"summary":"Action Transfer","description":"Perform an action on a transfer based on its current status, such as accepting, rejecting, canceling, or completing it.","operationId":"action_transfer_api_v2_travelrule_transfers__transfer_id___action__patch","parameters":[{"name":"transfer_id","in":"path","required":true,"schema":{"type":"string","description":"System-generated identifier unique to each transfer.","title":"Transfer Id"},"description":"System-generated identifier unique to each transfer."},{"name":"action","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ActionTransferStatus","description":"Action to apply to the transfer, such as accept, reject, cancel, or complete."},"description":"Action to apply to the transfer, such as accept, reject, cancel, or complete."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ActionTransferRequest"},{"type":"null"}],"title":"Action Input"}}}},"responses":{"200":{"description":"The lifecycle action was applied; the body reports the landed status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiSuccessResponse_ActionTransferResponse_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"422":{"description":"Validation and Business Logic Errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiFailResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorResponse"}}}}}}}}}
```
