<!-- x-generated: Generated by the Hyperscale artifact pipeline; do not edit by hand -->

# Composition accounts+activity+deposits+identity+internal_transfers+payouts+verification

> The frozen Composition accounts+activity+deposits+identity+internal_transfers+payouts+verification Product Build, version 1.

- Composition id: `accounts_activity_deposits_identity_internal_transfers_payouts_verification`
- Version: 1
- Digest: `e0792c91c14175881e4597277bdce535b66bee33446760df8109af5e8e21e3fa`
- Currencies: `SAR`
- Webhook events: 35

## Instruments

This program composes no instrument.

## Journeys

### Cancel an unfunded escrow

- Journey id: `unfunded_escrow_canceled`
- Steps: 11

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- buyer_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- buyer_customer.customerId
7. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: subjectId, tenantId, productId, kind, kindVersion, attributes, declaredValue, createdAt, metadata
   - Bindings: none
8. `listing_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/listings`, scopes listing:write, idempotency required, receipt yes
   - Body: askingPrice, currency, description, expiresAt, headline, imageUrl, productId, sellerAccountId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: sellerAccountId <- seller.accountId, subject <- subject.subjectId
9. `listing_publish`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/listings/{listingId}/publish`, scopes listing:write, idempotency required, receipt yes
   - Body: none
   - Path: listingId
   - Query: none
   - Expect: none
   - Bindings: listingId <- listing.listingId
10. `escrow_order_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/escrow-orders`, scopes escrow_order:write, idempotency required, receipt yes
   - Body: buyerAccountId, fundBy, listingId, memo, productId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: buyerAccountId <- buyer.accountId, listingId <- listing.listingId, subject <- subject.subjectId
11. `escrow_order_cancel`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/escrow-orders/{escrowOrderId}/cancel`, scopes escrow_order:write, idempotency required, receipt yes
   - Body: none
   - Path: escrowOrderId
   - Query: none
   - Expect: none
   - Bindings: escrowOrderId <- escrow.escrowOrderId

### Withdraw a draft listing

- Journey id: `withdraw_draft_listing`
- Steps: 6

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: subjectId, tenantId, productId, kind, kindVersion, attributes, declaredValue, createdAt, metadata
   - Bindings: none
5. `listing_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/listings`, scopes listing:write, idempotency required, receipt yes
   - Body: askingPrice, currency, description, expiresAt, headline, imageUrl, productId, sellerAccountId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: sellerAccountId <- seller_account.accountId, subject <- subject.subjectId
6. `listing_withdraw`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/listings/{listingId}/withdraw`, scopes listing:write, idempotency required, receipt yes
   - Body: none
   - Path: listingId
   - Query: none
   - Expect: none
   - Bindings: listingId <- listing.listingId

### Cancel an unfunded order

- Journey id: `cancel_unfunded_order`
- Steps: 10

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: subjectId, tenantId, productId, kind, kindVersion, attributes, declaredValue, createdAt, metadata
   - Bindings: none
6. `listing_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/listings`, scopes listing:write, idempotency required, receipt yes
   - Body: askingPrice, currency, description, expiresAt, headline, imageUrl, productId, sellerAccountId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: sellerAccountId <- seller_account.accountId, subject <- subject.subjectId
7. `listing_publish`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/listings/{listingId}/publish`, scopes listing:write, idempotency required, receipt yes
   - Body: none
   - Path: listingId
   - Query: none
   - Expect: none
   - Bindings: listingId <- listing.listingId
8. `escrow_order_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/escrow-orders`, scopes escrow_order:write, idempotency required, receipt yes
   - Body: buyerAccountId, fundBy, listingId, memo, productId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: buyerAccountId <- buyer_account.accountId, listingId <- listing.listingId, subject <- subject.subjectId
9. `order_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/orders`, scopes order:write, idempotency required, receipt yes
   - Body: confirmBy, escrowOrderId, listingId, memo, productId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: escrowOrderId <- escrow.escrowOrderId, listingId <- listing.listingId, subject <- subject.subjectId
10. `order_cancel`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/orders/{orderId}/cancel`, scopes order:write, idempotency required, receipt yes
   - Body: none
   - Path: orderId
   - Query: none
   - Expect: none
   - Bindings: orderId <- order.orderId

### Withdraw a policy quote

- Journey id: `withdraw_policy_quote`
- Steps: 7

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: subjectId, tenantId, productId, kind, kindVersion, attributes, declaredValue, createdAt, metadata
   - Bindings: none
6. `policy_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/policies`, scopes policy:write, idempotency required, receipt yes
   - Body: coverageLimit, currency, expiresAt, insurerAccountId, perilSchedule, policyholderAccountId, premiumAmount, productId, startsAt, subject, termsSummary
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: insurerAccountId <- insurer_account.accountId, policyholderAccountId <- holder_account.accountId, subject <- subject.subjectId
7. `policy_withdraw`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/policies/{policyId}/withdraw`, scopes policy:write, idempotency required, receipt yes
   - Body: none
   - Path: policyId
   - Query: none
   - Expect: none
   - Bindings: policyId <- policy.policyId

### Assess and deny a claim

