# Error codes

461 error codes across 44 modules, generated from the platform source rather than maintained by hand.

## Error response shapes

Every failed request returns the same envelope: a single error object. Which of its fields are populated depends on why the request failed, so these are the four shapes a caller has to handle. The bodies are illustrative and carry no real data.

### 409 Business rule refused the request

The request was understood and rejected by a platform rule. This is the shape that carries a code from the catalog above, so branch on error.code rather than on the message text. The HTTP status is the one listed against the code.

```json
{
  "error": {
    "code": "Transactions:00042",
    "message": "This transaction has already been settled and cannot be voided.",
    "details": null,
    "data": null,
    "validationErrors": null
  }
}
```

### 400 Request failed validation

One or more fields were rejected before any rule ran. error.code is null on the envelope and the causes are in validationErrors, one entry per failure. An entry carries code when the validator declared a publishable one, and memberPaths when the full path says more than members does (an element inside a collection, for example). Both keys are omitted when they would add nothing.

```json
{
  "error": {
    "code": null,
    "message": "Your request is not valid!",
    "details": "The following errors were detected during validation.",
    "data": null,
    "validationErrors": [
      {
        "message": "'Amount' must be greater than 0.",
        "members": ["amount"]
      },
      {
        "message": "The currency code is not supported by this merchant.",
        "members": ["currency"],
        "code": "Transactions:00017"
      },
      {
        "message": "'Value' must not be empty.",
        "members": ["value"],
        "memberPaths": ["customFields[2].value"]
      }
    ]
  }
}
```

### 403 Caller is not authorized

The credential was accepted and does not carry what the operation requires. The code is the framework's, not a platform code, so it is worth matching on explicitly. Each operation page lists what it requires.

```json
{
  "error": {
    "code": "Volo.Authorization:010001",
    "message": "Authorization failed! Given policy has not granted.",
    "details": null,
    "data": null,
    "validationErrors": null
  }
}
```

### 500 Unexpected server fault

Something failed that no rule anticipated. There is no code to branch on and the message is deliberately generic: the diagnostic detail stays in the platform's logs rather than going to the caller. Retrying an unsafe operation after this risks a duplicate, so reconcile before you retry.

```json
{
  "error": {
    "code": null,
    "message": "An internal error occurred during your request!",
    "details": null,
    "data": null,
    "validationErrors": null
  }
}
```

## Codes by module

error.code carries one of these values, so a caller can branch on the cause without parsing message text. The status column is what this instance returns when the code is raised. A code with no message defined is listed rather than hidden: it still reaches a caller over the wire.

### Account

| Code | Status | Message |
| --- | --- | --- |
| `AccountPro:0001` | 403 | No message defined. |

### Account Updater

| Code | Status | Message |
| --- | --- | --- |
| `AccountUpdater:MerchantIdRequired` | 400 | A merchant is required for account updater queries. |
| `AccountUpdater:RunsAreReadOnly` | 403 | Account updater runs are read-only and cannot be created, changed, or deleted. |
| `AccountUpdater:SubmissionsAreReadOnly` | 403 | Account updater submissions are read-only and cannot be created, changed, or deleted. |
| `AccountUpdater:UseContTokenPaging` | 400 | This list must be paged with a continuation token. Use the continuation list endpoint. |

### Accounting

| Code | Status | Message |
| --- | --- | --- |
| `Accounting:ConnectionAlreadyExists` | 409 | An accounting connection for this provider already exists for the merchant. |
| `Accounting:ConnectionNotFound` | 404 | The requested accounting connection was not found. |
| `Accounting:DuplicateProviderKey` | 409 | More than one accounting provider is registered for the same key. |
| `Accounting:InvalidOAuthState` | 400 | The authorization response could not be validated. Please start the connection again. |
| `Accounting:NoActiveConnection` | 409 | No active accounting connection is configured for this merchant. |
| `Accounting:OAuthExchangeFailed` | 429 | Could not complete authorization with the accounting provider. |
| `Accounting:SyncRecordNotRetryable` | 409 | This sync record is not in a state that can be retried. |
| `Accounting:UnknownProvider` | 400 | No accounting provider is registered for the requested key. |

### Announcements

| Code | Status | Message |
| --- | --- | --- |
| `Announcements:00001` | 400 | The announcement title is required. |
| `Announcements:00002` | 400 | The announcement body is required. |
| `Announcements:00003` | 400 | Invalid scope configuration. Please verify the reseller or merchant selection. |
| `Announcements:00004` | 400 | Host-level announcements cannot have a tenant specified. |
| `Announcements:00005` | 400 | Reseller-scoped announcements require a reseller to be selected. |
| `Announcements:00006` | 400 | Merchant-scoped announcements require a merchant to be selected. |
| `Announcements:00007` | 403 | You do not have access to the specified scope. |
| `Announcements:00008` | 403 | You can only target resellers within your hierarchy. |
| `Announcements:00009` | 404 | The announcement was not found. |
| `Announcements:00010` | 400 | The start date must be before the end date. |
| `Announcements:00011` | 400 | Too many roles specified in the target audience. |
| `Announcements:00012` | 400 | Too many users specified in the target audience. |
| `Announcements:00013` | 400 | At least one role must be selected when targeting by roles. |
| `Announcements:00014` | 400 | At least one user must be selected when targeting by users. |
| `Announcements:00015` | 404 | User announcement state not found. |
| `Announcements:00016` | 404 | You do not have permission to modify this announcement. |

### Api Key Authorization

| Code | Status | Message |
| --- | --- | --- |
| `KEY_ENVIRONMENT_MISMATCH` | 403 | No message defined. |
| `KEY_EXPIRED` | 403 | No message defined. |
| `KEY_INVALID` | 403 | No message defined. |
| `KEY_REVOKED` | 403 | No message defined. |

### Authorization

| Code | Status | Message |
| --- | --- | --- |
| `Volo.Authorization:010001` | 403 | Authorization failed! Given policy has not granted. |
| `Volo.Authorization:010002` | 403 | Authorization failed! Given policy has not granted: {PolicyName} |
| `Volo.Authorization:010003` | 403 | Authorization failed! Given policy has not granted for given resource: {ResourceName} |
| `Volo.Authorization:010004` | 403 | Authorization failed! Given requirement has not granted for given resource: {ResourceName} |
| `Volo.Authorization:010005` | 403 | Authorization failed! Given requirements has not granted for given resource: {ResourceName} |

### Core

| Code | Status | Message |
| --- | --- | --- |
| `WinkPG:EntityLocked` | 409 | This {EntityType} is locked and cannot be modified. Unlock it first to make changes. |
| `WinkPG:LockReasonTooLong` | 400 | Lock reason cannot exceed {MaxLength} characters. |

### Current User

| Code | Status | Message |
| --- | --- | --- |
| `PGV2:010001` | 409 | You cannot change merchant while an operating context is active. Use the operating context to switch merchants. |

### Customers

| Code | Status | Message |
| --- | --- | --- |
| `Customers:00001` | 404 | The stored payment method on this contract could not be found. It may have been removed or invalidated. |
| `Customers:00002` | 404 | The stored payment method on this contract belongs to a merchant this customer cannot be charged under. |
| `Customers:RecurringBillingRunNotFound` | 404 | The recurring billing run could not be found. |
| `Customers:RecurringBillingTriggerFailed` | 429 | The recurring billing run could not be started. Please try again. |

### Dashboards

