| layout | page |
|---|---|
| title | TAP Messages |
| permalink | /messages/ |
- Common DIDComm Message Structure
- Transaction Message
- Authorization Flow Messages
- Participant Management Messages
- Relationship proofs
- Policy messages
- Connection Messages
- Data Elements
- Message Flow Examples
This document defines the message types and data structures used in the Transaction Authorization Protocol (TAP). All messages follow the DIDComm Messaging specification and use JSON-LD for data representation. See TAIP-2.
All TAP messages follow the DIDComm v2 message structure with these common attributes:
| Attribute | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Unique message identifier (UUIDv4) |
| type | string | Yes | Message type URI in the https://tap.rsvp/taips/N namespace |
| from | string | Yes | DID of the sender |
| to | array | Yes | Array of recipient DIDs |
| thid | string | No | Thread identifier (defaults to id if not provided) |
| pthid | string | No | Parent thread identifier |
| body | object | Yes | Message payload as JSON-LD |
| created_time | number | Yes | Unix timestamp of message creation |
| expires_time | number | No | Unix timestamp when message expires |
TAIP-3 - Review
Initiates a virtual asset transfer between parties.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-3) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-3) | JSON-LD type "https://tap.rsvp/schema/1.0#Transfer" |
| asset | string | Yes | Review (TAIP-3) | CAIP-19 identifier of the asset |
| amount | string | Yes | Review (TAIP-3) | Decimal amount of the asset |
| originator | Party | No | Review (TAIP-3) | Party for the sender |
| beneficiary | Party | No | Review (TAIP-3) | Party for the recipient |
| agents | array of Agent | Yes | Review (TAIP-3) | Array of Agents |
| settlementId | string | No | Review (TAIP-3) | CAIP-220 identifier of settlement transaction |
| memo | string | No | Review (TAIP-3) | Human readable message about the transfer |
| purpose | string | No | Draft (TAIP-13) | ISO 20022 purpose code indicating the reason for the transfer |
| categoryPurpose | string | No | Draft (TAIP-13) | ISO 20022 category purpose code for high-level classification |
| expiry | string | No | Review (TAIP-3) | ISO 8601 datetime indicating when the transfer request expires |
| policies | array of Policy | No | Review (TAIP-3) | Array of policy objects defining requirements for the transaction |
This example demonstrates agents with and without the optional role parameter.
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"type": "https://tap.rsvp/schema/1.0#Transfer",
"from": "did:web:originator.vasp",
"to": ["did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/slip44:60",
"originator": {
"@id": "did:web:originator.sample"
},
"amount": "1.23",
"agents": [
{
"@id": "did:web:originator.sample",
"for": "did:web:originator.sample"
},
{
"@id": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"role": "SettlementAddress"
}
]
}
}{
"id": "123e4567-e89b-12d3-a456-426614174001",
"type": "https://tap.rsvp/schema/1.0#Transfer",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"body": {
"@context": {
"@vocab": "https://tap.rsvp/schema/1.0",
"lei": "https://schema.org/leiCode"
},
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/slip44:60",
"amount": "1.23",
"originator": {
"@id": "did:org:acmecorp",
"@type": "https://schema.org/Organization",
"lei:leiCode": "3M5E1GQKGL17HI8CPN20",
"name": "ACME Corporation"
},
"beneficiary": {
"@id": "did:eg:alice",
"@type": "https://schema.org/Person"
},
"agents": [
{
"@id": "did:web:originator.vasp",
"@type": "https://schema.org/Organization",
"for": "did:org:acmecorp",
"role": "CustodialService",
"name": "Originator VASP Services",
"url": "https://originator.vasp",
"description": "Licensed Virtual Asset Service Provider",
"email": "compliance@originator.vasp"
},
{
"@id": "did:web:beneficiary.vasp",
"for": "did:eg:alice",
"role": "CustodialService"
}
]
}
}TAIP-14 - Review
Initiates a payment request from a merchant to a customer.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-14) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-14) | JSON-LD type "https://tap.rsvp/schema/1.0#Payment" |
| asset | string | No | Review (TAIP-14) | CAIP-19 identifier of the asset to be paid. Either asset OR currency is required. |
| currency | string | No | Review (TAIP-14) | ISO 4217 currency code for fiat amount. Either asset OR currency is required. |
| amount | string | Yes | Review (TAIP-14) | Amount requested in the specified asset or currency |
| supportedAssets | array | No | Review (TAIP-14) | Array of CAIP-19 asset identifiers, DTI identifiers, or pricing objects that can be used to settle a fiat currency amount. Supports both simple strings and pricing objects with amount and optional expiration for non-1:1 exchange rates. |
| fallbackSettlementAddresses | array | No | Review (TAIP-14) | Array of alternative settlement addresses in either CAIP-10 or RFC 8905 format for redundancy |
| invoice | object or string | No | Review (TAIP-14, TAIP-16) | Invoice object as defined in TAIP-16 or URI to an invoice document |
| expiry | string | No | Review (TAIP-14) | ISO 8601 timestamp when the request expires |
| merchant | Party | Yes | Review (TAIP-14) | Party for the merchant (beneficiary) |
| customer | Party | No | Review (TAIP-14) | Party for the customer (originator) |
| agents | array of Agent | Yes | Review (TAIP-14) | Array of agents involved in the payment request |
| policies | array of Policy | No | Review (TAIP-14) | Array of policy objects defining requirements that must be satisfied by the customer's agent |
{
"id": "123e4567-e89b-12d3-a456-426614174014",
"type": "https://tap.rsvp/schema/1.0#Payment",
"from": "did:web:merchant.vasp",
"to": ["did:web:customer.vasp"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Payment",
"asset": "eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"amount": "100.00",
"merchant": {
"@id": "did:web:merchant.vasp",
"name": "Example Store",
"mcc": "5812"
},
"invoice": "https://example.com/invoice/123",
"agents": [
{
"@id": "did:web:merchant.vasp",
"for": "did:web:merchant.vasp",
"role": "CustodialService"
}
]
}
}{
"id": "123e4567-e89b-12d3-a456-426614174015",
"type": "https://tap.rsvp/schema/1.0#Payment",
"from": "did:web:merchant.vasp",
"to": ["did:web:customer.vasp"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Payment",
"currency": "USD",
"amount": "50.00",
"supportedAssets": [
"eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F"
],
"merchant": {
"@id": "did:web:merchant.vasp",
"name": "Example Store"
},
"expiry": "2024-04-21T12:00:00Z",
"invoice": {
"id": "INV001",
"issueDate": "2023-02-15",
"currencyCode": "USD",
"lineItems": [
{
"id": "1",
"description": "Widget A",
"quantity": 2,
"unitCode": "EA",
"unitPrice": 20.00,
"lineTotal": 40.00
}
],
"total": 40.00,
"subTotal": 40.00,
"dueDate": "2023-03-15",
"paymentTerms": "Net 30"
},
"agents": [
{
"@id": "did:web:merchant.vasp",
"for": "did:web:merchant.vasp",
"policies": [
{
"@type": "RequirePresentation",
"@context": ["https://schema.org/Person"],
"fromAgent": "originator",
"aboutParty": "originator",
"presentationDefinition": "https://tap.rsvp/presentation-definitions/email/v1"
}
]
}
]
}
}{
"id": "123e4567-e89b-12d3-a456-426614174016",
"type": "https://tap.rsvp/schema/1.0#Payment",
"from": "did:web:merchant.vasp",
"to": ["did:web:customer.vasp"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Payment",
"currency": "EUR",
"amount": "250.00",
"supportedAssets": [
"eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"eip155:137/erc20:0x2791Bca1f2de4661ED88A30C2A8A6b5E7C54fD3A"
],
"fallbackSettlementAddresses": [
"eip155:137:0x8B5e7A2C3f4D1E6F9A0b3C5e7D9f1A2B4C6E8F0A",
"payto://iban/DE89370400440532013000",
"payto://sepa/DE75512108001245126199"
],
"merchant": {
"@id": "did:web:merchant.vasp",
"name": "Digital Goods Store",
"url": "https://digitalgoods.example.com",
"logo": "https://digitalgoods.example.com/logo.svg",
"description": "Leading marketplace for digital assets and NFTs",
"email": "support@digitalgoods.example.com",
"telephone": "+1-555-0123",
"mcc": "5734"
},
"expiry": "2025-07-30T14:30:00Z",
"agents": [
{
"@id": "did:web:merchant.vasp",
"for": "did:web:merchant.vasp"
},
{
"@id": "did:web:merchant-psp",
"for": "did:web:merchant.vasp"
}
]
}
}{
"id": "01234567-89ab-cdef-0123-456789abcdef",
"type": "https://tap.rsvp/schema/1.0#Payment",
"from": "did:web:merchant.vasp",
"to": ["did:web:customer.vasp"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Payment",
"currency": "USD",
"amount": "100.00",
"supportedAssets": [
"eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
{
"asset": "EUR",
"amount": "92.50",
"expires": "2025-09-05T15:30:00Z"
},
{
"asset": "eip155:1/erc20:0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
"amount": "0.0025",
"expires": "2025-09-05T15:15:00Z"
}
],
"fallbackSettlementAddresses": [
"payto://iban/DE75512108001245126199"
],
"merchant": {
"@id": "did:web:merchant.vasp",
"name": "Global Marketplace"
},
"expiry": "2025-09-05T16:00:00Z",
"agents": [
{
"@id": "did:web:merchant.vasp",
"for": "did:web:merchant.vasp"
}
]
}
}[TAIP-18] - Draft
Requests a quote for exchanging assets between different types or chains. Enables cross-asset quotes (e.g., USDC to EURC, USD to USDC).
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft ([TAIP-18]) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft ([TAIP-18]) | JSON-LD type "https://tap.rsvp/schema/1.0#Exchange" |
| fromAssets | array of string | Yes | Draft ([TAIP-18]) | Available source assets (CAIP-19, DTI, or ISO-4217 currency codes) |
| toAssets | array of string | Yes | Draft ([TAIP-18]) | Desired target assets (CAIP-19, DTI, or ISO-4217 currency codes) |
| fromAmount | string | No | Draft ([TAIP-18]) | Amount of source asset to exchange. Either fromAmount or toAmount must be provided |
| toAmount | string | No | Draft ([TAIP-18]) | Amount of target asset desired. Either fromAmount or toAmount must be provided |
| requester | Party | Yes | Draft ([TAIP-18]) | Party requesting the exchange |
| provider | Party | No | Draft ([TAIP-18]) | Optional preferred liquidity provider. When omitted, Exchange can be broadcast to multiple providers |
| agents | array of Agent | Yes | Draft ([TAIP-18]) | Array of agents involved in the exchange request |
| policies | array of Policy | No | Draft ([TAIP-18]) | Optional compliance or presentation requirements |
{
"id": "exchange-request-123",
"type": "https://tap.rsvp/schema/1.0#Exchange",
"from": "did:web:wallet.example",
"to": ["did:web:lp.example"],
"created_time": 1719226800,
"expires_time": 1719313200,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Exchange",
"fromAssets": ["eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"],
"toAssets": ["eip155:1/erc20:0xB00b00b00b00b00b00b00b00b00b00b00b00b00b"],
"fromAmount": "1000.00",
"requester": {
"@id": "did:web:business.example",
"@type": "https://schema.org/Organization",
"name": "Example Business"
},
"provider": {
"@id": "did:web:liquidity.provider",
"@type": "https://schema.org/Organization",
"name": "LP Corp"
},
"agents": [
{
"@id": "did:web:wallet.example",
"for": "did:web:business.example",
"role": "requester"
},
{
"@id": "did:web:lp.example",
"for": "did:web:liquidity.provider",
"role": "provider"
}
]
}
}[TAIP-18] - Draft
Response to an Exchange request providing pricing and terms. Sent by liquidity providers or orchestrators with specific rates.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft ([TAIP-18]) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft ([TAIP-18]) | JSON-LD type "https://tap.rsvp/schema/1.0#Quote" |
| fromAsset | string | Yes | Draft ([TAIP-18]) | Source asset for the exchange (CAIP-19, DTI, or ISO-4217 currency code) |
| toAsset | string | Yes | Draft ([TAIP-18]) | Target asset for the exchange (CAIP-19, DTI, or ISO-4217 currency code) |
| fromAmount | string | Yes | Draft ([TAIP-18]) | Amount of source asset to be exchanged |
| toAmount | string | Yes | Draft ([TAIP-18]) | Amount of target asset to be received |
| provider | Party | Yes | Draft ([TAIP-18]) | Liquidity provider party information |
| agents | array of Agent | Yes | Draft ([TAIP-18]) | Array of agents involved in the quote |
| expiresAt | string | Yes | Draft ([TAIP-18]) | ISO 8601 timestamp when quote expires |
{
"id": "quote-456",
"type": "https://tap.rsvp/schema/1.0#Quote",
"from": "did:web:lp.example",
"to": ["did:web:wallet.example"],
"thid": "exchange-request-123",
"created_time": 1719226850,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Quote",
"fromAsset": "eip155:1/erc20:0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"toAsset": "eip155:1/erc20:0xB00b00b00b00b00b00b00b00b00b00b00b00b00b",
"fromAmount": "1000.00",
"toAmount": "908.50",
"provider": {
"@id": "did:web:liquidity.provider",
"@type": "https://schema.org/Organization",
"name": "LP Corp"
},
"agents": [
{
"@id": "did:web:wallet.example",
"for": "did:web:business.example",
"role": "requester"
},
{
"@id": "did:web:lp.example",
"for": "did:web:liquidity.provider",
"role": "provider"
}
],
"expiresAt": "2025-07-21T00:00:00Z"
}
}[TAIP-17] - Draft
Requests an agent to hold assets in escrow on behalf of parties, enabling payment guarantees and asset swaps.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft ([TAIP-17]) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft ([TAIP-17]) | JSON-LD type "https://tap.rsvp/schema/1.0#Escrow" |
| asset | string | No | Draft ([TAIP-17]) | CAIP-19 identifier for the specific cryptocurrency asset. Either asset OR currency must be present |
| currency | string | No | Draft ([TAIP-17]) | ISO 4217 currency code for fiat-denominated escrows. Either asset OR currency must be present |
| amount | string | Yes | Draft ([TAIP-17]) | Amount to be held in escrow (decimal string) |
| originator | Party | Yes | Draft ([TAIP-17]) | Party whose assets will be placed in escrow |
| beneficiary | Party | Yes | Draft ([TAIP-17]) | Party who will receive the assets when released |
| expiry | string | Yes | Draft ([TAIP-17]) | ISO 8601 timestamp after which the escrow automatically expires |
| agreement | string | No | Draft ([TAIP-17]) | URL or URI referencing the terms and conditions of the escrow |
| agents | array of Agent | Yes | Draft ([TAIP-17]) | Array of agents involved in the escrow. Exactly one agent MUST have role "EscrowAgent" |
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"type": "https://tap.rsvp/schema/1.0#Escrow",
"from": "did:web:merchant.example",
"to": ["did:web:paymentprocessor.example"],
"created_time": 1719226800,
"expires_time": 1719313200,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Escrow",
"asset": "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"amount": "100.00",
"originator": {
"@id": "did:eg:customer"
},
"beneficiary": {
"@id": "did:web:merchant.example"
},
"expiry": "2025-06-25T00:00:00Z",
"agreement": "https://merchant.example/order/12345/terms",
"agents": [
{
"@id": "did:web:merchant.example",
"for": "did:web:merchant.example"
},
{
"@id": "did:web:paymentprocessor.example",
"role": "EscrowAgent"
},
{
"@id": "did:web:customer.wallet",
"for": "did:eg:customer"
}
]
}
}{
"id": "789e0123-e89b-12d3-a456-426614174003",
"type": "https://tap.rsvp/schema/1.0#Escrow",
"from": "did:web:marketplace.example",
"to": ["did:web:escrow.bank"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Escrow",
"currency": "USD",
"amount": "500.00",
"originator": {
"@id": "did:eg:buyer"
},
"beneficiary": {
"@id": "did:eg:seller"
},
"expiry": "2025-07-01T00:00:00Z",
"agreement": "https://marketplace.example/purchase/98765",
"agents": [
{
"@id": "did:web:marketplace.example",
"for": "did:eg:seller"
},
{
"@id": "did:web:buyer.bank",
"for": "did:eg:buyer"
},
{
"@id": "did:web:escrow.bank",
"role": "EscrowAgent"
}
]
}
}TAIP-4 - Review
An agent can require that an end user opens up an authorization URL in a web browser or app before proceeding with the transaction. An agent may require this to ensure that the end user authorizes a payment.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-4) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-4) | JSON-LD type "https://tap.rsvp/schema/1.0#AuthorizationRequired" |
| authorizationUrl | string | Yes | Review (TAIP-4) | URL where the user can authorize the transaction |
| expires | string | Yes | Review (TAIP-4) | ISO 8601 timestamp when the authorization URL expires |
| from | string | No | Review (TAIP-4) | Optional party type (e.g., "customer", "principal", or "originator") that is required to open the URL |
Note: The message refers to the original Transfer or Payment message via the DIDComm
thid(thread ID) in the message envelope.
{
"id": "123e4567-e89b-12d3-a456-426614174001",
"type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"authorizationUrl": "https://beneficiary.vasp/authorize?request=abc123",
"expires": "2024-01-01T12:00:00Z",
"from": "customer"
}
}TAIP-4 - Review
Approves a transaction after completing compliance checks.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-4) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-4) | JSON-LD type "https://tap.rsvp/schema/1.0#Authorize" |
| settlementAddress | string | No | Review (TAIP-4) | Optional settlement address in either CAIP-10 or RFC 8905 format |
| settlementAsset | string | No | Review (TAIP-4) | Optional CAIP-19 identifier for the settlement asset |
| amount | string | No | Review (TAIP-4) | Optional decimal amount authorized of the settlementAsset |
| expiry | string | No | Review (TAIP-4) | ISO 8601 datetime indicating when the authorization expires |
Note: The message refers to the original Transfer message via the DIDComm
thid(thread ID) in the message envelope.
{
"id": "123e4567-e89b-12d3-a456-426614174002",
"type": "https://tap.rsvp/schema/1.0#Authorize",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Authorize",
"settlementAddress": "eip155:1:0x742d35Cc6634C0532925a3b844Bc9e7595f1234"
}
}{
"id": "123e4567-e89b-12d3-a456-426614174003",
"type": "https://tap.rsvp/schema/1.0#Authorize",
"from": "did:web:beneficiary.bank",
"to": ["did:web:originator.bank"],
"thid": "123e4567-e89b-12d3-a456-426614174001",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Authorize",
"settlementAddress": "payto://iban/DE75512108001245126199",
"expiry": "2024-01-01T12:00:00Z"
}
}TAIP-4 - Review
Confirms the on-chain settlement of a transfer.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-4) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-4) | JSON-LD type "https://tap.rsvp/schema/1.0#Settle" |
| settlementAddress | string | Yes | Review (TAIP-4) | Destination address of the transaction in either CAIP-10 or RFC 8905 format |
| settlementId | string | No | Review (TAIP-4) | Optional CAIP-220 identifier of the settlement transaction on a blockchain |
| amount | string | No | Review (TAIP-4) | Optional settled amount, must be less than or equal to the original amount. If a Authorize message specified an amount, this must match that value. |
Note: The message refers to the original Transfer or Payment message via the DIDComm
thid(thread ID) in the message envelope.
{
"id": "123e4567-e89b-12d3-a456-426614174006",
"type": "https://tap.rsvp/schema/1.0#Settle",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Settle",
"settlementAddress": "eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"settlementId": "eip155:1:tx/0x3edb98c24d46d148eb926c714f4fbaa117c47b0c0821f38bfce9763604457c33"
}
}{
"id": "123e4567-e89b-12d3-a456-426614174007",
"type": "https://tap.rsvp/schema/1.0#Settle",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Settle",
"settlementAddress": "payto://iban/DE75512108001245126199",
"amount": "1000.00"
}
}Example with amount field:
{
"id": "123e4567-e89b-12d3-a456-426614174008",
"type": "https://tap.rsvp/schema/1.0#Settle",
"from": "did:web:customer.vasp",
"to": ["did:web:merchant.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174014",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Settle",
"settlementId": "eip155:1:tx/0x3edb98c24d46d148eb926c714f4fbaa117c47b0c0821f38bfce9763604457c33",
"amount": "95.50"
}
}TAIP-4 - Review
Rejects a proposed transfer.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-4) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-4) | JSON-LD type "https://tap.rsvp/schema/1.0#Reject" |
| reason | string | Yes | Review (TAIP-4) | Reason for rejection |
Note: The message refers to the original Transfer message via the DIDComm
thid(thread ID) in the message envelope.
{
"id": "123e4567-e89b-12d3-a456-426614174003",
"type": "https://tap.rsvp/schema/1.0#Reject",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Reject",
"reason": "Beneficiary account is not active"
}
}TAIP-4 - Review
Terminates an existing transaction or connection. When used with transactions, it signals a voluntary termination by one of the parties. When used with connections, it terminates the ongoing relationship.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-4) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-4) | JSON-LD type "https://tap.rsvp/schema/1.0#Cancel" |
| by | string | Yes | Review (TAIP-4) | The party of the transaction wishing to cancel it (e.g., "originator" or "beneficiary" for Transfer messages) |
| reason | string | No | Review (TAIP-4) | Human readable reason for cancellation |
{
"id": "fedcba98-e89b-12d3-a456-426614174004",
"type": "https://tap.rsvp/schema/1.0#Cancel",
"from": "did:example:vasp",
"to": ["did:example:b2b-service"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"created_time": 1516269025,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Cancel",
"by": "originator",
"reason": "user_requested"
}
}TAIP-4 - Review
Requests a reversal of a settled transaction. This could be part of a dispute resolution, post-transaction compliance checks, or other reasons. The reversal request can be Settled, Authorized, Rejected, or simply ignored by other agents.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-4) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-4) | JSON-LD type "https://tap.rsvp/schema/1.0#Revert" |
| settlementAddress | string | Yes | Review (TAIP-4) | Settlement address to return funds to in either CAIP-10 or RFC 8905 format |
| reason | string | Yes | Review (TAIP-4) | Human readable message describing why the transaction reversal is being requested |
Note: The message refers to the original Transfer message via the DIDComm
thid(thread ID) in the message envelope.
{
"id": "123e4567-e89b-12d3-a456-426614174005",
"type": "https://tap.rsvp/schema/1.0#Revert",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Revert",
"settlementAddress": "eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"reason": "Insufficient Originator Information"
}
}{
"id": "123e4567-e89b-12d3-a456-426614174008",
"type": "https://tap.rsvp/schema/1.0#Revert",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Revert",
"settlementAddress": "payto://iban/DE75512108001245126199",
"reason": "Compliance check failed - missing required documentation"
}
}[TAIP-17] - Draft
Authorizes the release of escrowed funds to the beneficiary. Only agents acting for the beneficiary can send this message.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft ([TAIP-17]) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft ([TAIP-17]) | JSON-LD type "https://tap.rsvp/schema/1.0#Capture" |
| amount | string | No | Draft ([TAIP-17]) | Amount to capture (decimal string). If omitted, captures full escrow amount. Must be ≤ original amount |
| settlementAddress | string | No | Draft ([TAIP-17]) | Blockchain address for settlement. If omitted, uses address from earlier Authorize |
Note: The message refers to the original Escrow message via the DIDComm
thid(thread ID) in the message envelope.
{
"id": "capture-123",
"type": "https://tap.rsvp/schema/1.0#Capture",
"from": "did:web:merchant.example",
"to": ["did:web:paymentprocessor.example"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Capture",
"settlementAddress": "eip155:1:0x742d35Cc6634C0532925a3b844Bc9e7595f1234"
}
}{
"id": "capture-456",
"type": "https://tap.rsvp/schema/1.0#Capture",
"from": "did:web:merchant.example",
"to": ["did:web:paymentprocessor.example"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Capture",
"amount": "95.00",
"settlementAddress": "eip155:1:0x742d35Cc6634C0532925a3b844Bc9e7595f1234"
}
}TAIP-5 - Review
Updates information about an agent.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-5) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-5) | JSON-LD type "https://tap.rsvp/schema/1.0#UpdateAgent" |
| agent | Agent | Yes | Review (TAIP-5) | Updated Agent |
{
"id": "123e4567-e89b-12d3-a456-426614174007",
"type": "https://tap.rsvp/schema/1.0#UpdateAgent",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#UpdateAgent",
"agent": {
"@id": "did:web:originator.vasp",
"for": "did:eg:bob",
"role": "CustodialService"
}
}
}TAIP-6 - Review
Updates information about a party.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-6) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-6) | JSON-LD type "https://tap.rsvp/schema/1.0#UpdateParty" |
| party | Party | Yes | Review (TAIP-6) | Updated Party |
{
"id": "123e4567-e89b-12d3-a456-426614174008",
"type": "https://tap.rsvp/schema/1.0#UpdateParty",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": {
"@vocab": "https://tap.rsvp/schema/1.0",
"lei": "https://schema.org/leiCode"
},
"@type": "https://tap.rsvp/schema/1.0#UpdateParty",
"party": {
"@id": "did:eg:alice",
"lei:leiCode": "5493001KJTIIGC8Y1R12",
"name": "Alice Corp Ltd"
}
}
}TAIP-5 - Review
Adds one or more additional agents to the transaction.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-5) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-5) | JSON-LD type "https://tap.rsvp/schema/1.0#AddAgents" |
| agents | array of Agent | Yes | Review (TAIP-5) | Array of Agents to add to the transaction |
{
"id": "123e4567-e89b-12d3-a456-426614174009",
"type": "https://tap.rsvp/schema/1.0#AddAgents",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#AddAgents",
"agents": [
{
"@id": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:beneficiary.vasp",
"role": "SettlementAddress"
}
]
}
}TAIP-5 - Review
Replaces an agent with another agent in the transaction.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-5) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-5) | JSON-LD type "https://tap.rsvp/schema/1.0#ReplaceAgent" |
| original | string | Yes | Review (TAIP-5) | DID of the Agent to be replaced |
| replacement | Agent | Yes | Review (TAIP-5) | Agent to replace the original agent |
{
"id": "123e4567-e89b-12d3-a456-426614174010",
"type": "https://tap.rsvp/schema/1.0#ReplaceAgent",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#ReplaceAgent",
"original": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"replacement": {
"@id": "did:pkh:eip155:1:0x5678a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:beneficiary.vasp",
"role": "SettlementAddress"
}
}
}TAIP-5 - Review
Removes an agent from the transaction.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-5) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-5) | JSON-LD type "https://tap.rsvp/schema/1.0#RemoveAgent" |
| agent | string | Yes | Review (TAIP-5) | DID of the Agent to be removed |
{
"id": "123e4567-e89b-12d3-a456-426614174011",
"type": "https://tap.rsvp/schema/1.0#RemoveAgent",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#RemoveAgent",
"agent": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb"
}
}TAIP-9 - Draft
Confirms a relationship between an agent and the entity it acts on behalf of. Can include cryptographic proof via CACAO signatures for self-hosted wallets.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft (TAIP-9) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft (TAIP-9) | JSON-LD type "https://tap.rsvp/schema/1.0#ConfirmRelationship" |
| body | Agent | Yes | Draft (TAIP-9) | Agent containing the relationship details |
| attachments | array | No | Draft (TAIP-9) | Optional array containing at most one CAIP-74 message for cryptographic proof |
The body object must contain:
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft (TAIP-9) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft (TAIP-9) | JSON-LD type "https://tap.rsvp/schema/1.0#Agent" |
| @id | string | Yes | Draft (TAIP-9) | DID of the agent |
| for | string | Yes | Draft (TAIP-9) | DID of the entity the agent acts on behalf of |
| role | string | No | Draft (TAIP-9) | Role of the agent in the transaction |
{
"id": "123e4567-e89b-12d3-a456-426614174012",
"type": "https://tap.rsvp/schema/1.0#ConfirmRelationship",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Agent",
"@id": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:beneficiary.vasp",
"role": "SettlementAddress"
},
"attachments": [
{
"id": "proof-1",
"media_type": "application/json",
"data": {
"json": {
"h": "eth-personal-sign",
"s": "0x...", // CACAO signature
"p": "I confirm that this wallet (0x1234...fcdb) is controlled by did:web:beneficiary.vasp",
"t": "2024-03-07T12:00:00Z"
}
}
}
]
}{
"id": "confirm-rel-123",
"type": "https://tap.rsvp/schema/1.0#ConfirmRelationship",
"from": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"to": ["did:web:beneficiary.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#ConfirmRelationship",
"@id": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:beneficiary.vasp",
"role": "SettlementAddress"
},
"attachments": [
{
"id": "proof-1",
"media_type": "application/json",
"data": {
"json": {
"h": "eth-personal-sign",
"s": "0x4b688df40bcedbe641ddb52926c971c4f3715a9b5bd0055e0d83659a45c0fc9f7e4979547f179f5880b66684081ac5e32a39a404d33f6cf7b3271e619a97c2f81c",
"p": "I confirm that this wallet (0x1234...fcdb) is controlled by did:web:beneficiary.vasp",
"t": "2024-03-07T12:00:00Z"
}
}
}
]
}{
"id": "confirm-rel-124",
"type": "https://tap.rsvp/schema/1.0#ConfirmRelationship",
"from": "did:web:custodian.service",
"to": ["did:web:beneficiary.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#ConfirmRelationship",
"@id": "did:web:custodian.service",
"for": "did:web:beneficiary.vasp",
"role": "CustodialService"
}
}{
"id": "connect-123",
"type": "https://tap.rsvp/schema/1.0#Connect",
"from": "did:example:b2b-service",
"to": ["did:example:vasp"],
"created_time": 1516269022,
"expires_time": 1516385931,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Connect",
"requester": {
"@id": "did:example:business-customer",
"name": "Business Customer"
},
"principal": {
"@id": "did:example:business-customer",
"name": "Business Customer"
},
"agents": [
{
"@id": "did:example:b2b-service",
"name": "B2B Payment Service",
"serviceUrl": "https://b2b-service/did-comm",
"for": "did:example:business-customer"
}
],
"constraints": {
"purposes": ["BEXP", "SUPP"],
"categoryPurposes": ["CASH", "CCRD"],
"limits": {
"per_transaction": "10000.00",
"per_day": "50000.00",
"currency": "USD"
},
"allowedBeneficiaries": [
{
"@id": "did:example:vendor-1",
"name": "Approved Vendor 1"
},
{
"@id": "did:example:vendor-2",
"name": "Approved Vendor 2"
}
],
"allowedSettlementAddresses": [
"eip155:1:0x742d35Cc6e4dfE2eDFaD2C0b91A8b0780EDAEb58",
"eip155:1:0x89abcdefabcdefabcdefabcdefabcdefabcdef12"
],
"allowedAssets": [
"eip155:1/slip44:60",
"eip155:1/erc20:0xA0b86a33E6441b7178bb7094b2c4b6e5066d68B7"
]
}
}
}{
"id": "connect-124",
"type": "https://tap.rsvp/schema/1.0#Connect",
"from": "did:web:psp.agent",
"to": ["did:web:payment.provider"],
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "Connect",
"requester": {
"@id": "did:web:merchant.vasp",
"name": "Example Store"
},
"principal": {
"@id": "did:web:merchant.vasp",
"name": "Example Store"
},
"agents": [
{
"@id": "did:web:psp.agent",
"name": "PSP Agent",
"for": "did:web:merchant.vasp"
}
],
"constraints": {
"purposes": ["RCPT"],
"categoryPurposes": ["EPAY"],
"limits": {
"per_transaction": "5000.00",
"per_day": "25000.00",
"currency": "USD"
},
"allowedAssets": [
"eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F"
]
}
}
}{
"id": "auth-req-123",
"type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:b2b-service"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"authorizationUrl": "https://beneficiary.vasp/authorize?request=abc123",
"expires": "2024-03-22T15:00:00Z"
}
}{
"id": "auth-req-124",
"type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"from": "did:web:payment.provider",
"to": ["did:web:merchant.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"authorizationUrl": "https://payment.provider/merchant/onboard?id=xyz789",
"expires": "2024-03-22T15:00:00Z"
}
}TAIP-7 - Review
Updates policies for a transaction.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Review (TAIP-7) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Review (TAIP-7) | JSON-LD type "https://tap.rsvp/schema/1.0#UpdatePolicies" |
| policies | array of Policy (RequirePresentation or RequirePurpose) | Yes | Review (TAIP-7) | Array of Policy |
{
"id": "123e4567-e89b-12d3-a456-426614174013",
"type": "https://tap.rsvp/schema/1.0#UpdatePolicies",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#UpdatePolicies",
"policies": [
{
"@type": "RequirePresentation",
"@context": ["https://schema.org/Person"],
"fromAgent": "originator",
"aboutParty": "originator",
"presentationDefinition": "https://tap.rsvp/presentation-definitions/ivms-101/eu/tfr"
},
{
"@type": "RequirePurpose",
"fromAgent": "originator",
"fields": ["purpose", "categoryPurpose"]
}
]
}
}TAIP-15 - Draft
Requests a connection between agents with specified constraints.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft (TAIP-15) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft (TAIP-15) | JSON-LD type "https://tap.rsvp/schema/1.0#Connect" |
| requester | Party | Yes | Draft (TAIP-15) | Party object representing the party requesting the connection |
| principal | Party | Yes | Draft (TAIP-15) | Party object representing the party the requesting agent acts on behalf of |
| agents | array | Yes | Draft (TAIP-15) | Array of agent objects involved in the connection process |
| constraints | object | Yes | Draft (TAIP-15) | Transaction constraints for the connection (see constraints table) |
| expiry | string | No | Draft (TAIP-15) | ISO 8601 datetime indicating when the connection request expires |
| agreement | string | No | Draft (TAIP-15) | URL or identifier of terms agreed to by the principal |
The constraints object defines the boundaries and permissions for transactions performed through an established connection:
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| purposes | array | No | Draft (TAIP-15) | Array of TAIP-13 purpose codes that are allowed |
| categoryPurposes | array | No | Draft (TAIP-15) | Array of TAIP-13 category purpose codes that are allowed |
| limits | object | No | Draft (TAIP-15) | Financial limits for transactions |
| limits.per_transaction | string | No | Draft (TAIP-15) | Maximum amount per transaction |
| limits.per_day | string | No | Draft (TAIP-15) | Maximum daily total |
| limits.per_week | string | No | Draft (TAIP-15) | Maximum weekly total |
| limits.per_month | string | No | Draft (TAIP-15) | Maximum monthly total |
| limits.per_year | string | No | Draft (TAIP-15) | Maximum yearly total |
| limits.currency | string | Yes* | Draft (TAIP-15) | ISO 4217 currency code (*required if limits are specified) |
| allowedBeneficiaries | array | No | Draft (TAIP-15) | Array of TAIP-6 Party objects representing approved payment recipients |
| allowedSettlementAddresses | array | No | Draft (TAIP-15) | Array of [CAIP-10] addresses permitted for settlement |
| allowedAssets | array | No | Draft (TAIP-15) | Array of [CAIP-19] asset identifiers that can be transacted |
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"type": "https://tap.rsvp/schema/1.0#Connect",
"from": "did:example:b2b-service",
"to": ["did:example:vasp"],
"created_time": 1516269022,
"expires_time": 1516385931,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Connect",
"requester": {
"@id": "did:example:business-customer",
"name": "Business Customer"
},
"principal": {
"@id": "did:example:business-customer",
"name": "Business Customer"
},
"agents": [
{
"@id": "did:example:b2b-service",
"name": "B2B Payment Service",
"serviceUrl": "https://b2b-service/did-comm",
"for": "did:example:business-customer"
}
],
"constraints": {
"purposes": ["BEXP", "SUPP"],
"categoryPurposes": ["CASH", "CCRD"],
"limits": {
"per_transaction": "10000.00",
"per_day": "50000.00",
"currency": "USD"
},
"allowedBeneficiaries": [
{
"@id": "did:example:vendor-1",
"name": "Approved Vendor 1"
},
{
"@id": "did:example:vendor-2",
"name": "Approved Vendor 2"
}
],
"allowedSettlementAddresses": [
"eip155:1:0x742d35Cc6e4dfE2eDFaD2C0b91A8b0780EDAEb58",
"eip155:1:0x89abcdefabcdefabcdefabcdefabcdefabcdef12"
],
"allowedAssets": [
"eip155:1/slip44:60",
"eip155:1/erc20:0xA0b86a33E6441b7178bb7094b2c4b6e5066d68B7"
]
},
"agreement": "https://example.com/terms/v2.1"
}
}TAIP-15 - Draft
Provides an authorization URL for interactive connection approval.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft (TAIP-15) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft (TAIP-15) | JSON-LD type "https://tap.rsvp/schema/1.0#AuthorizationRequired" |
| authorizationUrl | string | Yes | Draft (TAIP-15) | URL where the customer can review and approve the connection |
| expires | string | Yes | Draft (TAIP-15) | ISO 8601 timestamp when the authorization URL expires |
{
"id": "98765432-e89b-12d3-a456-426614174001",
"type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"from": "did:example:vasp",
"to": ["did:example:b2b-service"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"created_time": 1516269023,
"expires_time": 1516385931,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"authorizationUrl": "https://vasp.com/authorize?request=abc123",
"expires": "2024-03-22T15:00:00Z"
}
}This flow demonstrates establishing a connection between a B2B service and a VASP, followed by using that connection for a transaction:
- Initial connection request
- Interactive authorization
- Connection approval
- Using the connection for a transfer
{
"id": "connect-123",
"type": "https://tap.rsvp/schema/1.0#Connect",
"from": "did:example:b2b-service",
"to": ["did:example:vasp"],
"created_time": 1516269022,
"expires_time": 1516385931,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Connect",
"requester": {
"@id": "did:example:business-customer",
"name": "Business Customer"
},
"principal": {
"@id": "did:example:business-customer",
"name": "Business Customer"
},
"agents": [
{
"@id": "did:example:b2b-service",
"name": "B2B Payment Service",
"serviceUrl": "https://b2b-service/did-comm",
"for": "did:example:business-customer"
}
],
"constraints": {
"purposes": ["BEXP", "SUPP"],
"categoryPurposes": ["CASH", "CCRD"],
"limits": {
"per_transaction": "10000.00",
"per_day": "50000.00",
"currency": "USD"
},
"allowedBeneficiaries": [
{
"@id": "did:example:vendor-1",
"name": "Approved Vendor 1"
}
],
"allowedSettlementAddresses": [
"eip155:1:0x742d35Cc6e4dfE2eDFaD2C0b91A8b0780EDAEb58"
],
"allowedAssets": [
"eip155:1/slip44:60",
"eip155:1/erc20:0xA0b86a33E6441b7178bb7094b2c4b6e5066d68B7"
]
}
}
}{
"id": "98765432-e89b-12d3-a456-426614174001",
"type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"from": "did:example:vasp",
"to": ["did:example:b2b-service"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"created_time": 1516269023,
"expires_time": 1516385931,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#AuthorizationRequired",
"authorizationUrl": "https://vasp.com/authorize?request=abc123",
"expires": "2024-03-22T15:00:00Z"
}
}{
"id": "abcdef12-e89b-12d3-a456-426614174002",
"type": "https://tap.rsvp/schema/1.0#Authorize",
"from": "did:example:vasp",
"to": ["did:example:b2b-service"],
"thid": "123e4567-e89b-12d3-a456-426614174000",
"created_time": 1516269024,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Authorize"
}
}{
"id": "transfer-123",
"type": "https://tap.rsvp/schema/1.0#Transfer",
"from": "did:example:b2b-service",
"to": ["did:example:vasp"],
"pthid": "connect-123",
"created_time": 1516269024,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/slip44:60",
"amount": "1.23",
"originator": {
"@id": "did:example:business-customer"
},
"agents": [
{
"@id": "did:example:b2b-service",
"principal": {
"@id": "did:example:business-customer"
}
},
{
"@id": "did:example:vasp"
}
]
}
}In self-onboarding scenarios, the agent and principal can be the same entity (e.g., a VASP onboarding itself):
{
"id": "self-onboard-456",
"type": "https://tap.rsvp/schema/1.0#Connect",
"from": "did:example:wallet-service",
"to": ["did:example:vasp"],
"created_time": 1516269025,
"expires_time": 1516385931,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Connect",
"requester": {
"@id": "did:example:wallet-service",
"name": "Wallet Service Provider"
},
"principal": {
"@id": "did:example:wallet-service",
"name": "Wallet Service Provider"
},
"agents": [
{
"@id": "did:example:wallet-service",
"name": "Wallet Service Provider",
"serviceUrl": "https://wallet-service.com/did-comm",
"for": "did:example:wallet-service"
}
],
"constraints": {
"purposes": ["CASH", "CGOO", "GSRV"],
"categoryPurposes": ["CASH", "CCRD", "CDCD"],
"limits": {
"per_transaction": "50000.00",
"per_day": "250000.00",
"currency": "USD"
},
"allowedAssets": [
"eip155:1/slip44:60",
"eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"eip155:1/erc20:0x6B175474E89094C44Da98b954EedeAC495271d0F"
]
},
"agreement": "https://wallet-service.com/terms-of-service/v3.0"
}
}TAIP-4 - Review
Terminates an existing connection.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @context | string | Yes | Draft (TAIP-4) | JSON-LD context "https://tap.rsvp/schema/1.0" |
| @type | string | Yes | Draft (TAIP-4) | JSON-LD type "https://tap.rsvp/schema/1.0#Cancel" |
| by | string | Yes | Draft (TAIP-4) | The party of the transaction wishing to cancel it (e.g., "originator" or "beneficiary" for Transfer messages) |
| reason | string | No | Draft (TAIP-4) | Human readable reason for cancellation |
{
"id": "fedcba98-e89b-12d3-a456-426614174004",
"type": "https://tap.rsvp/schema/1.0#Cancel",
"from": "did:web:customer.wallet",
"to": ["did:web:merchant.vasp"],
"thid": "payment-123",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Cancel",
"by": "customer",
"reason": "User declined payment request"
}
}TAIP-6 - Review
Represents a participant in a transaction (originator or beneficiary).
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @id | string | Yes | Review (TAIP-6) | DID or IRI of the party |
| @type | string | No | Review (TAIP-6) | JSON-LD type identifier. Most commonly "https://schema.org/Organization" for institutional parties or "https://schema.org/Person" for individual parties |
| leiCode | string | No | Draft (TAIP-11) | LEI code for legal entities. Must be a 20-character alpha-numeric string conforming to ISO 17442 |
| name | string | No | Review (TAIP-6) | Human-readable name (based on schema.org/Organization or schema.org/Person) |
| nameHash | string | No | Draft (TAIP-12) | SHA-256 hash of the normalized name (uppercase, no whitespace) |
| mcc | string | No | Review (TAIP-14) | Merchant Category Code (ISO 18245) that identifies the type of business (e.g., "5411" for grocery stores) |
| url | string | No | Review (TAIP-6) | URL pointing to the party's website (based on schema.org/Organization) |
| logo | string | No | Review (TAIP-6) | URL pointing to the party's logo image (based on schema.org/Organization) |
| description | string | No | Review (TAIP-6) | Description of the party (based on schema.org/Organization) |
| string | No | Review (TAIP-6) | Contact email address (based on schema.org/Organization or schema.org/Person) | |
| telephone | string | No | Review (TAIP-6) | Contact telephone number (based on schema.org/Organization or schema.org/Person) |
If a customer (originator or beneficiary) is a legal entity and has an LEI, that LEI SHOULD be included in their Party. For institutions (VASPs), if they have an LEI, they MUST include it in their Party.
{
"@context": {
"@vocab": "https://tap.rsvp/schema/1.0",
"lei": "https://schema.org/leiCode"
},
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/slip44:60",
"amount": "100.00",
"originator": {
"@id": "did:org:acmecorp-123",
"lei:leiCode": "3M5E1GQKGL17HI8CPN20",
"name": "ACME Corporation"
},
"agents": [
{
"@id": "did:web:originator.vasp",
"for": "did:eg:bob",
"role": "CustodialService"
}
]
}The example above shows:
- A Party for a legal entity (ACME Corporation) with its LEI
- An Agent representing that party (the VASP)
Note: Future versions may support verifiable LEIs (vLEIs) through the standard credential presentation mechanism defined in TAIP-8.
TAIP-16 - Review
Represents a detailed invoice that can be included in a Payment message.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| id | string | Yes | Review (TAIP-16) | Unique identifier for the invoice (e.g., "INV001") |
| issueDate | string | Yes | Review (TAIP-16) | ISO 8601 date format (YYYY-MM-DD) when the invoice was issued |
| currencyCode | string | Yes | Review (TAIP-16) | ISO 4217 currency code for the invoice amounts |
| lineItems | array | Yes | Review (TAIP-16) | Array of line item objects representing the individual items being invoiced |
| taxTotal | object | No | Review (TAIP-16) | Aggregate tax information including tax amount and breakdown by category |
| total | number | Yes | Review (TAIP-16) | Total amount of the invoice, including taxes. Must match the amount in the Payment Request body. |
| subTotal | number | No | Review (TAIP-16) | Sum of line totals before taxes |
| dueDate | string | No | Review (TAIP-16) | ISO 8601 date format (YYYY-MM-DD) when payment is due |
| note | string | No | Review (TAIP-16) | Additional notes or terms for the invoice |
| paymentTerms | string | No | Review (TAIP-16) | Terms of payment (e.g., "Net 30") |
| accountingCost | string | No | Review (TAIP-16) | Buyer's accounting code, used to route costs to specific accounts |
| orderReference | object | No | Review (TAIP-16) | Reference to a related order |
| additionalDocumentReference | array | No | Review (TAIP-16) | References to additional documents |
Each line item in the lineItems array contains:
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| id | string | Yes | Review (TAIP-16) | Unique identifier for the line item within the invoice |
| description | string | Yes | Review (TAIP-16) | Description of the item or service |
| name | string | No | Review (TAIP-16) | Product name (based on schema.org/Product). If not provided, description serves as the display name |
| image | string | No | Review (TAIP-16) | URL to an image of the product (based on schema.org/Product) |
| url | string | No | Review (TAIP-16) | URL to the product page (based on schema.org/Product) |
| quantity | number | Yes | Review (TAIP-16) | Quantity of the item |
| unitCode | string | No | Review (TAIP-16) | Unit of measure code (e.g., "EA" for each, "KGM" for kilogram) |
| unitPrice | number | Yes | Review (TAIP-16) | Price per unit |
| lineTotal | number | Yes | Review (TAIP-16) | Total amount for this line item (typically quantity × unitPrice) |
| taxCategory | object | No | Review (TAIP-16) | Tax category information specific to this line item |
{
"id": "INV001",
"issueDate": "2025-04-22",
"currencyCode": "USD",
"lineItems": [
{
"id": "1",
"description": "Widget A",
"quantity": 5,
"unitCode": "EA",
"unitPrice": 10.00,
"lineTotal": 50.00
},
{
"id": "2",
"description": "Widget B",
"quantity": 10,
"unitCode": "EA",
"unitPrice": 5.00,
"lineTotal": 50.00
}
],
"taxTotal": {
"taxAmount": 15.00,
"taxSubtotal": [
{
"taxableAmount": 100.00,
"taxAmount": 15.00,
"taxCategory": {
"id": "S",
"percent": 15.0,
"taxScheme": "VAT"
}
}
]
},
"total": 115.00,
"subTotal": 100.00,
"dueDate": "2025-05-22",
"paymentTerms": "Net 30"
}TAIP-5 - Review
Represents a service involved in executing transactions.
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @id | string | Yes | Review (TAIP-5) | DID of the agent |
| @type | string | No | Review (TAIP-5) | JSON-LD type identifier. Most commonly "https://schema.org/Organization" for institutional agents |
| role | string | No | Review (TAIP-5) | Role of the agent (e.g., "SettlementAddress", "SourceAddress", "CustodialService") |
| for | string or array of strings | No | Review (TAIP-5) | Reference to the Party or Parties this agent represents. Can be either a single DID string or an array of DID strings when the agent acts on behalf of multiple entities simultaneously |
| name | string | No | Review (TAIP-5) | Name of the agent organization (based on schema.org/Organization) |
| url | string | No | Review (TAIP-5) | URL pointing to the agent's website (based on schema.org/Organization) |
| logo | string | No | Review (TAIP-5) | URL pointing to the agent's logo image (based on schema.org/Organization) |
| description | string | No | Review (TAIP-5) | Description of the agent (based on schema.org/Organization) |
| string | No | Review (TAIP-5) | Contact email address (based on schema.org/Organization) | |
| telephone | string | No | Review (TAIP-5) | Contact telephone number (based on schema.org/Organization) |
| serviceUrl | string | No | Review (TAIP-15) | Optional DIDComm service endpoint URL. Should only be used as a fallback when no DIDComm service endpoint is resolvable from the agent's DID document. Particularly useful for self-hosted and decentralized agents |
Note: Both role and for parameters are optional to support flexible agent configurations. The role parameter may be omitted when the agent's function is implicit from context or when using generic service agents. The for parameter may be omitted for standalone agents or when the relationship is established through other means.
{
"@id": "did:web:originator.vasp",
"for": "did:eg:bob",
"role": "SourceAddress"
}{
"@id": "did:web:shared.wallet",
"for": ["did:eg:alice", "did:eg:bob"],
"role": "CustodialService"
}{
"@id": "did:web:shared.wallet",
"for": ["did:web:vasp1.com", "did:web:vasp2.com"],
"role": "CustodialService"
}{
"@id": "did:web:generic.service",
"for": "did:eg:alice"
}{
"@id": "did:web:standalone.service"
}TAIP-7 - Review
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @type | string | Yes | Review (TAIP-7) | "RequirePresentation" |
| @context | array | Yes | Review (TAIP-7) | Array of context URIs |
| fromAgent | string | Yes | Review (TAIP-7) | Agent to present the information |
| aboutParty | string | No | Review (TAIP-7) | Party the presentation is about |
| aboutAgent | string | No | Review (TAIP-7) | Agent the presentation is about |
| presentationDefinition | string | Yes | Review (TAIP-7) | URL to presentation definition |
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @type | string | Yes | Review (TAIP-7) | "RequirePurpose" |
| fields | array | Yes | Draft (TAIP-13) | Array of required fields: ["purpose"] and/or ["categoryPurpose"] |
| fromAgent | string | No | Draft (TAIP-13) | Agent required to provide the purpose code(s) |
TAIP-7 - Review
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @type | string | Yes | Review (TAIP-7) | "RequireAuthorization" |
| fromAgent | string | Yes | Review (TAIP-7) | Agent required to provide authorization |
| reason | string | No | Review (TAIP-7) | Human readable reason for requiring authorization |
TAIP-9 - Draft
| Attribute | Type | Required | Status | Description |
|---|---|---|---|---|
| @type | string | Yes | Draft (TAIP-9) | "RequireRelationshipConfirmation" |
| fromAgent | string | Yes | Draft (TAIP-9) | Agent required to confirm the relationship |
| aboutParty | string | Yes | Draft (TAIP-9) | Party whose relationship needs confirmation |
| aboutAgent | string | Yes | Draft (TAIP-9) | Agent whose relationship needs confirmation |
| reason | string | No | Draft (TAIP-9) | Human readable reason for requiring relationship confirmation |
{
"@type": "RequireAuthorization",
"fromAgent": "beneficiary",
"reason": "Beneficiary approval required for transfers over 1000 USDC"
}{
"@type": "RequireRelationshipConfirmation",
"fromAgent": "originator",
"aboutParty": "originator",
"aboutAgent": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"reason": "Please confirm control of the settlement address"
}When parties haven't established communication, TAP messages can be initiated using DIDComm Out-of-Band (OOB) messages. This enables sharing transaction requests through URLs or QR codes.
- MUST use the
https://didcomm.org/out-of-band/2.0protocol - MUST include the appropriate goal_code:
tap.transferfor Transfer messagestap.paymentfor Payment messages
- SHOULD be shared as URLs according to the Out-of-Band message spec
- MUST include the TAP message as a signed DIDComm message in the attachment
{
"type": "https://didcomm.org/out-of-band/2.0/invitation",
"id": "2e9e257c-2839-4fae-b0c4-dcd4e2159f4e",
"from": "did:example:originator",
"body": {
"goal_code": "tap.transfer",
"goal": "Process transfer request",
"accept": ["didcomm/v2"]
},
"attachments": [{
"id": "transfer-1",
"mime_type": "application/didcomm-signed+json",
"data": {
"json": {
"payload": "eyJpZCI6IjU5OWY3MjIwLTYxNDktNGM0NS1hZGJiLTg2ZDk2YzhlMDYwOCIsInR5cGUiOiJodHRwczovL3RhcC5yc3ZwL3NjaGVtYS8xLjAjVHJhbnNmZXIiLCJmcm9tIjoiZGlkOmV4YW1wbGU6b3JpZ2luYXRvciIsImJvZHkiOnsiQGNvbnRleHQiOiJodHRwczovL3RhcC5yc3ZwL3NjaGVtYS8xLjAiLCJAdHlwZSI6Imh0dHBzOi8vdGFwLnJzdnAvc2NoZW1hLzEuMCNUcmFuc2ZlciIsImFzc2V0IjoiZWlwMTU1OjEvc2xpcDQ0OjYwIiwiYW1vdW50IjoiMTAwLjAwIn19",
"signatures": [{
"protected": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDpleGFtcGxlOm9yaWdpbmF0b3Ija2V5LTEifQ",
"signature": "FW33NnvOHV0Ted9-F7GZbkia-vYAfBKtH4oBxbrttWAhBZ6UFJMxcGjL3lwOl4YohI3kyyd2LqvFHsEFk7R7Cg"
}]
}
}
}]
}The corresponding URL format would be:
https://example.com/tap?_oob=eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSJ9...
This flow demonstrates a basic transfer between parties with compliance requirements:
- The originator initiates a transfer
- The beneficiary requests additional information via policies
- After receiving the required information, the beneficiary authorizes the transfer
- The originator settles the transfer on-chain
Note that all messages share the same thread ID to link them together.
{
"id": "transfer-123",
"type": "https://tap.rsvp/schema/1.0#Transfer",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/slip44:60",
"amount": "1.23",
"originator": {
"@id": "did:eg:bob"
},
"beneficiary": {
"@id": "did:eg:alice"
},
"agents":[
{
"@id":"did:web:originator.vasp",
"for":"did:eg:bob",
"role":"CustodialService"
},
{
"@id": "did:web:beneficiary.vasp",
"for": "did:eg:alice",
"role": "CustodialService"
}
]
}
}{
"id": "policies-123",
"type": "https://tap.rsvp/schema/1.0#UpdatePolicies",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "transfer-123",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#UpdatePolicies",
"policies": [
{
"@type": "RequirePresentation",
"@context": ["https://schema.org/Person"],
"fromAgent": "originator",
"aboutParty": "originator",
"presentationDefinition": "https://tap.rsvp/presentation-definitions/ivms-101/eu/tfr"
},
{
"@type": "RequirePurpose",
"fromAgent": "originator",
"fields": ["purpose", "categoryPurpose"]
}
]
}
}{
"id": "auth-123",
"type": "https://tap.rsvp/schema/1.0#Authorize",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "transfer-123",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Authorize"
}
}{
"id": "settle-123",
"type": "https://tap.rsvp/schema/1.0#Settle",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "transfer-123",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Settle",
"settlementId": "eip155:1:tx/0x3edb98c24d46d148eb926c714f4fbaa117c47b0c0821f38bfce9763604457c33"
}
}Demonstrates a transfer between two customers of the same VASP with:
- A single agent (the VASP) acting on behalf of both parties simultaneously using multiple DIDs in the "for" field
- Internal transfer between customers of the same institution
- Simplified agent list as the VASP acts for both sender and receiver
{
"from": "did:web:goodbyefiat.com",
"type": "https://tap.rsvp/schema/1.0#Transfer",
"id": "1234567890",
"to": ["did:web:goodbyefiat.com"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/slip44:60",
"amount": "1.23",
"originator": {
"@id": "did:eg:bob"
},
"beneficiary": {
"@id": "did:eg:alice"
},
"agents": [
{
"@id": "did:pkh:eip155:1:0xabcda96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:goodbyefiat.com",
"role": "SourceAddress"
},
{
"@id": "did:web:goodbyefiat.com",
"for": ["did:eg:bob", "did:eg:alice"],
"role": "CustodialService"
},
{
"@id": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:goodbyefiat.com",
"role": "SettlementAddress"
}
]
}
}Demonstrates a cross-VASP transfer with:
- A shared wallet provider supporting multiple VASPs
- Use of multiple DIDs in the "for" field to show the wallet provider's relationship with both VASPs
- Efficient representation of intermediary relationships without duplicating agent entries
{
"from": "did:web:goodbyefiat.com",
"type": "https://tap.rsvp/schema/1.0#Transfer",
"id": "9876543210",
"to": ["did:web:hellocrypto.com"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/slip44:60",
"amount": "5.67",
"originator": {
"@id": "did:eg:bob"
},
"beneficiary": {
"@id": "did:eg:alice"
},
"agents": [
{
"@id": "did:web:goodbyefiat.com",
"for": "did:eg:bob",
"role": "CustodialService"
},
{
"@id": "did:web:hellocrypto.com",
"for": "did:eg:alice",
"role": "CustodialService"
},
{
"@id": "did:web:superwallet.com",
"for": ["did:web:goodbyefiat.com", "did:web:hellocrypto.com"],
"role": "CustodialService"
},
{
"@id": "did:pkh:eip155:1:0xabcda96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:superwallet.com",
"role": "SourceAddress"
},
{
"@id": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:superwallet.com",
"role": "SettlementAddress"
}
]
}
}Demonstrates usage of:
- Legal Entity Identifier (LEI) for the originator
- ISO 20022 purpose codes for payment classification
- Corporate transfer between institutions
{
"id": "transfer-124",
"type": "https://tap.rsvp/schema/1.0#Transfer",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"body": {
"@context": {
"lei": "https://schema.org/leiCode"
},
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/slip44:60",
"amount": "1.23",
"purpose": "SALA",
"categoryPurpose": "CORT",
"originator": {
"@id": "did:org:acmecorp-123",
"lei:leiCode": "3M5E1GQKGL17HI8CPN20",
"name": "ACME Corporation"
},
"beneficiary": {
"@id": "did:eg:alice"
},
"agents": [
{
"@id": "did:web:originator.vasp",
"for": "did:org:acmecorp-123",
"role": "CustodialService"
},
{
"@id": "did:web:beneficiary.vasp",
"for": "did:eg:alice",
"role": "CustodialService"
}
]
}
}This flow demonstrates a complete payment request process from a merchant to a customer, including:
- A merchant initiates by sending a Payment request for $100 USD, accepting USDC as payment
- The customer responds with a Transfer message, choosing to pay in USDC
- The merchant authorizes the transfer after verifying the details match their request
- The customer settles the payment on-chain and notifies the merchant with the transaction ID
Note that all messages in this flow share the same thread ID (payment-123) to link them together. The merchant can use this to track the payment status and match it to their original request.
{
"id": "payment-123",
"type": "https://tap.rsvp/schema/1.0#Payment",
"from": "did:web:merchant.vasp",
"to": ["did:web:customer.vasp"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Payment",
"currency": "USD",
"amount": "100.00",
"supportedAssets": [
"eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
],
"merchant": {
"@id": "did:web:merchant.vasp",
"name": "Example Store",
"mcc": "5812"
},
"expiry": "2024-04-21T12:00:00Z",
"agents": [
{
"@id": "did:web:merchant.vasp",
"for": "did:web:merchant.vasp",
"role": "CustodialService"
}
]
}
}{
"id": "transfer-123",
"type": "https://tap.rsvp/schema/1.0#Transfer",
"from": "did:web:customer.vasp",
"to": ["did:web:merchant.vasp"],
"thid": "payment-123",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Transfer",
"asset": "eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"amount": "100.00",
"originator": {
"@id": "did:web:customer"
},
"beneficiary": {
"@id": "did:web:merchant.vasp",
"name": "Example Store"
},
"agents": [
{
"@id": "did:web:customer.vasp",
"for": "did:web:customer",
"role": "CustodialService"
},
{
"@id": "did:web:merchant.vasp",
"for": "did:web:merchant.vasp",
"role": "CustodialService"
}
]
}
}{
"id": "auth-123",
"type": "https://tap.rsvp/schema/1.0#Authorize",
"from": "did:web:merchant.vasp",
"to": ["did:web:customer.vasp"],
"thid": "payment-123",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Authorize"
}
}{
"id": "settle-123",
"type": "https://tap.rsvp/schema/1.0#Settle",
"from": "did:web:customer.vasp",
"to": ["did:web:merchant.vasp"],
"thid": "payment-123",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Settle",
"settlementId": "eip155:1:tx/0x3edb98c24d46d148eb926c714f4fbaa117c47b0c0821f38bfce9763604457c33"
}
}{
"id": "cancel-123",
"type": "https://tap.rsvp/schema/1.0#Cancel",
"from": "did:web:customer.wallet",
"to": ["did:web:merchant.vasp"],
"thid": "payment-123",
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Cancel",
"by": "customer",
"reason": "User declined payment request"
}
}{
"id": "cancel-123",
"type": "https://tap.rsvp/schema/1.0#Cancel",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Cancel",
"by": "originator",
"reason": "User cancelled the request"
}
}{
"id": "cancel-124",
"type": "https://tap.rsvp/schema/1.0#Cancel",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "connection-123",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Cancel",
"by": "originator",
"reason": "Service agreement terminated"
}
}{
"id": "revert-123",
"type": "https://tap.rsvp/schema/1.0#Revert",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Revert",
"settlementAddress": "eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"reason": "Post-settlement compliance check failed"
}
}{
"id": "revert-124",
"type": "https://tap.rsvp/schema/1.0#Revert",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Revert",
"settlementAddress": "eip155:1:0x5678a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"reason": "Customer dispute - unauthorized transaction"
}
}{
"id": "update-agent-123",
"type": "https://tap.rsvp/schema/1.0#UpdateAgent",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#UpdateAgent",
"agent": {
"@id": "did:web:originator.vasp",
"for": "did:eg:bob",
"role": "CustodialService",
"policies": [
{
"@type": "RequirePresentation",
"@context": ["https://schema.org/Person"],
"fromAgent": "beneficiary",
"aboutParty": "beneficiary",
"presentationDefinition": "https://tap.rsvp/presentation-definitions/ivms-101/eu/tfr"
},
{
"@type": "RequirePurpose",
"fromAgent": "beneficiary",
"fields": ["purpose", "categoryPurpose"]
}
]
}
}
}{
"id": "update-agent-124",
"type": "https://tap.rsvp/schema/1.0#UpdateAgent",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#UpdateAgent",
"agent": {
"@id": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb",
"for": "did:web:beneficiary.vasp",
"role": "CustodialService"
}
}
}{
"id": "update-party-123",
"type": "https://tap.rsvp/schema/1.0#UpdateParty",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": {
"@vocab": "https://tap.rsvp/schema/1.0",
"lei": "https://schema.org/leiCode"
},
"@type": "https://tap.rsvp/schema/1.0#UpdateParty",
"party": {
"@id": "did:eg:alice",
"lei:leiCode": "5493001KJTIIGC8Y1R12",
"name": "Alice Corp Ltd"
}
}
}{
"id": "update-party-124",
"type": "https://tap.rsvp/schema/1.0#UpdateParty",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#UpdateParty",
"party": {
"@id": "did:eg:alice",
"name": "Alice Smith",
"nameHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
}
}{
"id": "remove-agent-123",
"type": "https://tap.rsvp/schema/1.0#RemoveAgent",
"from": "did:web:beneficiary.vasp",
"to": ["did:web:originator.vasp"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#RemoveAgent",
"agent": "did:pkh:eip155:1:0x1234a96D359eC26a11e2C2b3d8f8B8942d5Bfcdb"
}
}{
"id": "remove-agent-124",
"type": "https://tap.rsvp/schema/1.0#RemoveAgent",
"from": "did:web:originator.vasp",
"to": ["did:web:beneficiary.vasp", "did:web:custodian.service"],
"thid": "1234567890",
"created_time": 1516269022,
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#RemoveAgent",
"agent": "did:web:custodian.service"
}
}{
"id": "payment-456",
"type": "https://tap.rsvp/schema/1.0#Payment",
"from": "did:web:merchant.vasp",
"to": ["did:web:customer.vasp"],
"body": {
"@context": "https://tap.rsvp/schema/1.0",
"@type": "https://tap.rsvp/schema/1.0#Payment",
"currency": "USD",
"amount": "115.00",
"supportedAssets": [
"eip155:1/erc20:0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
],
"invoice": {
"id": "INV001",
"issueDate": "2025-04-22",
"currencyCode": "USD",
"lineItems": [
{
"id": "1",
"description": "Widget A",
"name": "Premium Widget Model A",
"image": "https://example.com/products/widget-a.jpg",
"url": "https://example.com/products/widget-a",
"quantity": 5,
"unitCode": "EA",
"unitPrice": 10.00,
"lineTotal": 50.00
},
{
"id": "2",
"description": "Widget B",
"name": "Standard Widget Model B",
"url": "https://example.com/products/widget-b",
"quantity": 10,
"unitCode": "EA",
"unitPrice": 5.00,
"lineTotal": 50.00
}
],
"taxTotal": {
"taxAmount": 15.00,
"taxSubtotal": [
{
"taxableAmount": 100.00,
"taxAmount": 15.00,
"taxCategory": {
"id": "S",
"percent": 15.0,
"taxScheme": "VAT"
}
}
]
},
"total": 115.00,
"subTotal": 100.00,
"dueDate": "2025-05-22",
"paymentTerms": "Net 30"
},
"merchant": {
"@id": "did:web:merchant.vasp",
"name": "Example Store",
"mcc": "5812"
},
"expiry": "2025-04-29T12:00:00Z",
"agents": [
{
"@id": "did:web:merchant.vasp",
"for": "did:web:merchant.vasp",
"role": "CustodialService"
}
]
}
}