- Journey id: `claim_denied`
- Steps: 14

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- holder_customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- holder_customer.customerId
4. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- holder.accountId
5. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
6. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- insurer_customer.customerAccessId
7. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- insurer_customer.customerId
8. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
9. `policy_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/policies`, scopes policy:write, idempotency required, receipt yes
   - Body: coverageLimit, currency, expiresAt, insurerAccountId, perilSchedule, policyholderAccountId, premiumAmount, productId, startsAt, subject, termsSummary
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: insurerAccountId <- insurer.accountId, policyholderAccountId <- holder.accountId, subject <- subject.subjectId
10. `policy_bind`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/policies/{policyId}/bind`, scopes policy:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: policyId
   - Query: none
   - Expect: none
   - Bindings: policyId <- policy.policyId
11. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `policy.activate` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.policyId <- policy.policyId
12. `claim_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/claims`, scopes claim:write, idempotency required, receipt yes
   - Body: claimAmount, claimantAccountId, currency, evidenceSummary, insurerAccountId, occurredAt, peril, policyId, productId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: claimantAccountId <- holder.accountId, insurerAccountId <- insurer.accountId, policyId <- policy.policyId, subject <- subject.subjectId
13. `claim_assess`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/claims/{claimId}/assess`, scopes claim:write, idempotency required, receipt yes
   - Body: none
   - Path: claimId
   - Query: none
   - Expect: none
   - Bindings: claimId <- claim.claimId
14. `claim_deny`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/claims/{claimId}/deny`, scopes claim:write, idempotency required, receipt yes
   - Body: none
   - Path: claimId
   - Query: none
   - Expect: none
   - Bindings: claimId <- claim.claimId

### Cancel an unfunded deposit

- Journey id: `unfunded_deposit_canceled`
- Steps: 8

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- holder_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- holder_customer.customerId
7. `deposit_hold_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/deposit-holds`, scopes deposit_hold:write, idempotency required, receipt yes
   - Body: amount, currency, expiresAt, holderAccountId, memo, payerAccountId, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: holderAccountId <- holder.accountId, payerAccountId <- payer.accountId
8. `deposit_hold_cancel`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/deposit-holds/{depositHoldId}/cancel`, scopes deposit_hold:write, idempotency required, receipt yes
   - Body: none
   - Path: depositHoldId
   - Query: none
   - Expect: none
   - Bindings: depositHoldId <- hold.depositHoldId

### Activate and close a cardholder

- Journey id: `cardholder_lifecycle`
- Steps: 5

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `cardholder_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders`, scopes cardholder:write, idempotency required, receipt yes
   - Body: customerId, displayName, email, phoneNumber, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: customerId <- customer.customerId
4. `cardholder_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders/{cardholderId}/activate`, scopes cardholder:write, idempotency required, receipt yes
   - Body: none
   - Path: cardholderId
   - Query: none
   - Expect: none
   - Bindings: cardholderId <- cardholder.cardholderId
5. `cardholder_close`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders/{cardholderId}/close`, scopes cardholder:write, idempotency required, receipt yes
   - Body: none
   - Path: cardholderId
   - Query: none
   - Expect: none
   - Bindings: cardholderId <- cardholder.cardholderId

### Issue and cancel a card

- Journey id: `card_lifecycle`
- Steps: 10

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `cardholder_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders`, scopes cardholder:write, idempotency required, receipt yes
   - Body: customerId, displayName, email, phoneNumber, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: customerId <- customer.customerId
5. `cardholder_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders/{cardholderId}/activate`, scopes cardholder:write, idempotency required, receipt yes
   - Body: none
   - Path: cardholderId
   - Query: none
   - Expect: none
   - Bindings: cardholderId <- cardholder.cardholderId
6. `card_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards`, scopes card:write, idempotency required, receipt yes
   - Body: accountId, cardholderId, currency, label, productId, spendControls
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: accountId <- account.accountId, cardholderId <- cardholder.cardholderId
7. `card_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards/{cardId}/activate`, scopes card:write, idempotency required, receipt yes
   - Body: none
   - Path: cardId
   - Query: none
   - Expect: none
   - Bindings: cardId <- card.cardId
8. `card_freeze`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards/{cardId}/freeze`, scopes card:write, idempotency required, receipt yes
   - Body: none
   - Path: cardId
   - Query: none
   - Expect: none
   - Bindings: cardId <- card.cardId
9. `card_unfreeze`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards/{cardId}/unfreeze`, scopes card:write, idempotency required, receipt yes
   - Body: none
   - Path: cardId
   - Query: none
   - Expect: none
   - Bindings: cardId <- card.cardId
10. `card_cancel`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards/{cardId}/cancel`, scopes card:write, idempotency required, receipt yes
   - Body: none
   - Path: cardId
   - Query: none
   - Expect: none
   - Bindings: cardId <- card.cardId

### Decline a card authorization

- Journey id: `declined_authorization`
- Steps: 12

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- merchant_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- merchant_customer.customerId
7. `cardholder_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders`, scopes cardholder:write, idempotency required, receipt yes
   - Body: customerId, displayName, email, phoneNumber, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: customerId <- customer.customerId
8. `cardholder_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders/{cardholderId}/activate`, scopes cardholder:write, idempotency required, receipt yes
   - Body: none
   - Path: cardholderId
   - Query: none
   - Expect: none
   - Bindings: cardholderId <- cardholder.cardholderId
9. `card_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards`, scopes card:write, idempotency required, receipt yes
   - Body: accountId, cardholderId, currency, label, productId, spendControls
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: accountId <- card_account.accountId, cardholderId <- cardholder.cardholderId
10. `card_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards/{cardId}/activate`, scopes card:write, idempotency required, receipt yes
   - Body: none
   - Path: cardId
   - Query: none
   - Expect: none
   - Bindings: cardId <- card.cardId
11. `card_authorization_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-authorizations`, scopes card_authorization:write, idempotency required, receipt yes
   - Body: amount, cardAccountId, cardId, currency, expiresAt, merchantCategory, merchantCountry, merchantName, merchantReference, productId, settlementAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: cardAccountId <- card_account.accountId, cardId <- card.cardId, settlementAccountId <- settlement_account.accountId