| Code | Status | Message |
| --- | --- | --- |
| `Dashboards:010001` | 404 | The source dashboard view was not found or is not accessible. |
| `Dashboards:010002` | 409 | The default dashboard view cannot be deleted. |
| `Dashboards:010003` | 403 | You have reached the maximum number of dashboard views ({Max}). |
| `Dashboards:010004` | 404 | The dashboard view was not found or is not accessible. |

### Favorites

| Code | Status | Message |
| --- | --- | --- |
| `Favorites:00001` | 400 | The favorite entity type is required. |
| `Favorites:00002` | 400 | The favorite label is required. |
| `Favorites:00003` | 400 | The favorite route is required. |
| `Favorites:00004` | 404 | The favorite was not found. |
| `Favorites:00005` | 403 | Maximum number of favorites reached. |
| `Favorites:00006` | 400 | Unknown favorite entity type. |

### Feature Management

| Code | Status | Message |
| --- | --- | --- |
| `Volo.Abp.FeatureManagement:InvalidFeatureValue` | 403 | {0} feature value is not valid! |

### Features

| Code | Status | Message |
| --- | --- | --- |
| `Volo.Feature:010001` | 403 | Feature is not enabled: {FeatureName} |
| `Volo.Feature:010002` | 403 | Required features are not enabled. All of these features must be enabled: {FeatureNames} |
| `Volo.Feature:010003` | 403 | Required features are not enabled. At least one of these features must be enabled: {FeatureNames} |

### File Management

| Code | Status | Message |
| --- | --- | --- |
| `FileManagement:0001` | 403 | '{DirectoryName}' is not a valid folder name for a folder. |
| `FileManagement:0002` | 403 | '{FileName}' is not a valid file name. |
| `FileManagement:0003` | 403 | Already exists a folder with the name '{DirectoryName}' |
| `FileManagement:0004` | 403 | You cannot move a folder to under to its child folder. |
| `FileManagement:0005` | 403 | Already exists a file with the name '{FileName}' |
| `FileManagement:0006` | 403 | Directory not found! |
| `FileManagement:0007` | 403 | Not enough storage size! Your total storage size is {StorageSize} and remaining {RemainingSize}. |

### Gdpr

| Code | Status | Message |
| --- | --- | --- |
| `Volo.Abp.Gdpr:010001` | 403 | You have previously requested to download personal data. Once the given request time period has passed, you can create a new one. |
| `Volo.Abp.Gdpr:010002` | 403 | Your personal data is still being prepared. You can download it at {GdprDataReadyTime}. |

### Global Features

| Code | Status | Message |
| --- | --- | --- |
| `Volo.GlobalFeature:010001` | 403 | The '{ServiceName}' service needs to enable '{GlobalFeatureName}' feature. |

### Hosted Payment Page

| Code | Status | Message |
| --- | --- | --- |
| `HostedPaymentPage:Ach:WebAuthorizationUnavailable` | 400 | The bank debit authorization could not be recorded, so the payment was not submitted. Please try again. |
| `HostedPaymentPage:HppSession:AmountModeNotApplicable` | 400 | An amount mode does not apply to a card-capture session. |
| `HostedPaymentPage:HppSession:BlockedField` | 403 | The field '{fieldKey}' cannot be pre-filled for security reasons. |
| `HostedPaymentPage:HppSession:BoundCustomerRejected` | 400 | The customer supplied for this session could not be used. |
| `HostedPaymentPage:HppSession:Cancelled` | 409 | This payment session was cancelled. |
| `HostedPaymentPage:HppSession:CaptureModeNotApplicable` | 400 | Authorize (delayed capture) is only available for a payment session, not for a Save Payment Method session. |
| `HostedPaymentPage:HppSession:ConfigInactive` | 409 | The hosted payment page is not currently active. |
| `HostedPaymentPage:HppSession:ConfigNotFound` | 404 | The hosted payment page was not found or is not available for the requesting merchant. Verify the page id and that the request was issued under the owning merchant's credentials. |
| `HostedPaymentPage:HppSession:ConsentCaptureBeforeConsume` | 409 | Consent capture cannot run until the session's transaction has been consumed. |
| `HostedPaymentPage:HppSession:ConsentCaptureMismatch` | 400 | Consent capture input does not match the session's recorded state. |
| `HostedPaymentPage:HppSession:ConsentCustomerUnresolvable` | 404 | A customer could not be resolved for this session, so the payment method cannot be saved. |
| `HostedPaymentPage:HppSession:ConsentNotRequested` | 409 | This payment session was not configured to capture stored-credential consent. |
| `HostedPaymentPage:HppSession:ConsentRequired` | 400 | You must authorize future stored-credential charges before this payment can be processed. |
| `HostedPaymentPage:HppSession:Consumed` | 409 | This payment session has already been used. |
| `HostedPaymentPage:HppSession:Disabled` | 403 | HPP sessions are not enabled for this tenant. |
| `HostedPaymentPage:HppSession:Expired` | 409 | This payment link has expired. Create a new payment session to send a fresh link. |
| `HostedPaymentPage:HppSession:ExpiryOutOfRange` | 400 | The session expiry must be between {minSeconds} and {maxSeconds} seconds. |
| `HostedPaymentPage:HppSession:FieldValueInvalid` | 400 | The value for field '{fieldKey}' exceeds the maximum allowed length. |
| `HostedPaymentPage:HppSession:InitialChargeRequiresCardOnlyPage` | 400 | A Save Payment Method with Initial Charge session requires a page that accepts card only. |
| `HostedPaymentPage:HppSession:InvalidField` | 400 | The field key '{fieldKey}' is not valid for this hosted payment page. |
| `HostedPaymentPage:HppSession:NotFound` | 404 | The payment session was not found or has expired. |
| `HostedPaymentPage:HppSession:ParentOriginNotAllowed` | 403 | The requested parent origin is not one of this page's allowed embedding domains. |
| `HostedPaymentPage:HppSession:PaymentLinkBaseUrlNotConfigured` | 403 | Payment links cannot be sent because the application's public URL is not configured. Contact your administrator. |
| `HostedPaymentPage:HppSession:RecurringPlanNotApplicable` | 400 | A recurring plan can only be supplied for a Save Payment Method with Initial Charge session. |
| `HostedPaymentPage:HppSession:RecurringPlanUnavailable` | 403 | The recurring plan for this payment session is no longer available. |
| `HostedPaymentPage:HppSession:ReleaseNotAllowed` | 409 | This payment session can no longer be released. |
| `HostedPaymentPage:HppSession:RequestedCredentialStorageInvalid` | 400 | RequestedCredentialStorage contains undefined flag bits outside the valid mask. |
| `HostedPaymentPage:HppSession:ResellerHostedPageDisabled` | 403 | Hosted payment pages are turned off for this reseller, so a new payment session cannot be started for this page. Turn on the Hosted Payment Page feature for the reseller and try again. |
| `HostedPaymentPage:HppSession:Revoked` | 409 | This session has already been revoked. |
| `HostedPaymentPage:HppSession:SaveCardOnlyConflictsWithPagePurpose` | 400 | This hosted payment page saves a card, so a session cannot ask for the save-card flow to be turned off. |
| `HostedPaymentPage:HppSession:SaveCardOnlyNotSupportedByProcessor` | 403 | Save Payment Method (no-charge) sessions are not available for this page: none of its offered payment methods can be stored without a charge for this merchant. |
| `HostedPaymentPage:HppSession:SmsNotSupported` | 403 | SMS delivery is not yet supported for payment links. |
| `HostedPaymentPage:Interaction:BeaconInvalid` | 400 | The interaction event could not be recorded. |
| `HostedPaymentPage:ResellerHostedPageDisabled` | 403 | Hosted payment pages are turned off for this reseller, so a page cannot be created for its merchants. Turn on the Hosted Payment Page feature for the reseller and try again. |
| `HostedPaymentPage:SaveCardPurposeNotSupportedByProcessor` | 403 | This page cannot be set to save a card: the merchant's processor does not support zero-dollar card verification. |
| `Hpp:Webhook:BlockedIpRange` | 400 | The webhook host '{Host}' resolves to an address range that is not allowed. |
| `Hpp:Webhook:HttpsOnly` | 400 | The webhook URL must use HTTPS. |
| `Hpp:Webhook:InvalidUrl` | 400 | The webhook URL is not a valid absolute URL. |
| `Hpp:Webhook:UnresolvableHost` | 400 | The webhook host '{Host}' could not be resolved. |

