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

# Vehicle Escrow Marketplace

> The frozen Vehicle Escrow Marketplace Product Build, version 1.

- Composition id: `vehicle_escrow_marketplace`
- Version: 1
- Digest: `4ee135b43bc02e21c760bef7f1e400b0313086a84e06138ef20ebbd57eb134c3`
- Currencies: `SAR`
- Webhook events: 26

## Instruments

| Instrument | Title | States | Actions |
| --- | --- | --- | --- |
| [`motor_policy`](../instruments/motor_policy.md) | Motor policy | 7 | create |
| [`vehicle_escrow`](../instruments/vehicle_escrow.md) | Vehicle escrow | 6 | confirm_cancel, create, fund, release |
| [`vehicle_listing`](../instruments/vehicle_listing.md) | Vehicle listing | 4 | create |

## Journeys

### 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: `motor_policy.create`
   - 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: `motor_policy.create`
   - 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: `vehicle_escrow.create`
   - 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: `vehicle_escrow.fund`
   - 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: `vehicle_escrow.confirm_cancel`
   - 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: `vehicle_listing.create`
   - 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

### Bind protection for the vehicle

- Journey id: `vehicle_escrow_motor_policy`
- Steps: 13

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 <- buyer.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 <- buyer.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 <- buyer_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 <- seller.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 <- seller.customerId
8. `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
9. `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.customerAccessId
10. `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.customerId
11. `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
12. `motor_policy_create`
   - Actor: product
   - Action: `motor_policy.create`
   - 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: policyholderAccountId <- buyer_account.accountId, insurerAccountId <- insurer_account.accountId, subject <- vehicle.subjectId
13. `motor_policy_bind`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/motor-policies/{motorPolicyId}/bind`, scopes motor_policy:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: motorPolicyId
   - Query: none
   - Expect: none
   - Bindings: motorPolicyId <- policy.motorPolicyId

### Sell a vehicle

- Journey id: `vehicle_escrow_listing_sale`
- Steps: 19

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 <- buyer.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 <- buyer.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 <- buyer_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 <- seller.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 <- seller.customerId
8. `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
9. `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.customerAccessId
10. `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.customerId
11. `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
12. `motor_policy_create`
   - Actor: product
   - Action: `motor_policy.create`
   - 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: policyholderAccountId <- buyer_account.accountId, insurerAccountId <- insurer_account.accountId, subject <- vehicle.subjectId
13. `motor_policy_bind`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/motor-policies/{motorPolicyId}/bind`, scopes motor_policy:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: motorPolicyId
   - Query: none
   - Expect: none
   - Bindings: motorPolicyId <- policy.motorPolicyId
14. `vehicle_escrow_create`
   - Actor: product
   - Action: `vehicle_escrow.create`
   - 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, sellerAccountId <- seller_account.accountId, policyId <- policy.motorPolicyId, subject <- vehicle.subjectId
15. `vehicle_escrow_fund`
   - Actor: product
   - Action: `vehicle_escrow.fund`
   - 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
16. `vehicle_listing_create`
   - Actor: product
   - Action: `vehicle_listing.create`
   - Route: `POST /v1/vehicle-listings`, scopes vehicle_listing:write, idempotency required, receipt yes
   - Body: askingPrice, currency, escrowId, headline, productId, sellerAccountId, subject
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: escrowId <- escrow.vehicleEscrowId, sellerAccountId <- seller_account.accountId, subject <- vehicle.subjectId
17. `vehicle_listing_reserve`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-listings/{vehicleListingId}/reserve`, scopes vehicle_listing:write, idempotency required, receipt yes
   - Body: none
   - Path: vehicleListingId
   - Query: none
   - Expect: none
   - Bindings: vehicleListingId <- listing.vehicleListingId
18. `vehicle_escrow_release`
   - Actor: product
   - Action: `vehicle_escrow.release`
   - Route: `POST /v1/vehicle-escrows/{vehicleEscrowId}/release`, scopes transfer:write, vehicle_escrow:write, idempotency required, receipt yes
   - Body: none
   - Path: vehicleEscrowId
   - Query: none
   - Expect: none
   - Bindings: vehicleEscrowId <- escrow.vehicleEscrowId
19. `vehicle_listing_complete`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/vehicle-listings/{vehicleListingId}/complete`, scopes vehicle_listing:write, idempotency required, receipt yes
   - Body: none
   - Path: vehicleListingId
   - Query: none
   - Expect: none
   - Bindings: vehicleListingId <- listing.vehicleListingId

### Onboard a buyer

- Journey id: `vehicle_escrow_buyer_onboarding`
- Steps: 2

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 <- buyer.customerAccessId

### Move deal funds

- Journey id: `vehicle_escrow_money_movement`
- 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 <- payer.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 <- payer.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 <- source.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 <- payee.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 <- payee.customerId
8. `internal_transfer_reserve`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/internal-transfers/reserve`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId, memo, sourceAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: sourceAccountId <- source.accountId, destinationAccountId <- destination.accountId
9. `internal_transfer_post`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/internal-transfers/{transferId}/post`, scopes transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: transferId
   - Query: none
   - Expect: none
   - Bindings: transferId <- transfer.transferId

### Void a deal transfer

- Journey id: `vehicle_escrow_fund_cancel`
- 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 <- payer.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 <- payer.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 <- source.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 <- payee.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 <- payee.customerId
8. `internal_transfer_reserve`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/internal-transfers/reserve`, scopes transfer:write, idempotency required, receipt yes
   - Body: amount, currency, destinationAccountId, memo, sourceAccountId
   - Path: none
   - Query: none
   - Expect: none
   - Bindings: sourceAccountId <- source.accountId, destinationAccountId <- destination.accountId
9. `internal_transfer_void`
   - Actor: product
   - Action: platform write
   - Route: `POST /v1/internal-transfers/{transferId}/void`, scopes transfer:write, idempotency required, receipt yes
   - Body: reason
   - Path: transferId
   - Query: none
   - Expect: none
   - Bindings: transferId <- transfer.transferId

## Cost

Cost table version 2026-09-02.1. Flat amounts are multiplied by the action count; basis points price the meter's moved amount, which an action count does not determine.

| Instrument | Action | Effect | Meter | Flat per action | Rate on meter | 1,000 per month | 100,000 per month | 10,000,000 per month |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `motor_policy` | `bind` | `decides.insurance_carrier` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `motor_policy` | `bind` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `motor_policy` | `deny_claim` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `motor_policy` | `expire` | `schedules.due` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `motor_policy` | `open_claim` | `holds.reserve` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `motor_policy` | `open_claim` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `motor_policy` | `settle_claim` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `vehicle_escrow` | `collect_penalty` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `vehicle_escrow` | `confirm_cancel` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `vehicle_escrow` | `fund` | `moves.collection.pay_in` | `collection.pay_in.volume_sar` | 2.50 SAR | 16 bps | 2,500.00 SAR | 250,000.00 SAR | 25,000,000.00 SAR |
| `vehicle_escrow` | `quote_cancel` | `holds.quote` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `vehicle_escrow` | `quote_cancel` | `schedules.expiry` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `vehicle_escrow` | `release` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `vehicle_escrow` | `release` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `vehicle_listing` | `complete` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `vehicle_listing` | `reserve` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `vehicle_listing` | `unreserve` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| **Total flat** | | | | | | **7,750.00 SAR** | **775,000.00 SAR** | **77,500,000.00 SAR** |