12. `card_authorization_decline`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-authorizations/{cardAuthorizationId}/decline`, scopes card_authorization:write, idempotency required, receipt yes
   - Body: none
   - Path: cardAuthorizationId
   - Query: none
   - Expect: none
   - Bindings: cardAuthorizationId <- authorization.cardAuthorizationId

### Post and refund a card purchase

- Journey id: `card_purchase_refunded`
- Steps: 17

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- holder_customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- holder_customer.customerId
4. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- card_account.accountId
5. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
6. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- merchant_customer.customerAccessId
7. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- merchant_customer.customerId
8. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- merchant_account.accountId
9. `cardholder_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders`, scopes cardholder:write, idempotency required, receipt yes
   - Body: customerId, displayName, email, phoneNumber, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: customerId <- holder_customer.customerId
10. `cardholder_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders/{cardholderId}/activate`, scopes cardholder:write, idempotency required, receipt yes
   - Body: none
   - Path: cardholderId
   - Query: none
   - Expect: none
   - Bindings: cardholderId <- cardholder.cardholderId
11. `card_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards`, scopes card:write, idempotency required, receipt yes
   - Body: accountId, cardholderId, currency, label, productId, spendControls
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: accountId <- card_account.accountId, cardholderId <- cardholder.cardholderId
12. `card_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards/{cardId}/activate`, scopes card:write, idempotency required, receipt yes
   - Body: none
   - Path: cardId
   - Query: none
   - Expect: none
   - Bindings: cardId <- card.cardId
13. `card_authorization_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-authorizations`, scopes card_authorization:write, idempotency required, receipt yes
   - Body: amount, cardAccountId, cardId, currency, expiresAt, merchantCategory, merchantCountry, merchantName, merchantReference, productId, settlementAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: cardAccountId <- card_account.accountId, cardId <- card.cardId, settlementAccountId <- merchant_account.accountId
14. `card_authorization_approve`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-authorizations/{cardAuthorizationId}/approve`, scopes card_authorization:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: cardAuthorizationId
   - Query: none
   - Expect: none
   - Bindings: cardAuthorizationId <- authorization.cardAuthorizationId
15. `card_authorization_capture`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-authorizations/{cardAuthorizationId}/capture`, scopes card_authorization:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: cardAuthorizationId
   - Query: none
   - Expect: none
   - Bindings: cardAuthorizationId <- authorization.cardAuthorizationId
16. `card_transaction_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-transactions`, scopes card_transaction:write, idempotency required, receipt yes
   - Body: cardAuthorizationId, postedAt, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: cardAuthorizationId <- authorization.cardAuthorizationId
17. `card_transaction_refund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-transactions/{cardTransactionId}/refund`, scopes card_transaction:write, transfer:write, idempotency required, receipt yes
   - Body: reason
   - Path: cardTransactionId
   - Query: none
   - Expect: none
   - Bindings: cardTransactionId <- transaction.cardTransactionId

### Review and lose a card dispute

- Journey id: `card_dispute_lost`
- Steps: 18

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- holder_customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- holder_customer.customerId
4. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- card_account.accountId
5. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
6. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- merchant_customer.customerAccessId
7. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- merchant_customer.customerId
8. `cardholder_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders`, scopes cardholder:write, idempotency required, receipt yes
   - Body: customerId, displayName, email, phoneNumber, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: customerId <- holder_customer.customerId
9. `cardholder_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cardholders/{cardholderId}/activate`, scopes cardholder:write, idempotency required, receipt yes
   - Body: none
   - Path: cardholderId
   - Query: none
   - Expect: none
   - Bindings: cardholderId <- cardholder.cardholderId
10. `card_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards`, scopes card:write, idempotency required, receipt yes
   - Body: accountId, cardholderId, currency, label, productId, spendControls
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: accountId <- card_account.accountId, cardholderId <- cardholder.cardholderId
11. `card_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/cards/{cardId}/activate`, scopes card:write, idempotency required, receipt yes
   - Body: none
   - Path: cardId
   - Query: none
   - Expect: none
   - Bindings: cardId <- card.cardId
12. `card_authorization_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-authorizations`, scopes card_authorization:write, idempotency required, receipt yes
   - Body: amount, cardAccountId, cardId, currency, expiresAt, merchantCategory, merchantCountry, merchantName, merchantReference, productId, settlementAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: cardAccountId <- card_account.accountId, cardId <- card.cardId, settlementAccountId <- merchant_account.accountId
13. `card_authorization_approve`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-authorizations/{cardAuthorizationId}/approve`, scopes card_authorization:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: cardAuthorizationId
   - Query: none
   - Expect: none
   - Bindings: cardAuthorizationId <- authorization.cardAuthorizationId
14. `card_authorization_capture`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-authorizations/{cardAuthorizationId}/capture`, scopes card_authorization:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: cardAuthorizationId
   - Query: none
   - Expect: none
   - Bindings: cardAuthorizationId <- authorization.cardAuthorizationId
15. `card_transaction_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-transactions`, scopes card_transaction:write, idempotency required, receipt yes
   - Body: cardAuthorizationId, postedAt, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: cardAuthorizationId <- authorization.cardAuthorizationId
16. `card_dispute_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-disputes`, scopes card_dispute:write, idempotency required, receipt yes
   - Body: cardTransactionId, evidence, productId, reason, responseDueAt
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: cardTransactionId <- transaction.cardTransactionId
17. `card_dispute_review`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/card-disputes/{cardDisputeId}/review`, scopes card_dispute:write, idempotency required, receipt yes
   - Body: none
   - Path: cardDisputeId
   - Query: none
   - Expect: none
   - Bindings: cardDisputeId <- dispute.cardDisputeId
18. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `card_dispute.lose` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.cardDisputeId <- dispute.cardDisputeId

### Cancel a motor quote

- Journey id: `cancel_motor_quote`
- Steps: 7

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: subjectId, tenantId, productId, kind, kindVersion, attributes, declaredValue, createdAt, metadata
   - Bindings: none
6. `motor_policy_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/motor-policies`, scopes motor_policy:write, idempotency required, receipt yes
   - Body: coverageAmount, coverageDescription, currency, expiresAt, insurerAccountId, policyholderAccountId, premiumAmount, productId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: insurerAccountId <- insurer_account.accountId, policyholderAccountId <- policyholder_account.accountId, subject <- vehicle.subjectId
7. `motor_policy_cancel`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/motor-policies/{motorPolicyId}/cancel`, scopes motor_policy:write, idempotency required, receipt yes
   - Body: none
   - Path: motorPolicyId
   - Query: none
   - Expect: none
   - Bindings: motorPolicyId <- policy.motorPolicyId

### Cancel a vehicle escrow

- Journey id: `cancel_vehicle_escrow`
- Steps: 12

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: subjectId, tenantId, productId, kind, kindVersion, attributes, declaredValue, createdAt, metadata
   - Bindings: none
6. `motor_policy_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/motor-policies`, scopes motor_policy:write, idempotency required, receipt yes
   - Body: coverageAmount, coverageDescription, currency, expiresAt, insurerAccountId, policyholderAccountId, premiumAmount, productId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: insurerAccountId <- seller_account.accountId, policyholderAccountId <- buyer_account.accountId, subject <- vehicle.subjectId
7. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- buyer_account.accountId
8. `vehicle_escrow_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-escrows`, scopes vehicle_escrow:write, idempotency required, receipt yes
   - Body: buyerAccountId, currency, policyId, price, productId, sellerAccountId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: buyerAccountId <- buyer_account.accountId, policyId <- policy.motorPolicyId, sellerAccountId <- seller_account.accountId, subject <- vehicle.subjectId
9. `vehicle_escrow_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-escrows/{vehicleEscrowId}/fund`, scopes transfer:write, vehicle_escrow:write, idempotency required, receipt yes
   - Body: none
   - Path: vehicleEscrowId
   - Query: none
   - Expect: none
   - Bindings: vehicleEscrowId <- escrow.vehicleEscrowId
10. `vehicle_escrow_quote_cancel`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-escrows/{vehicleEscrowId}/quote-cancel`, scopes vehicle_escrow:write, idempotency required, receipt yes
   - Body: none
   - Path: vehicleEscrowId
   - Query: none
   - Expect: none
   - Bindings: vehicleEscrowId <- escrow.vehicleEscrowId
11. `vehicle_escrow_confirm_cancel`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-escrows/{vehicleEscrowId}/confirm-cancel`, scopes transfer:write, vehicle_escrow:write, idempotency required, receipt yes
   - Body: none
   - Path: vehicleEscrowId
   - Query: none
   - Expect: none
   - Bindings: vehicleEscrowId <- escrow.vehicleEscrowId
12. `vehicle_escrow_collect_penalty`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-escrows/{vehicleEscrowId}/collect-penalty`, scopes transfer:write, vehicle_escrow:write, idempotency required, receipt yes
   - Body: none
   - Path: vehicleEscrowId
   - Query: none
   - Expect: none
   - Bindings: vehicleEscrowId <- escrow.vehicleEscrowId

### Delist a vehicle

- Journey id: `delist_vehicle`
- Steps: 6

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: subjectId, tenantId, productId, kind, kindVersion, attributes, declaredValue, createdAt, metadata
   - Bindings: none
5. `vehicle_listing_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-listings`, scopes vehicle_listing:write, idempotency required, receipt yes
   - Body: askingPrice, currency, headline, productId, sellerAccountId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: sellerAccountId <- seller_account.accountId, subject <- vehicle.subjectId
6. `vehicle_listing_delist`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-listings/{vehicleListingId}/delist`, scopes vehicle_listing:write, idempotency required, receipt yes
   - Body: none
   - Path: vehicleListingId
   - Query: none
   - Expect: none
   - Bindings: vehicleListingId <- listing.vehicleListingId

### Release a flight hold

- Journey id: `flight_hold_released`
- Steps: 9

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- operator_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- operator_customer.customerId
7. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
8. `flight_booking_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/flight-bookings`, scopes flight_booking:write, idempotency required, receipt yes
   - Body: bookingNote, currency, departsAt, fareAmount, holdExpiresAt, operatorAccountId, productId, subject, travelerAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: operatorAccountId <- operator.accountId, subject <- subject.subjectId, travelerAccountId <- traveler.accountId
9. `flight_booking_release`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/flight-bookings/{flightBookingId}/release`, scopes flight_booking:write, idempotency required, receipt yes
   - Body: none
   - Path: flightBookingId
   - Query: none
   - Expect: none
   - Bindings: flightBookingId <- booking.flightBookingId

### Release a held stay

- Journey id: `release_held_stay`
- Steps: 7

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
6. `hotel_stay_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/hotel-stays`, scopes hotel_stay:write, idempotency required, receipt yes
   - Body: checkInAt, checkOutAt, currency, guestAccountId, holdExpiresAt, productId, propertyAccountId, rateAmount, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: guestAccountId <- guest_account.accountId, propertyAccountId <- property_account.accountId, subject <- stay_subject.subjectId