### Identity

| Code | Status | Message |
| --- | --- | --- |
| `Volo.Abp.Identity:010001` | 403 | You can not delete your own account! |
| `Volo.Abp.Identity:010002` | 403 | Can not set more than {MaxUserMembershipCount} organization unit for a user! |
| `Volo.Abp.Identity:010003` | 403 | Can not change password of an externally logged in user! |
| `Volo.Abp.Identity:010004` | 403 | There is already an organization unit with name {0}. Two units with same name can not be created in same level. |
| `Volo.Abp.Identity:010005` | 403 | Static roles can not be renamed. |
| `Volo.Abp.Identity:010006` | 403 | Static roles can not be deleted. |
| `Volo.Abp.Identity:010007` | 403 | You can't change your two factor setting. |
| `Volo.Abp.Identity:010008` | 403 | It's not allowed to change two factor setting. |
| `Volo.Abp.Identity:010009` | 403 | You can not delegate yourself. |
| `Volo.Abp.Identity:010010` | 403 | Invalid external login provider |
| `Volo.Abp.Identity:010011` | 403 | External login provider authenticate failed |
| `Volo.Abp.Identity:010012` | 403 | Local user already exists |
| `Volo.Abp.Identity:010013` | 403 | No user found in the file. |
| `Volo.Abp.Identity:010014` | 403 | Invalid import file format. |
| `Volo.Abp.Identity:010015` | 403 | Reached maximum allowed user count! This tenant is allowed to have a maximum of {MaxUserCount} users. |
| `Volo.Abp.Identity:010021` | 403 | Name exist: '{0}'. |

### Invoicing

| Code | Status | Message |
| --- | --- | --- |
| `Invoicing:Biller:ForeignBillerNotAllowed` | 404 | You cannot act as this biller. Choose a biller you have access to. |
| `Invoicing:CreditNote:AlreadyApplied` | 409 | This credit note has already been applied to an invoice. |
| `Invoicing:CreditNote:ExceedsBalance` | 409 | The credit note amount is greater than the balance due on the invoice. |
| `Invoicing:CreditNote:InvalidInvoiceStatus` | 409 | A credit note cannot be applied to an invoice in its current status. |
| `Invoicing:CreditNote:NotEditable` | 409 | A credit note in {status} status cannot be edited. |
| `Invoicing:CreditNote:NotFound` | 404 | The credit note could not be found. |
| `Invoicing:Deposit:DueDateAfterBalanceDueDate` | 400 | The deposit due date ({depositDueDate}) cannot be later than the balance due date ({balanceDueDate}). |
| `Invoicing:Deposit:ExceedsTotal` | 400 | The deposit amount ({depositAmount}) cannot be greater than the invoice total ({total}). |
| `Invoicing:Deposit:MustBePositive` | 400 | The deposit amount must be greater than zero. |
| `Invoicing:Deposit:PaymentRequired` | 400 | This invoice requires its deposit of {requiredAmount} to be paid first. The amount supplied was {providedAmount}. |
| `Invoicing:Export:RowLimitExceeded` | 400 | The export exceeds the maximum of {MaxRowCount} rows. Narrow the filters and try again. |
| `Invoicing:Feature:NotEnabled` | 403 | Invoicing is not enabled for this merchant. |
| `Invoicing:Invoice:AlreadySent` | 409 | This invoice has already been sent. |
| `Invoicing:Invoice:CannotCancelNonDraft` | 409 | Only a draft invoice can be cancelled. |
| `Invoicing:Invoice:CannotEditLocked` | 409 | A locked invoice cannot be edited. Unlock it first, then try again. |
| `Invoicing:Invoice:InvalidStatusTransition` | 409 | An invoice cannot move from {currentStatus} to {targetStatus}. |
| `Invoicing:Invoice:IsLocked` | 409 | This invoice is locked and cannot be changed. |
| `Invoicing:Invoice:NotFound` | 404 | The invoice could not be found. |
| `Invoicing:Invoice:PossibleDuplicate` | 409 | An invoice with the same customer, amount, and date already exists. Confirm this is not a duplicate before sending it. |
| `Invoicing:Limit:MonthlyInvoiceLimitReached` | 403 | The monthly invoice limit for this plan has been reached. |
| `Invoicing:LineItem:InvalidQuantity` | 400 | The line item quantity must be greater than zero. |
| `Invoicing:LineItem:InvalidUnitPrice` | 400 | The line item unit price cannot be negative. |
| `Invoicing:LineItem:MaxExceeded` | 400 | This invoice has reached the maximum number of line items. |
| `Invoicing:LineItem:NotFound` | 404 | The line item could not be found on this invoice. |
| `Invoicing:Number:Conflict` | 409 | A unique invoice number could not be generated after {MaxAttempts} attempts. Please try again. |
| `Invoicing:Number:SequenceNotFound` | 404 | The invoice number sequence for this biller could not be found. |
| `Invoicing:Payment:BelowMinimum` | 400 | The payment amount is below the minimum this invoice accepts. |
| `Invoicing:Payment:ExceedsBalance` | 409 | The payment amount is greater than the balance due on this invoice. |
| `Invoicing:Payment:InvoiceAlreadyPaid` | 409 | This invoice is already paid in full. |
| `Invoicing:Payment:PartialNotAllowed` | 403 | This invoice does not accept partial payments. Pay the full balance due. |
| `Invoicing:PaymentPlan:AlreadyExists` | 409 | This invoice already has a payment plan. |
| `Invoicing:PaymentPlan:AutoCollectRequiresToken` | 400 | Automatic collection requires a stored payment method on the payment plan. |
| `Invoicing:PaymentPlan:InstallmentNotFound` | 404 | The installment could not be found on this payment plan. |
| `Invoicing:PaymentPlan:InstallmentsMustSumToBalance` | 400 | The installment amounts must add up to the invoice balance due. |
| `Invoicing:PaymentPlan:InvalidInstallmentCount` | 400 | A payment plan must have between {min} and {max} installments, but {count} were requested. |
| `Invoicing:PaymentPlan:InvalidInvoiceStatus` | 409 | A payment plan cannot be created for an invoice in {status} status. |
| `Invoicing:PaymentPlan:NoBalance` | 409 | This invoice has no outstanding balance to schedule. |
| `Invoicing:PaymentPlan:NotFound` | 404 | The payment plan could not be found. |
| `Invoicing:Portal:NotAuthenticated` | 403 | Your invoice portal session is no longer valid. Open the invoice link again to continue. |
| `Invoicing:Product:NotFound` | 404 | The product could not be found. |
| `Invoicing:RecurringSchedule:InvalidBiller` | 400 | The selected biller is not valid for this recurring invoice schedule. |
| `Invoicing:RecurringSchedule:InvalidStatusTransition` | 409 | A recurring invoice schedule cannot move from {from} to {to}. |
| `Invoicing:RecurringSchedule:NoLineItems` | 400 | A recurring invoice schedule needs at least one line item. |
| `Invoicing:RecurringSchedule:NoRecurrence` | 400 | A recurring invoice schedule needs a recurrence pattern. |
| `Invoicing:RecurringSchedule:NotFound` | 404 | The recurring invoice schedule could not be found. |
| `Invoicing:Report:RowLimitExceeded` | 400 | The report exceeds the maximum of {MaxRowCount} rows. Narrow the filters and try again. |
| `Invoicing:TaxRate:NotFound` | 404 | The tax rate could not be found. |
| `Invoicing:Template:CannotDeleteDefault` | 409 | The default invoice template cannot be deleted. Make another template the default first. |
| `Invoicing:Template:NotFound` | 404 | The invoice template could not be found. |

