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

# SMB Expense Card

> The frozen SMB Expense Card Product Build, version 1.

- Composition id: `smb_expense_card`
- Version: 1
- Digest: `a235771d08128bed9a66127bf16d891805f6b753da369b25fc1ce4809e00ed95`
- Currencies: `SAR`
- Webhook events: 31

## Instruments

| Instrument | Title | States | Actions |
| --- | --- | --- | --- |
| [`card`](../instruments/card.md) | Card | 4 | activate, create |
| [`card_authorization`](../instruments/card_authorization.md) | Card authorization | 6 | approve, capture, create |
| [`card_dispute`](../instruments/card_dispute.md) | Card dispute | 4 | create, review, win |
| [`card_transaction`](../instruments/card_transaction.md) | Card transaction | 2 | create |
| [`cardholder`](../instruments/cardholder.md) | Cardholder | 4 | activate, create |

## Journeys

### 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: `cardholder.create`
   - 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: `cardholder.activate`
   - 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: `cardholder.create`
   - 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: `cardholder.activate`
   - 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: `card.create`
   - 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: `card.activate`
   - 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: `cardholder.create`
   - 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: `cardholder.activate`
   - 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: `card.create`
   - 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: `card.activate`
   - 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: `card_authorization.create`
   - 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: `cardholder.create`
   - 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: `cardholder.activate`
   - 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: `card.create`
   - 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: `card.activate`
   - 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: `card_authorization.create`
   - 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: `card_authorization.approve`
   - 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: `card_authorization.capture`
   - 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: `card_transaction.create`
   - 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: `cardholder.create`
   - 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: `cardholder.activate`
   - 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: `card.create`
   - 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: `card.activate`
   - 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: `card_authorization.create`
   - 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: `card_authorization.approve`
   - 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: `card_authorization.capture`
   - 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: `card_transaction.create`
   - 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: `card_dispute.create`
   - 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: `card_dispute.review`
   - 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

### Issue and authorize a card

- Journey id: `smb_card_issue_authorize`
- 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.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.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.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.customerId
8. `cardholder_create`
   - Actor: product
   - Action: `cardholder.create`
   - 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.customerId
9. `cardholder_activate`
   - Actor: product
   - Action: `cardholder.activate`
   - 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: `card.create`
   - 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: `card.activate`
   - 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: `card_authorization.create`
   - 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: `card_authorization.approve`
   - 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: `card_authorization.capture`
   - 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

### Onboard a business

- Journey id: `smb_business_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 <- business.customerAccessId

### Move reimbursement funds

- Journey id: `smb_reimbursement_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 reimbursement hold

- Journey id: `smb_reimbursement_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

### Resolve a card dispute

- Journey id: `smb_card_dispute`
- 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 <- holder.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.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.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.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: `cardholder.create`
   - 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.customerId
10. `cardholder_activate`
   - Actor: product
   - Action: `cardholder.activate`
   - 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: `card.create`
   - 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: `card.activate`
   - 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: `card_authorization.create`
   - 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: `card_authorization.approve`
   - 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: `card_authorization.capture`
   - 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: `card_transaction.create`
   - 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_dispute_create`
   - Actor: product
   - Action: `card_dispute.create`
   - 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
18. `card_dispute_review`
   - Actor: product
   - Action: `card_dispute.review`
   - 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
19. `card_dispute_win`
   - Actor: product
   - Action: `card_dispute.win`
   - Route: `POST /v1/card-disputes/{cardDisputeId}/win`, scopes card_dispute:write, transfer:write, idempotency required, receipt yes
   - Body: none
   - Path: cardDisputeId
   - Query: none
   - Expect: none
   - Bindings: cardDisputeId <- dispute.cardDisputeId

## 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 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `card` | `activate` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card` | `create` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card` | `unfreeze` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_authorization` | `approve` | `decides.banking_or_card_issuing` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_authorization` | `approve` | `holds.reserve` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_authorization` | `approve` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `card_authorization` | `approve` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_authorization` | `capture` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `card_authorization` | `create` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_authorization` | `expire` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `card_authorization` | `expire` | `schedules.due` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_authorization` | `reverse` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `card_dispute` | `create` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_dispute` | `lose` | `schedules.due` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_dispute` | `win` | `decides.banking_or_card_issuing` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_dispute` | `win` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| `card_dispute` | `win` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_transaction` | `create` | `reads.requires_refs` | `instrument.event.count` | 0.00 SAR | 0 bps | 0.00 SAR | 0.00 SAR | 0.00 SAR |
| `card_transaction` | `refund` | `moves.transfer.internal` | `transfer.internal.volume_sar` | 0.75 SAR | 11 bps | 750.00 SAR | 75,000.00 SAR | 7,500,000.00 SAR |
| **Total flat** | | | | | | **4,500.00 SAR** | **450,000.00 SAR** | **45,000,000.00 SAR** |