7. `hotel_stay_release`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/hotel-stays/{hotelStayId}/release`, scopes hotel_stay:write, idempotency required, receipt yes
   - Body: none
   - Path: hotelStayId
   - Query: none
   - Expect: none
   - Bindings: hotelStayId <- stay.hotelStayId

### Complete a travel package

- Journey id: `complete_travel_package`
- Steps: 7

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `travel_package_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/travel-packages`, scopes travel_package:write, idempotency required, receipt yes
   - Body: departAt, memo, payerAccountId, productId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: payerAccountId <- payer_account.accountId, subject <- traveler_subject.subjectId
6. `travel_package_confirm`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/travel-packages/{travelPackageId}/confirm`, scopes travel_package:write, idempotency required, receipt yes
   - Body: none
   - Path: travelPackageId
   - Query: none
   - Expect: none
   - Bindings: travelPackageId <- package.travelPackageId
7. `travel_package_complete`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/travel-packages/{travelPackageId}/complete`, scopes travel_package:write, idempotency required, receipt yes
   - Body: none
   - Path: travelPackageId
   - Query: none
   - Expect: none
   - Bindings: travelPackageId <- package.travelPackageId

### Run an active wallet cycle

- Journey id: `wallet_active_cycle`
- Steps: 9

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- holder_account.accountId
5. `wallet_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallets`, scopes wallet:write, idempotency required, receipt yes
   - Body: currency, holderAccountId, limitAmount, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: holderAccountId <- holder_account.accountId
6. `wallet_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallets/{walletId}/activate`, scopes wallet:write, idempotency required, receipt yes
   - Body: none
   - Path: walletId
   - Query: none
   - Expect: none
   - Bindings: walletId <- wallet.walletId
7. `wallet_topup`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallets/{walletId}/topup`, scopes transfer:write, wallet:write, idempotency required, receipt yes
   - Body: amount
   - Path: walletId
   - Query: none
   - Expect: none
   - Bindings: walletId <- wallet.walletId
8. `wallet_withdraw`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallets/{walletId}/withdraw`, scopes transfer:write, wallet:write, idempotency required, receipt yes
   - Body: amount
   - Path: walletId
   - Query: none
   - Expect: none
   - Bindings: walletId <- wallet.walletId
9. `wallet_close`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallets/{walletId}/close`, scopes wallet:write, idempotency required, receipt yes
   - Body: none
   - Path: walletId
   - Query: none
   - Expect: none
   - Bindings: walletId <- wallet.walletId

### Refund a wallet spend

- Journey id: `refund_wallet_spend`
- Steps: 11

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- holder_account.accountId
6. `wallet_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallets`, scopes wallet:write, idempotency required, receipt yes
   - Body: currency, holderAccountId, limitAmount, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: holderAccountId <- holder_account.accountId
7. `wallet_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallets/{walletId}/activate`, scopes wallet:write, idempotency required, receipt yes
   - Body: none
   - Path: walletId
   - Query: none
   - Expect: none
   - Bindings: walletId <- wallet.walletId
8. `wallet_topup`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallets/{walletId}/topup`, scopes transfer:write, wallet:write, idempotency required, receipt yes
   - Body: amount
   - Path: walletId
   - Query: none
   - Expect: none
   - Bindings: walletId <- wallet.walletId
9. `wallet_spend_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallet-spends`, scopes wallet_spend:write, idempotency required, receipt yes
   - Body: amount, beneficiaryAccountId, productId, walletId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: beneficiaryAccountId <- beneficiary_account.accountId, walletId <- wallet.walletId
10. `wallet_spend_post`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallet-spends/{walletSpendId}/post`, scopes transfer:write, wallet_spend:write, idempotency required, receipt yes
   - Body: none
   - Path: walletSpendId
   - Query: none
   - Expect: none
   - Bindings: walletSpendId <- spend.walletSpendId
11. `wallet_spend_refund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/wallet-spends/{walletSpendId}/refund`, scopes transfer:write, wallet_spend:write, idempotency required, receipt yes
   - Body: none
   - Path: walletSpendId
   - Query: none
   - Expect: none
   - Bindings: walletSpendId <- spend.walletSpendId

### Advance and write off credit

- Journey id: `advanced_credit_written_off`
- Steps: 10

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- borrower_customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- borrower_customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- lender_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- lender_customer.customerId
7. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- lender.accountId
8. `credit_agreement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements`, scopes credit_agreement:write, idempotency required, receipt yes
   - Body: borrowerAccountId, currency, fundingAccountId, principal, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- borrower.accountId, fundingAccountId <- lender.accountId
9. `credit_agreement_advance`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements/{creditAgreementId}/advance`, scopes credit_agreement:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: creditAgreementId
   - Query: none
   - Expect: none
   - Bindings: creditAgreementId <- agreement.creditAgreementId
10. `credit_agreement_write_off`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements/{creditAgreementId}/write-off`, scopes credit_agreement:write, idempotency required, receipt yes
   - Body: none
   - Path: creditAgreementId
   - Query: none
   - Expect: none
   - Bindings: creditAgreementId <- agreement.creditAgreementId

### Write off an overdue installment

- Journey id: `write_off_overdue_installment`
- Steps: 10

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- funding_account.accountId
6. `credit_agreement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements`, scopes credit_agreement:write, idempotency required, receipt yes
   - Body: borrowerAccountId, currency, fundingAccountId, principal, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- borrower_account.accountId, fundingAccountId <- funding_account.accountId