### Language Management

| Code | Status | Message |
| --- | --- | --- |
| `Volo.Abp.LanguageManagement:010001` | 403 | Culture name {CultureName} already exists. |

### Merchant Billing

| Code | Status | Message |
| --- | --- | --- |
| `MerchantBilling:BillingRunAlreadyRunning` | 409 | A billing run is already in progress for this reseller. |
| `MerchantBilling:ContractCancelled` | 409 | This recurring billing contract has been cancelled and can no longer be charged. |
| `MerchantBilling:DuplicateBillingRunForPeriod` | 409 | A completed billing run already exists for reseller '{0}' in period '{1}'. |
| `MerchantBilling:DuplicateGroupInPlan` | 400 | SKU group '{0}' already has a rate entry in this price plan. |
| `MerchantBilling:DuplicateSkuInPlan` | 400 | SKU '{0}' already exists in this price plan. |
| `MerchantBilling:InvalidSkuCode` | 400 | SKU code '{0}' is not a valid registered SKU. |
| `MerchantBilling:InvalidSkuGroupCode` | 400 | SKU group '{0}' is not a recognized billing group. |
| `MerchantBilling:MerchantAlreadyHasActivePlan` | 409 | Merchant '{0}' already has an active price plan assignment. |
| `MerchantBilling:PaymentMethodCallbackKindFieldMissing` | 400 | A '{0}' payment method requires field '{1}' on the capture callback. |
| `MerchantBilling:PaymentMethodCaptureIntentCancelled` | 409 | The capture link was cancelled and can no longer be completed. Send a new link from the merchant's payment-method page. |
| `MerchantBilling:PaymentMethodCaptureIntentConsumed` | 409 | The capture-intent token has already been used. Restart the capture from the merchant's payment-method page. |
| `MerchantBilling:PaymentMethodCaptureIntentExpired` | 409 | The capture-intent token has expired. Restart the capture from the merchant's payment-method page. |
| `MerchantBilling:PaymentMethodCaptureIntentInvalid` | 400 | The capture-intent token is not recognized. Restart the capture from the merchant's payment-method page. |
| `MerchantBilling:PaymentMethodCaptureIntentMismatch` | 400 | The capture-intent token does not match this capture request. Restart the capture from the merchant's payment-method page. |
| `MerchantBilling:PaymentMethodCaptureIntentRequired` | 400 | The capture callback is missing its capture-intent token. Restart the capture from the merchant's payment-method page. |
| `MerchantBilling:PaymentMethodCaptureLinkNotFound` | 404 | There is no capture link to resend for this merchant. Send a new link first. |
| `MerchantBilling:PaymentMethodCaptureNotCompleted` | 409 | The payment capture has not completed yet. Finish entering the payment details on the hosted page, then try again. |
| `MerchantBilling:PaymentMethodCollectionMerchantMismatch` | 400 | The supplied payment-method collection merchant does not match the reseller's configured collection merchant. |
| `MerchantBilling:PaymentMethodKindNotAllowed` | 403 | The reseller's billing preferences do not permit '{0}' payment methods. |
| `MerchantBilling:PaymentMethodMissingCollectionMerchant` | 400 | Configure a collection merchant on the reseller's billing preferences before capturing a payment method. |
| `MerchantBilling:PaymentMethodMissingHpp` | 400 | Configure a card capture Hosted Payment Page on the reseller's billing preferences before capturing a payment method. |
| `MerchantBilling:PaymentMethodNotFound` | 404 | No active stored payment method exists for this merchant. |
| `MerchantBilling:PaymentMethodTokenNotFound` | 404 | The payment token referenced by the capture callback could not be resolved. |
| `MerchantBilling:PaymentMethodTokenVaultMismatch` | 400 | The payment token is not vaulted under the expected collection merchant. |
| `MerchantBilling:PricePlanInUse` | 409 | Cannot delete price plan '{0}' because it is assigned to one or more merchants. |
| `MerchantBilling:PricePlanNameAlreadyExists` | 409 | A price plan with name '{0}' already exists for this reseller. |
| `MerchantBilling:PricePlanNotFound` | 404 | Price plan not found. |
| `MerchantBilling:PricingStrategyNotAllowedForSku` | 400 | Pricing strategy '{0}' is not allowed for SKU '{1}'. |
| `MerchantBilling:RateEntryTargetAmbiguous` | 400 | A rate entry cannot target both a SKU and a SKU group. |
| `MerchantBilling:RateEntryTargetRequired` | 400 | Each rate entry must target a SKU or a SKU group. |
| `MerchantBilling:ResellerMerchantBillingDisabled` | 403 | Merchant billing is turned off for this reseller, so a price plan cannot be created for it. Turn on the Merchant Billing feature for the reseller and try again. |
| `MerchantBilling:TiersNotContiguous` | 400 | Pricing tiers must be contiguous and non-overlapping. |
| `MerchantBilling:TiersRequiredForTieredPricing` | 400 | At least one pricing tier is required when using Tiered pricing strategy. |

### Merchants

| Code | Status | Message |
| --- | --- | --- |
| `Merchants:000001` | 409 | This processor account cannot be deactivated while it still has unsettled transactions. |
| `Merchants:000002` | 409 | This processor account cannot be deleted while it still has unsettled transactions. |
| `Merchants:000003` | 409 | This is the last active profile for its payment type. Deactivating it would leave the merchant unable to process that payment type. |
| `Merchants:CustomFieldsNotEnabled` | 403 | Custom field configuration is not enabled for this merchant. |
| `Merchants:NoCurrentMerchant` | 400 | No merchant is associated with the current user. |
| `Merchants:OrderDataDefaultsNotEnabled` | 403 | Order data defaults are not enabled for this merchant. |
| `Merchants:TenderDisabledByMerchant` | 403 | This tender is not enabled for this merchant. |
| `Merchants:TenderDisabledByReseller` | 403 | This tender is not enabled by the reseller. |
| `Merchants:TenderDisabledByTenant` | 403 | This tender is turned off platform-wide. |
| `Merchants:TenderNotSupportedByProcessorAccount` | 403 | The selected processor account does not support this tender. |

### Mfa

| Code | Status | Message |
| --- | --- | --- |
| `Mfa:CannotDisableSoleMethod` | 409 | Cannot disable the only enabled MFA method when MFA is required. |
| `Mfa:ChallengeExpired` | 409 | Your verification session has expired. Please sign in again. |
| `Mfa:InvalidVerificationCode` | 400 | The verification code is invalid. Please try again. |
| `Mfa:PasswordIncorrect` | 403 | The password provided is incorrect. |
| `Mfa:PasswordRequired` | 400 | Password confirmation is required for this action. |
| `Mfa:RecoveryCodeInvalid` | 400 | The recovery code is invalid or has already been used. |
| `Mfa:SetupRequired` | 403 | Multi-factor authentication setup is required before you can continue. |
| `Mfa:TotpAlreadyEnabled` | 409 | TOTP authenticator is already enabled for this account. |
| `Mfa:TotpNotEnabled` | 409 | TOTP authenticator is not enabled for this account. |

### Multi Merchant

| Code | Status | Message |
| --- | --- | --- |
| `MultiMerchant:010001` | 404 | Merchant not found! |
| `MultiMerchant:010002` | 409 | Merchant is not active! |

### Notifications

| Code | Status | Message |
| --- | --- | --- |
| `Notifications:00001` | 409 | A subscription with this name already exists in this scope. |
| `Notifications:00002` | 400 | A merchant is required when the subscription scope is Merchant. |
| `Notifications:00003` | 400 | A reseller is required when the subscription scope is Reseller. |
| `Notifications:00004` | 400 | At least one event type is required. |
| `Notifications:00006` | 400 | The filter expression is not valid. |
| `Notifications:00007` | 400 | The destination configuration is not valid. |
| `Notifications:00008` | 403 | You do not have access to the selected scope. |
| `Notifications:00009` | 400 | The filter expression is nested too deeply. |
| `Notifications:00010` | 400 | The filter expression has too many conditions. |
| `Notifications:00011` | 400 | The event type '{eventType}' is not in the event registry. |
| `Notifications:00012` | 404 | The delivery record could not be found. |
| `Notifications:00013` | 404 | The subscription behind this delivery could not be found, so it cannot be retried. |
| `Notifications:00014` | 400 | This destination type is not supported yet. |
| `Notifications:00015` | 404 | The destination could not be found. |
| `Notifications:00016` | 409 | This destination cannot be deleted while these channels use it: {channelNames}. |
| `Notifications:00017` | 404 | The channel could not be found. |
| `Notifications:00018` | 409 | This channel cannot be deleted while these subscriptions use it: {subscriptionNames}. |
| `Notifications:00019` | 403 | The destination's scope is not compatible with the scope of the record referencing it. |
| `Notifications:00020` | 403 | The channel's scope is not compatible with the subscription's scope. |
| `Notifications:00021` | 409 | A destination with this name already exists in this scope. |
| `Notifications:00022` | 409 | A channel with this name already exists in this scope. |
| `Notifications:00023` | 400 | At least one channel is required on a subscription. |
| `Notifications:00024` | 400 | A subscription can have at most {max} channels. |
| `Notifications:00025` | 400 | A subscription can have at most {max} event types. |
| `Notifications:00026` | 409 | A quick-setup subscription already exists for this item. |
| `Notifications:00027` | 400 | The unsubscribe request could not be processed. Please try again. |
| `Notifications:00028` | 400 | The quick-setup filter does not pin the subscription to the item its context key names. |
| `Notifications:00029` | 403 | One or more of the selected event types cannot be delivered, so the subscription would never fire. |
| `Notifications:00030` | 409 | This delivery cannot be retried from its current status ({Status}). |

### Operating Context

| Code | Status | Message |
| --- | --- | --- |
| `WinkPG.OperatingContext:InvalidMerchant` | 404 | The target merchant does not exist, or its ownership chain is not valid. |
| `WinkPG.OperatingContext:InvalidReseller` | 404 | The target reseller does not exist, or it does not belong to the specified tenant. |

### Payment

| Code | Status | Message |
| --- | --- | --- |
| `Volo.Payment:010001` | 403 | No message defined. |

### Payment Tokenization

| Code | Status | Message |
| --- | --- | --- |
| `PaymentTokenization:DomainAlreadyExists` | 409 | Domain '{domain}' already exists for this wallet provider. |
| `PaymentTokenization:DomainNotFound` | 404 | The specified domain was not found in this wallet provider registration. |
| `PaymentTokenization:InternalTokenNotDecryptable` | 400 | Internal stored tokens are resolved through the stored payment method, not the wallet decryption path. |
| `PaymentTokenization:MetadataNotFound` | 404 | The specified provider metadata key '{key}' was not found. |
| `PaymentTokenization:PazeCertificateNoPendingRequest` | 409 | There is no pending {environment} certificate request to merge. Generate a CSR first. |
| `PaymentTokenization:PazeCertificateNotReady` | 409 | The {environment} Paze certificate hasn't been generated yet. Generate it on the Settings page first. |
| `PaymentTokenization:PazeCertificateOperationInProgress` | 409 | A {environment} certificate request is already in progress. Download and merge the pending CSR, or cancel it, then try again. If you just started it, wait a moment and retry. |
| `PaymentTokenization:PazeSignedCertificateInvalid` | 400 | The uploaded file isn't a valid signed certificate. Upload the CA-signed certificate as a PEM, base64, or DER (.cer) file. |
| `PaymentTokenization:ProviderNotRecognized` | 400 | The submitted token provider does not correspond to a supported wallet provider. |
| `PaymentTokenization:ProviderNotRegistered` | 409 | The selected wallet provider is not configured or does not support this operation. |
| `PaymentTokenization:ProviderRegistrationFailed` | 429 | The wallet provider could not complete the merchant registration. Please verify the details and try again. |
| `PaymentTokenization:ProviderSessionFailed` | 429 | The wallet provider could not start a payment session. Please try again. |
| `PaymentTokenization:ProviderUnregisterFailed` | 429 | The wallet provider could not remove the requested domain(s). Please try again. |
| `PaymentTokenization:WalletDomainAlreadyRegistered` | 409 | Domain '{0}' is already registered on another Paze registration in this environment. Each domain can belong to only one Paze registration per environment. |
| `PaymentTokenization:WalletMerchantNameAlreadyRegistered` | 409 | Merchant name '{0}' is already used by another registration for this wallet in this environment. Each merchant name must be unique per environment. |
| `PaymentTokenization:WalletProviderAlreadyExists` | 409 | Wallet provider is already registered for this merchant. |
| `PaymentTokenization:WalletProviderNotFound` | 404 | Wallet provider registration was not found for the specified merchant and provider. |

### Payment Tokenization Apple Pay