7. `credit_agreement_advance`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements/{creditAgreementId}/advance`, scopes credit_agreement:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: creditAgreementId
   - Query: none
   - Expect: none
   - Bindings: creditAgreementId <- agreement.creditAgreementId
8. `installment_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/installments`, scopes installment:write, idempotency required, receipt yes
   - Body: agreementId, amount, borrowerAccountId, currency, dueAt, fundingAccountId, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: agreementId <- agreement.creditAgreementId, borrowerAccountId <- borrower_account.accountId, fundingAccountId <- funding_account.accountId
9. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `installment.mark_overdue` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.installmentId <- installment.installmentId
10. `installment_write_off`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/installments/{installmentId}/write-off`, scopes installment:write, idempotency required, receipt yes
   - Body: none
   - Path: installmentId
   - Query: none
   - Expect: none
   - Bindings: installmentId <- installment.installmentId

### Approve and close an exposure

- Journey id: `approved_exposure_closed`
- Steps: 6

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `exposure_arrangement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/exposure-arrangements`, scopes exposure_arrangement:write, idempotency required, receipt yes
   - Body: approvedAmountsCapAmount, borrowerAccountId, borrowerEntityId, currency, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- borrower_account.accountId
5. `exposure_arrangement_approve`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/exposure-arrangements/{exposureArrangementId}/approve`, scopes exposure_arrangement:write, idempotency required, receipt yes
   - Body: none
   - Path: exposureArrangementId
   - Query: none
   - Expect: none
   - Bindings: exposureArrangementId <- arrangement.exposureArrangementId
6. `exposure_arrangement_close`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/exposure-arrangements/{exposureArrangementId}/close`, scopes exposure_arrangement:write, idempotency required, receipt yes
   - Body: none
   - Path: exposureArrangementId
   - Query: none
   - Expect: none
   - Bindings: exposureArrangementId <- arrangement.exposureArrangementId

### Assign and recall a collections case

- Journey id: `collections_case_recalled`
- Steps: 14

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- borrower_customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- borrower_customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- lender_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- lender_customer.customerId
7. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- lender.accountId
8. `credit_agreement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements`, scopes credit_agreement:write, idempotency required, receipt yes
   - Body: borrowerAccountId, currency, fundingAccountId, principal, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- borrower.accountId, fundingAccountId <- lender.accountId
9. `credit_agreement_advance`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements/{creditAgreementId}/advance`, scopes credit_agreement:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: creditAgreementId
   - Query: none
   - Expect: none
   - Bindings: creditAgreementId <- agreement.creditAgreementId
10. `installment_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/installments`, scopes installment:write, idempotency required, receipt yes
   - Body: agreementId, amount, borrowerAccountId, currency, dueAt, fundingAccountId, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: agreementId <- agreement.creditAgreementId, borrowerAccountId <- borrower.accountId, fundingAccountId <- lender.accountId
11. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `installment.mark_overdue` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.installmentId <- installment.installmentId
12. `collections_case_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/collections-cases`, scopes collections_case:write, idempotency required, receipt yes
   - Body: agreementId, allowedContactEndHour, allowedContactStartHour, currency, debtorAccountId, maxContactAttemptsPer30Days, memo, productId, recoveryAccountId, referredAmount, triggeringInstallmentId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: agreementId <- agreement.creditAgreementId, debtorAccountId <- borrower.accountId, recoveryAccountId <- lender.accountId, triggeringInstallmentId <- installment.installmentId
13. `collections_case_assign`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/collections-cases/{collectionsCaseId}/assign`, scopes collections_case:write, idempotency required, receipt yes
   - Body: none
   - Path: collectionsCaseId
   - Query: none
   - Expect: none
   - Bindings: collectionsCaseId <- case.collectionsCaseId
14. `collections_case_recall`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/collections-cases/{collectionsCaseId}/recall`, scopes collections_case:write, idempotency required, receipt yes
   - Body: none
   - Path: collectionsCaseId
   - Query: none
   - Expect: none
   - Bindings: collectionsCaseId <- case.collectionsCaseId

### Record and void a contact attempt

- Journey id: `contact_attempt_voided`
- Steps: 15

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- borrower_customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- borrower_customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- lender_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- lender_customer.customerId
7. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- lender.accountId
8. `credit_agreement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements`, scopes credit_agreement:write, idempotency required, receipt yes
   - Body: borrowerAccountId, currency, fundingAccountId, principal, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- borrower.accountId, fundingAccountId <- lender.accountId
9. `credit_agreement_advance`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements/{creditAgreementId}/advance`, scopes credit_agreement:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: creditAgreementId
   - Query: none
   - Expect: none
   - Bindings: creditAgreementId <- agreement.creditAgreementId
10. `installment_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/installments`, scopes installment:write, idempotency required, receipt yes
   - Body: agreementId, amount, borrowerAccountId, currency, dueAt, fundingAccountId, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: agreementId <- agreement.creditAgreementId, borrowerAccountId <- borrower.accountId, fundingAccountId <- lender.accountId
11. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `installment.mark_overdue` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.installmentId <- installment.installmentId
12. `collections_case_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/collections-cases`, scopes collections_case:write, idempotency required, receipt yes
   - Body: agreementId, allowedContactEndHour, allowedContactStartHour, currency, debtorAccountId, maxContactAttemptsPer30Days, memo, productId, recoveryAccountId, referredAmount, triggeringInstallmentId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: agreementId <- agreement.creditAgreementId, debtorAccountId <- borrower.accountId, recoveryAccountId <- lender.accountId, triggeringInstallmentId <- installment.installmentId