| Code | Status | Message |
| --- | --- | --- |
| `PaymentTokenization:ApplePay:CertificateRenewalFailed` | 429 | The Apple Pay certificate renewal could not be started. Please try again, or use the manual certificate signing request flow. |
| `PaymentTokenization:ApplePay:ConnectionTestFailed` | 429 | The connection test to Apple Pay failed. Please verify the credentials and certificates, then try again. |
| `PaymentTokenization:ApplePay:DeactivationFailed` | 429 | Apple Pay could not deactivate the merchant registration. Please try again. |
| `PaymentTokenization:ApplePay:DomainVerificationUnsupported` | 400 | Apple Pay does not offer a standalone domain verification call. Domains are verified when the merchant is registered. |
| `PaymentTokenization:ApplePay:MerchantIdOidMissing` | 403 | The Apple Pay payment processing certificate is missing the Apple merchant identifier extension. Re-run the payment processing certificate flow for this Platform Integrator. |
| `PaymentTokenization:ApplePay:PayloadFieldsMissing` | 400 | The Apple Pay payment token decrypted successfully but was missing required card details, so no usable payment credential could be produced. |
| `PaymentTokenization:ApplePay:PaymentSessionFailed` | 429 | Apple Pay could not start a payment session. Please try again. |
| `PaymentTokenization:ApplePay:PlatformIntegratorIdentifierNotConfigured` | 403 | The Apple Pay Platform Integrator identifier is not configured. Set it on the Payment Tokenization settings page before registering merchants. |
| `PaymentTokenization:ApplePay:PublicKeyHashMismatch` | 400 | The Apple Pay token was encrypted for a different payment processing certificate. This usually means a certificate renewal is in flight or the environment does not match. |
| `PaymentTokenization:ApplePay:RegistrationFailed` | 429 | Apple Pay could not complete the merchant registration. Please verify the merchant name, URL, and domains, then try again. |
| `PaymentTokenization:ApplePay:SignatureVerificationFailed` | 400 | The Apple Pay payment token signature could not be verified. |
| `PaymentTokenization:ApplePay:TokenDecryptionFailed` | 400 | The Apple Pay payment token could not be decrypted. |

### Payment Tokenization Paze

| Code | Status | Message |
| --- | --- | --- |
| `PaymentTokenization:Paze:ConnectionTestFailed` | 429 | The connection test to Paze failed. Please verify the credentials and certificates, then try again. |
| `PaymentTokenization:Paze:DeactivationFailed` | 429 | Paze could not deactivate the merchant registration. Please try again. |
| `PaymentTokenization:Paze:JweDecryptionFailed` | 400 | The Paze secured payload could not be decrypted. |
| `PaymentTokenization:Paze:OAuthFailed` | 429 | Paze rejected the authentication request. Please verify the OAuth settings and the environment certificate, then try again. |
| `PaymentTokenization:Paze:PartnerNotConfigured` | 403 | The Paze partner details are not configured. Set the partner identifier and key alias on the Payment Tokenization settings page. |
| `PaymentTokenization:Paze:PayloadFieldsMissing` | 400 | The Paze payload decrypted successfully but was missing required card details, so no usable payment credential could be produced. |
| `PaymentTokenization:Paze:PrivateKeyNotConfigured` | 403 | The Paze certificate for this environment has not been generated yet. Generate it on the Settings page first. |
| `PaymentTokenization:Paze:RegistrationFailed` | 429 | Paze could not complete the merchant onboarding. Please verify the merchant details and try again. |
| `PaymentTokenization:Paze:SecuredPayloadMissing` | 400 | The Paze response did not include a secured payload, so no payment credential could be read. |
| `PaymentTokenization:Paze:SignatureVerificationFailed` | 400 | The Paze payload signature could not be verified. |
| `PaymentTokenization:Paze:TokenDecryptionFailed` | 400 | The Paze payment token could not be decrypted. |

### Phoeni X Gate V2

| Code | Status | Message |
| --- | --- | --- |
| `PhoeniXGate:Data:ConcurrencyConflict` | 409 | This record was changed by someone else while you were editing it. Reload it and try again. |
| `PhoeniXGateV2:InvalidLandingPageUrl` | 400 | The landing page URL must be a valid relative path (e.g. /Dashboard/Merchant). |
| `PhoeniXGateV2:TooManyShortcuts` | 403 | You can pin at most {max} shortcuts ({count} were submitted). |
| `Volo.Account:PhoneNumberConfirmationDisabled` | 403 | Phone number confirmation is disabled! |
| `Volo.Account:PhoneNumberEmpty` | 400 | Phone number is empty! |

### Rate Limiting

| Code | Status | Message |
| --- | --- | --- |
| `RateLimiting:ProfileNameAlreadyExists` | 409 | A rate limit profile named '{name}' already exists. |
| `RateLimiting:ProfileNotFound` | 404 | The selected rate limit profile does not exist. |
| `RateLimiting:RuleAlreadyExistsForLimiter` | 409 | This profile already has a rule for the limiter '{limiterName}'. |

### Referential Integrity

| Code | Status | Message |
| --- | --- | --- |
| `WinkPG.ReferentialIntegrity:Blocked` | 409 | This record is still referenced by other records, so it cannot be changed or removed. |

### Saas

| Code | Status | Message |
| --- | --- | --- |
| `Saas:Edition:0001` | 403 | Edition doesn't have a plan! |
| `Saas:Edition:0002` | 403 | Unable to delete {EditionName}, It is in use by tenants. |

### Scoped Settings

| Code | Status | Message |
| --- | --- | --- |
| `WinkPG.ScopedSettings:001` | 403 | This setting cannot be overridden at the requested scope. |
| `WinkPG.ScopedSettings:002` | 403 | No reseller or merchant scope is available to save this setting against. |
| `WinkPG.ScopedSettings:003` | 400 | The target reseller or merchant is not valid. |
| `WinkPG.ScopedSettings:004` | 403 | This setting cannot be saved at the requested scope: its definition does not allow the scoped provider, so the value would never be read back. |

### Security Posture

| Code | Status | Message |
| --- | --- | --- |
| `Sbom:Error:InvalidBuildId` | 400 | Invalid SBOM build identifier. |
| `Sbom:Error:InvalidComponentName` | 400 | Invalid SBOM component name. |
| `Sbom:Error:NotConfigured` | 403 | The SBOM archive is not configured for this deployment. Set WinkPG:SecurityPosture:SbomStorage in configuration to enable it. |

### Shared Models

| Code | Status | Message |
| --- | --- | --- |
| `CardData:00001` | 400 | Manual entry cannot be combined with encrypted track data. |
| `CardData:00002` | 400 | Manual entry requires a card number. |
| `CardData:00003` | 400 | Manual entry requires a card expiration date. |
| `CardData:00004` | 400 | Encrypted track data is not allowed on a manual-entry request. |
| `CardData:00005` | 400 | Track data is not allowed on a manual-entry request. |
| `CardData:00006` | 400 | An encrypted card-reader swipe requires encrypted track data. |
| `CardData:00007` | 400 | An unencrypted card-reader swipe requires track or EMV data. |
| `CardData:00008` | 400 | Unencrypted track data is not allowed on an encrypted card-reader swipe. |
| `CardData:00009` | 400 | Encrypted track data is not allowed on an unencrypted card-reader swipe. |
| `CardData:00010` | 400 | A chip or contactless transaction requires EMV data. |
| `CardData:00011` | 400 | Encrypted track data is not allowed on an unencrypted chip or contactless transaction. |
| `CardData:00012` | 400 | No card data was supplied. |
| `CardData:00013` | 400 | The card number must be 13 to 19 digits. |
| `CardData:00014` | 400 | The card number is not valid. |
| `CardData:00015` | 400 | The card has expired. |
| `CardData:00016` | 400 | The card security code must be 3 or 4 digits. |
| `CardData:00017` | 400 | A card security code was supplied, but the card verification indicator says none was collected. |
| `CardData:00018` | 400 | The card verification indicator says a card security code was collected, but none was supplied. |
| `DeviceData:00001` | 400 | The encryption key variant is not recognized. Use Data or Pin. |

### Stored Credential Consents

| Code | Status | Message |
| --- | --- | --- |
| `stored_credential_consent_input_invalid` | 400 | No message defined. |
| `stored_credential_consent_required` | 400 | No message defined. |
| `stored_credential_consent_text_version_retracted` | 409 | No message defined. |
| `stored_credential_consent_text_version_unknown` | 400 | No message defined. |

### Surcharging

| Code | Status | Message |
| --- | --- | --- |
| `Surcharging:001` | 400 | The surcharge rate exceeds the maximum permitted rate. |
| `Surcharging:002` | 409 | Surcharging cannot start yet: the required notice waiting period has not elapsed. |
| `Surcharging:003` | 409 | Re-enabling under a different processor requires filing a new surcharge notice. |
| `Surcharging:004` | 400 | A surcharge notice must be filed before surcharging can be activated. |
| `Surcharging:005` | 400 | The surcharge rate is invalid. |
| `Surcharging:006` | 409 | A surcharge configuration already exists for this merchant. |
| `Surcharging:007` | 409 | Surcharging cannot start: no filed notice applies to the currently allowed networks. |
| `Surcharging:008` | 409 | Surcharging can only be re-enabled from a disabled state. |
| `Surcharging:009` | 400 | The same state code appears more than once in the state policy list. |
| `Surcharging:010` | 429 | Too many surcharge-quote requests. Please slow down and try again shortly. |

### Transaction Manager

| Code | Status | Message |
| --- | --- | --- |
| `TransactionManager:NoAuthorizationContributorRegistered` | 403 | No payment processor integration is registered for processor '{ProcessorKey}'. Please contact support. |

### Transactions

| Code | Status | Message |
| --- | --- | --- |
| `OPERATION_IDEMPOTENCY_KEY_CONFLICT` | 409 | No message defined. |
| `OPERATION_IDEMPOTENCY_STORE_UNAVAILABLE` | 429 | No message defined. |
| `OPERATION_IN_PROGRESS` | 409 | No message defined. |
| `OPERATION_NOT_ALLOWED_IN_STATE` | 409 | No message defined. |
| `REVERSAL_AMOUNT_EXCEEDS_REMAINING` | 409 | No message defined. |
| `REVERSAL_FULLY_CONSUMED` | 409 | No message defined. |
| `Transactions:00001` | 400 | A merchant is required for this request. |
| `Transactions:00002` | 404 | The merchant could not be found, or you do not have access to it. |
| `Transactions:00003` | 403 | Your account has no merchants associated with it. |
| `Transactions:00004` | 403 | Your user context could not be determined, so the merchant could not be validated. Sign in again and retry. |
| `Transactions:00005` | 400 | The stored card expiration on this contract is missing or unreadable. Update the contract's payment method. |
| `Transactions:00006` | 400 | The stored card payment method on this contract could not be resolved. Update the contract's payment method. |
| `Transactions:00007` | 429 | Transaction Manager is temporarily unavailable. Please try again shortly. |
| `Transactions:00008` | 403 | Processor certification overrides are not permitted for this merchant or processor profile. |
| `Transactions:00009` | 409 | This recurring contract has no usable payment method. Add a card or bank account to the contract. |
| `Transactions:00010` | 400 | This tender requires the cardholder PIN. |
| `Transactions:00011` | 400 | This tender requires a card-present entry mode. |
| `Transactions:00012` | 400 | This operation is not permitted for the selected tender. |
| `Transactions:00013` | 400 | The entry mode could not be determined, and this tender requires a valid card-present entry mode. |
| `Transactions:00014` | 409 | The tender type cannot change on a follow-up transaction. Omit it, or send the same value as the original. |
| `Transactions:00015` | 400 | The stored bank account on this contract could not be resolved. Update the contract's payment method. |
| `Transactions:00020` | 400 | EBT and eWIC tenders cannot be used with a stored payment method. |
| `Transactions:00021` | 400 | EBT and eWIC tenders cannot be used for recurring billing. |
| `Transactions:00022` | 400 | EBT and eWIC tenders cannot be used with a digital wallet. |
| `Transactions:00023` | 400 | A surcharge cannot be charged on an EBT or eWIC tender. |
| `Transactions:00024` | 400 | A tip cannot be added to an EBT or eWIC tender. |
| `Transactions:00025` | 400 | Cashback is available on EBT Cash only. |
| `Transactions:00026` | 400 | A convenience fee cannot be charged on an EBT or eWIC tender. |
| `Transactions:00030` | 400 | This payment session could not be verified. Start the payment again. |
| `Transactions:00031` | 400 | This transaction type cannot be submitted from a hosted payment page. |
| `Transactions:00032` | 429 | The card capture session is no longer available. Start the capture again. |
| `Transactions:00033` | 429 | The bank account could not be saved for this session. Confirm the account holder details, then start the capture again. |
| `Transactions:00034` | 403 | This merchant cannot accept eCheck (ACH) payments. No active ACH processor is configured for the merchant. |
| `Transactions:00035` | 400 | This ACH payment needs an authorization on file. Choose how the account holder authorized the debit (phone or signed form) and confirm you obtained it before submitting. |
| `Transactions:00036` | 403 | Surcharging is not enabled for this merchant. Remove the surcharge amount from the request, or enable surcharging before submitting a transaction that includes one. |
| `Transactions:00037` | 400 | A merchant-initiated charge against a stored payment method requires a customer. Re-submit with the customer that owns the stored payment method. |
| `Transactions:00038` | 429 | The operation completed, but the transaction could not be read back to build the response. Re-read the transaction rather than submitting it again. |
| `Transactions:00039` | 400 | A void or return needs either the original transaction id or the merchant transaction id. |
| `Transactions:00040` | 400 | The original transaction id is not a valid identifier. |
| `Transactions:00041` | 400 | A force needs an original transaction id, a merchant transaction id, or an auth code, and the two gateway identifiers cannot both be supplied. |
| `Transactions:00042` | 400 | The auth code must be 1 to 20 alphanumeric characters. |
| `Transactions:00043` | 400 | A voice-authorization force needs the card data supplied with the request. |
| `Transactions:00044` | 403 | A voice-authorization force cannot carry check data. Voice approval codes apply to card transactions only. |
| `Transactions:00045` | 400 | The original transaction belongs to a different merchant. |
| `Transactions:00046` | 409 | A force can only be applied to an authorization. |
| `Transactions:00047` | 400 | The card number does not match the original authorization. |
| `Transactions:00048` | 400 | The card expiration does not match the original authorization. |
| `Transactions:00049` | 409 | The refund amount is greater than the amount still refundable on this transaction. |
| `Transactions:00050` | 409 | The reversal amount is greater than the amount still reversible on this transaction. |
| `Transactions:00051` | 409 | A transaction with this idempotency key is still being processed. Retry shortly with the same key to receive the recorded outcome. |
| `Transactions:00052` | 429 | The idempotency check could not be completed, so the transaction was not submitted. Retry the request with the same key. |
| `Transactions:00053` | 400 | A voucher clear applies to EBT SNAP and eWIC tenders only. |
| `Transactions:00054` | 400 | A voucher clear needs the paper voucher number. |
| `Transactions:00055` | 400 | A voucher clear needs the voucher approval code obtained by phone. |
| `Transactions:00056` | 403 | Digital wallet payments are not supported on this merchant's processor profile, which is configured for card-present processing. |
| `Transactions:00057` | 403 | This digital wallet is not currently enabled on the platform. |
| `Transactions:00058` | 403 | This merchant's processor requires card data captured by a reader, so a manually keyed card cannot be charged. |
| `Transactions:00059` | 400 | A transaction that charges a convenience fee must record when and where the fee was disclosed and accepted. Send convenienceFeeDisclosureAcknowledgedAt (the UTC time the payer accepted the disclosed fee) and convenienceFeeDisclosureChannel (one of: VirtualTerminal, HostedPaymentPage, Api). |
| `Transactions:00060` | 400 | A payment method is required. Provide cardData, checkData, or tokenData. This merchant is not configured to accept cash payments. |
| `Transactions:00061` | 400 | A surcharge was submitted without a disclosure acknowledgment. Confirm the surcharge was disclosed to and accepted by the cardholder (set the surcharge disclosure acknowledgment) before submitting. |
| `Transactions:00062` | 400 | The submitted surcharge cannot be applied to this card. The gateway re-evaluated eligibility and found this transaction is not surchargeable. Remove the surcharge and resubmit. |
| `Transactions:00063` | 400 | The submitted surcharge exceeds the maximum permitted for this card. Request a surcharge quote and submit the returned amount, or reduce the surcharge, before resubmitting. |
| `Transactions:00064` | 403 | Convenience fees are not currently enabled. Remove the convenience amount from the request, or ask an administrator to enable convenience fees before submitting a transaction that includes one. |
| `Transactions:CaptureNotAllowedOnZeroAuth` | 409 | Capture is not allowed on a zero-amount authorization. Zero-dollar authorizations verify the card only and cannot be captured or settled. |
| `Transactions:OperationNotAllowed` | 409 | The operation '{requestedOperation}' is not allowed on a {originalTransactionType} transaction with result '{result}' and settlement state '{settlementState}'. |
| `Transactions:ReceiptMerchantMismatch` | 404 | This receipt belongs to a different merchant. |
| `Transactions:ReceiptNoEmailAddress` | 400 | No email address is available for this receipt. Supply one with the request. |
| `Transactions:SettlementBatchNotBlocking` | 409 | This settlement batch is no longer blocking a new run: it is already in {Status} status. |
| `Transactions:SettlementBatchNotFound` | 404 | The settlement batch could not be found for this merchant. |
| `Transactions:SettlementOverride:InvalidTarget` | 403 | No message defined. |
| `Transactions:SettlementOverride:NoOp` | 403 | No message defined. |
| `Transactions:SettlementOverride:NotEligible` | 403 | No message defined. |
| `Transactions:SettlementOverride:ReasonRequired` | 403 | No message defined. |
| `Transactions:SettlementOverride:SystemOnlyTarget` | 403 | No message defined. |
| `Transactions:SettlementProcessorKeyNotActive` | 403 | The processor '{ProcessorKey}' is not active for this merchant. |
| `Transactions:SettlementTriggerFailed` | 429 | The settlement run could not be started. Please try again. |
| `Transactions:TokenMintTenderMissing` | 400 | This transaction has no stored card or bank account to tokenize. Tokens can only be minted from transactions that captured a reusable card or check. |
| `Transactions:TokenRegenerationFailed` | 429 | The payment token could not be regenerated. Please try again shortly. |
| `VOID_NOT_APPLICABLE_ZERO_DOLLAR_VERIFICATION` | 409 | No message defined. |
| `initiation_type_required` | 400 | No message defined. |
| `mit_reason_required` | 400 | No message defined. |
| `original_transaction_not_resubmittable` | 409 | No message defined. |
| `resubmission_amount_mismatch` | 400 | No message defined. |
| `resubmission_limit_exceeded` | 409 | No message defined. |