13. `collections_case_assign`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/collections-cases/{collectionsCaseId}/assign`, scopes collections_case:write, idempotency required, receipt yes
   - Body: none
   - Path: collectionsCaseId
   - Query: none
   - Expect: none
   - Bindings: collectionsCaseId <- case.collectionsCaseId
14. `contact_attempt_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/contact-attempts`, scopes contact_attempt:write, idempotency required, receipt yes
   - Body: attemptedAt, caseId, channel, note, outcome, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: caseId <- case.collectionsCaseId
15. `contact_attempt_void`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/contact-attempts/{contactAttemptId}/void`, scopes contact_attempt:write, idempotency required, receipt yes
   - Body: none
   - Path: contactAttemptId
   - Query: none
   - Expect: none
   - Bindings: contactAttemptId <- attempt.contactAttemptId

### Cancel a scheduled payout

- Journey id: `cancel_scheduled_payout`
- Steps: 7

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
6. `payout_run_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/payout-runs`, scopes payout_run:write, idempotency required, receipt yes
   - Body: currency, earnerAccountId, netAmount, payoutFundingAccountId, productId, runAt, withholdingAccountId, withholdingAmount
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: earnerAccountId <- earner_account.accountId, payoutFundingAccountId <- funding_account.accountId, withholdingAccountId <- withholding_account.accountId
7. `payout_run_cancel`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/payout-runs/{payoutRunId}/cancel`, scopes payout_run:write, idempotency required, receipt yes
   - Body: none
   - Path: payoutRunId
   - Query: none
   - Expect: none
   - Bindings: payoutRunId <- run.payoutRunId

### Fail an underfunded round

- Journey id: `underfunded_round_failed`
- Steps: 5

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `funding_round_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/funding-rounds`, scopes funding_round:write, idempotency required, receipt yes
   - Body: borrowerAccountId, closeBy, currency, memo, productId, targetAmount
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- borrower.accountId
5. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `funding_round.fail` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.fundingRoundId <- round.fundingRoundId

### Refund a failed pledge

- Journey id: `failed_pledge_refunded`
- Steps: 11

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- borrower_customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- borrower_customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- investor_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- investor_customer.customerId
7. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- investor.accountId
8. `funding_round_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/funding-rounds`, scopes funding_round:write, idempotency required, receipt yes
   - Body: borrowerAccountId, closeBy, currency, memo, productId, targetAmount
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- borrower.accountId
9. `funding_commitment_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/funding-commitments`, scopes funding_commitment:write, transfer:write, idempotency required, receipt yes
   - Body: amount, committedAt, fundingRoundId, investorAccountId, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: fundingRoundId <- round.fundingRoundId, investorAccountId <- investor.accountId
10. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `funding_round.fail` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.fundingRoundId <- round.fundingRoundId
11. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `funding_commitment.refund` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.fundingCommitmentId <- commitment.fundingCommitmentId

### Pay a lender distribution

- Journey id: `pay_lender_distribution`
- Steps: 20

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
7. `funding_round_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/funding-rounds`, scopes funding_round:write, idempotency required, receipt yes
   - Body: borrowerAccountId, closeBy, currency, memo, productId, targetAmount
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- pool_account.accountId
8. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- lender_account.accountId
9. `sandbox_account_fund`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/account-funding`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: destinationAccountId <- second_lender_account.accountId
10. `funding_commitment_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/funding-commitments`, scopes funding_commitment:write, transfer:write, idempotency required, receipt yes
   - Body: amount, committedAt, fundingRoundId, investorAccountId, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: fundingRoundId <- round.fundingRoundId, investorAccountId <- lender_account.accountId
11. `funding_commitment_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/funding-commitments`, scopes funding_commitment:write, transfer:write, idempotency required, receipt yes
   - Body: amount, committedAt, fundingRoundId, investorAccountId, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: fundingRoundId <- round.fundingRoundId, investorAccountId <- second_lender_account.accountId
12. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `funding_round.activate` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.fundingRoundId <- round.fundingRoundId
13. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `funding_commitment.collect` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.fundingCommitmentId <- commitment.fundingCommitmentId
14. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `funding_commitment.collect` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.fundingCommitmentId <- second_commitment.fundingCommitmentId
15. `funding_round_close`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/funding-rounds/{fundingRoundId}/close`, scopes funding_round:write, idempotency required, receipt yes
   - Body: none
   - Path: fundingRoundId
   - Query: none
   - Expect: none
   - Bindings: fundingRoundId <- round.fundingRoundId
16. `credit_agreement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements`, scopes credit_agreement:write, idempotency required, receipt yes
   - Body: borrowerAccountId, currency, fundingAccountId, fundingRoundId, principal, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: borrowerAccountId <- borrower_account.accountId, fundingAccountId <- pool_account.accountId, fundingRoundId <- round.fundingRoundId
17. `credit_agreement_advance`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements/{creditAgreementId}/advance`, scopes credit_agreement:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: creditAgreementId
   - Query: none
   - Expect: none
   - Bindings: creditAgreementId <- agreement.creditAgreementId
18. `lender_distribution_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/lender-distributions`, scopes lender_distribution:write, idempotency required, receipt yes
   - Body: claimedAt, creditAgreementId, fundingCommitmentId, fundingRoundId, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: creditAgreementId <- agreement.creditAgreementId, fundingCommitmentId <- commitment.fundingCommitmentId, fundingRoundId <- round.fundingRoundId