### Twilio

| Code | Status | Message |
| --- | --- | --- |
| `Twilio:ApiKeyRequiredForWebhookRegistration` | 400 | Set the SendGrid API key before registering the webhook; the gateway needs it to call the SendGrid configuration API. |
| `Twilio:SendGridApiKeyNotConfigured` | 403 | The message was not sent because no SendGrid API key is configured. Set the SendGrid API key, then retry. |
| `Twilio:SendGridFromAddressMissing` | 403 | The message was not sent because it had no sender address and no default from-address is configured. Set a default from-address, then retry. |
| `Twilio:SendGridReturnedEmptyPublicKey` | 429 | SendGrid accepted the webhook configuration but returned an empty signed-events public key. Try again, or configure signed events manually in the SendGrid dashboard. |
| `Twilio:SmsComplianceScopeUnresolved` | 400 | The message was not sent because the merchant could not be determined, so the recipient's opt-out status could not be checked. Try again, or specify the merchant explicitly. |
| `Twilio:SmsDisallowedLinkDomain` | 400 | The message was not sent because its body links to a web address the messaging policy does not permit. Use a platform-branded link; public link shorteners are blocked by mobile carriers. |
| `Twilio:SmsNotConfigured` | 403 | SMS sending is not configured. Configure the Twilio SMS settings (Account SID, Auth Token, and either a Messaging Service SID or a From Phone Number) in the settings panel. |
| `Twilio:SmsQuietHoursBlocked` | 429 | The message was not sent because it falls outside the permitted sending window for marketing and reminder messages. Schedule it inside the window, or send it as part of a live customer interaction. |
| `Twilio:SmsRecipientOptedOut` | 403 | This recipient has opted out of SMS messages from this merchant. The message was not sent. The recipient must opt back in before SMS can resume. |
| `Twilio:SmsSendFailed` | 429 | Failed to send SMS via Twilio. Please check your Twilio configuration and try again. |
| `Twilio:SmsSettingsAreHostOnly` | 403 | Twilio SMS settings are platform-wide and can only be changed from the host context. Sign in to the host to configure them. |
| `Twilio:WebhookBaseUrlMustBeHttps` | 400 | The public webhook base URL must be HTTPS. SendGrid will not accept HTTP for signed events. |
| `Twilio:WebhookRegistrationIsHostOnly` | 403 | Registering the SendGrid signed event webhook is a host-only operation. Sign in to the host context to configure the gateway-wide webhook key. |

### Usage

| Code | Status | Message |
| --- | --- | --- |
| `Usage:ConcurrencyConflict` | 409 | A concurrency conflict occurred while updating usage aggregates. Please retry. |
| `Usage:ExceedsResellerEntitlement` | 403 | Requested quantity ({RequestedQuantity}) exceeds the reseller's entitlement for SKU '{SkuCode}' (limit: {ResellerLimit}). |
| `Usage:InvalidScope` | 400 | The supplied entitlement scope value is not valid. |
| `Usage:MerchantAndResellerIdRequired` | 400 | ResellerId and MerchantId are both required for the {Scope} scope. |
| `Usage:PrerequisiteNotMet` | 409 | SKU '{SkuCode}' requires prerequisite SKU '{PrerequisiteSkuCode}', which is not entitled at the caller's scope. |
| `Usage:ResellerIdRequired` | 400 | ResellerId is required for the {Scope} scope. |
| `Usage:ScopeNotPermitted` | 403 | The requested reseller/merchant scope is not accessible from your operating context. |
| `Usage:SkuDisabled` | 403 | SKU '{SkuCode}' is disabled for this scope. |
| `Usage:SkuNotFound` | 404 | SKU '{SkuCode}' is not registered. |
| `Usage:UsageLimitExceeded` | 403 | Usage limit exceeded for SKU '{SkuCode}'. Current: {CurrentUsage}, Limit: {Limit}. |

### User Settings Admin

| Code | Status | Message |
| --- | --- | --- |
| `WinkPG.UserSettingsAdmin:001` | 403 | The setting '{settingName}' cannot be reset by an administrator. |
| `WinkPG.UserSettingsAdmin:002` | 400 | A valid target user is required. |

## See also

- [All documentation](https://docs.winkpg.io/llms.txt): the machine-readable index of every public page on this site.