19. `credit_agreement_settle`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/credit-agreements/{creditAgreementId}/settle`, scopes credit_agreement:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: creditAgreementId
   - Query: none
   - Expect: none
   - Bindings: creditAgreementId <- agreement.creditAgreementId
20. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `lender_distribution.payout` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.lenderDistributionId <- distribution.lenderDistributionId

### Disband an unfilled circle

- Journey id: `disband_unfilled_circle`
- Steps: 2

1. `savings_circle_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/savings-circles`, scopes savings_circle:write, idempotency required, receipt yes
   - Body: contributionAmount, currency, memberCount, memo, productId, startAt
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `savings_circle_disband`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/savings-circles/{savingsCircleId}/disband`, scopes savings_circle:write, idempotency required, receipt yes
   - Body: none
   - Path: savingsCircleId
   - Query: none
   - Expect: none
   - Bindings: savingsCircleId <- circle.savingsCircleId

### Withdraw an unstarted membership

- Journey id: `membership_withdrawn`
- Steps: 7

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- member_customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- member_customer.customerId
4. `savings_circle_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/savings-circles`, scopes savings_circle:write, idempotency required, receipt yes
   - Body: contributionAmount, currency, memberCount, memo, productId, startAt
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `circle_membership_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/circle-memberships`, scopes circle_membership:write, idempotency required, receipt yes
   - Body: joinedAt, memberAccountId, payoutAmount, position, productId, receiveAt, savingsCircleId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: memberAccountId <- member.accountId, savingsCircleId <- circle.savingsCircleId
6. `savings_circle_disband`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/savings-circles/{savingsCircleId}/disband`, scopes savings_circle:write, idempotency required, receipt yes
   - Body: none
   - Path: savingsCircleId
   - Query: none
   - Expect: none
   - Bindings: savingsCircleId <- circle.savingsCircleId
7. `sandbox_platform_fire`
   - Actor: platform
   - Sandbox trigger: The platform fires `circle_membership.withdraw` in normal lifecycle processing; sandbox fires it now.
   - Action: platform lifecycle trigger
   - Route: `POST /v1/sandbox/platform/fire`, scopes no scopes required, idempotency required, receipt yes
   - Body: input, operation
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: input.circleMembershipId <- membership.circleMembershipId

### Abandon an unfunded sale

- Journey id: `abandon_unfunded_sale`
- Steps: 8

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
6. `subject_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/subjects`, scopes product:write, idempotency required, receipt yes
   - Body: attributes, declaredValue, kind, kindVersion, productId
   - Path: none
   - Query: none
   - Expect: subjectId, tenantId, productId, kind, kindVersion, attributes, declaredValue, createdAt, metadata
   - Bindings: none
7. `sale_settlement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sale-settlements`, scopes sale_settlement:write, idempotency required, receipt yes
   - Body: buyerAccountId, currency, piece1Amount, piece2Amount, piece3Amount, platformAccountId, price, productId, sellerAccountId, serviceFeeAmount, subject
   - Path: none
   - Query: none
   - Expect: createdAt, fields, instrumentId, productId, refs, saleSettlementId, status, tenantId, updatedAt
   - Bindings: buyerAccountId <- buyer_account.accountId, platformAccountId <- platform_account.accountId, sellerAccountId <- seller_account.accountId, subject <- subject.subjectId
8. `sale_settlement_abandon`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sale-settlements/{saleSettlementId}/abandon`, scopes sale_settlement:write, idempotency required, receipt yes
   - Body: none
   - Path: saleSettlementId
   - Query: none
   - Expect: none
   - Bindings: saleSettlementId <- sale.saleSettlementId

### Abandon a trade settlement

- Journey id: `abandon_trade_settlement`
- Steps: 7

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
5. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
6. `trade_settlement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/trade-settlements`, scopes trade_settlement:write, idempotency required, receipt yes
   - Body: currency, platformAccountId, productId, sideAAccountId, sideAAmount, sideAServiceFeeAmount, sideBAccountId, sideBAmount, sideBServiceFeeAmount
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: platformAccountId <- platform_account.accountId, sideAAccountId <- side_a_account.accountId, sideBAccountId <- side_b_account.accountId
7. `trade_settlement_abandon`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/trade-settlements/{tradeSettlementId}/abandon`, scopes trade_settlement:write, idempotency required, receipt yes
   - Body: none
   - Path: tradeSettlementId
   - Query: none
   - Expect: none
   - Bindings: tradeSettlementId <- trade.tradeSettlementId

### Abandon an unfunded hold

- Journey id: `unfunded_hold_abandoned`
- Steps: 11

1. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
2. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- customer.customerAccessId
3. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- customer.customerId
4. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
5. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- payee_customer.customerAccessId
6. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- payee_customer.customerId
7. `sandbox_customer_onboard`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-onboarding`, scopes customer:write, idempotency required, receipt yes
   - Body: displayName, productId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: none
8. `sandbox_customer_access_activate`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/sandbox/customer-access/{customerAccessId}/activate`, scopes customer:write, idempotency required, receipt yes
   - Body: none
   - Path: customerAccessId
   - Query: none
   - Expect: none
   - Bindings: customerAccessId <- platform_customer.customerAccessId
9. `account_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/accounts`, scopes account:write, idempotency required, receipt yes
   - Body: currency, owner, role
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: owner.id <- platform_customer.customerId
10. `held_settlement_create`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/held-settlements`, scopes held_settlement:write, idempotency required, receipt yes
   - Body: currency, heldAmount, payeeAccountId, payerAccountId, platformAccountId, productId, reference, releaseDueAt, serviceFeeAmount
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: payeeAccountId <- payee.accountId, payerAccountId <- payer.accountId, platformAccountId <- platform.accountId
11. `held_settlement_abandon`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/held-settlements/{heldSettlementId}/abandon`, scopes held_settlement:write, idempotency required, receipt yes
   - Body: none
   - Path: heldSettlementId
   - Query: none
   - Expect: none
   - Bindings: heldSettlementId <- hold.heldSettlementId

## Cost

This program carries no priced effect.
