# Error codes

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

A processor response code isn't an API error code. An error code means the request was refused before or instead of being processed, and the error reference documents it. A processor response code means the request reached a processor and the processor answered, which covers an approval as much as a decline. [See the processor response-code reference.](https://devportal-simpay-sbx.winkpg.io/docs/processor-response-codes.md)

## 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:OperationNotAllowed",
    "message": "The operation 'Void' is not allowed on a Sale transaction with result 'Approved' and settlement state 'Settled'.",
    "details": null,
    "data": {
      "correlationId": "0123456789abcdef0123456789abcdef"
    },
    "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": {
      "correlationId": "0123456789abcdef0123456789abcdef"
    },
    "validationErrors": [
      {
        "message": "'Amount' must be greater than 0.",
        "members": ["amount"]
      },
      {
        "message": "The card has expired.",
        "members": ["expirationDate"],
        "code": "CardData:CardExpired"
      },
      {
        "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": {
      "correlationId": "0123456789abcdef0123456789abcdef"
    },
    "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. Quote error.data.correlationId (the same value as the X-Correlation-Id response header) when you contact support: it's what finds the failure in those logs. 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": {
      "correlationId": "0123456789abcdef0123456789abcdef"
    },
    "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 | You must upload an image! |

### 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:AnnouncementNotFound` | 404 | The announcement was not found. |
| `Announcements:BodyRequired` | 400 | The announcement body is required. |
| `Announcements:CannotModifyAnnouncementOutsideAccess` | 404 | You do not have permission to modify this announcement. |
| `Announcements:CannotTargetResellerOutsideHierarchy` | 403 | You can only target resellers within your hierarchy. |
| `Announcements:HostScopeRequiresNullTenant` | 400 | Host-level announcements cannot have a tenant specified. |
| `Announcements:InsufficientScopeAccess` | 403 | You do not have access to the specified scope. |
| `Announcements:InvalidScopeConfiguration` | 400 | Invalid scope configuration. Please verify the reseller or merchant selection. |
| `Announcements:MerchantScopeRequiresMerchantId` | 400 | Merchant-scoped announcements require a merchant to be selected. |
| `Announcements:ResellerScopeRequiresResellerId` | 400 | Reseller-scoped announcements require a reseller to be selected. |
| `Announcements:RolesAudienceRequiresRoleNames` | 400 | At least one role must be selected when targeting by roles. |
| `Announcements:StartDateMustBeBeforeEndDate` | 400 | The start date must be before the end date. |
| `Announcements:TitleRequired` | 400 | The announcement title is required. |
| `Announcements:TooManyRoleNames` | 400 | Too many roles specified in the target audience. |
| `Announcements:TooManyUserIds` | 400 | Too many users specified in the target audience. |
| `Announcements:UserAnnouncementStateNotFound` | 404 | User announcement state not found. |
| `Announcements:UsersAudienceRequiresUserIds` | 400 | At least one user must be selected when targeting by users. |

### Api Key Authorization

| Code | Status | Message |
| --- | --- | --- |
| `KEY_ENVIRONMENT_MISMATCH` | 401 | The key is in service but belongs to the other environment: a sk_test_ key against a merchant that is now trading live, or a sk_live_ key against one that is not. |
| `KEY_EXPIRED` | 401 | The key was in service but has passed its expiry. Renew it. |
| `KEY_INVALID` | 401 | The presented value did not match any key. A malformed value is answered the same way. |
| `KEY_REVOKED` | 401 | The key has been revoked (or otherwise taken out of service) and will never be accepted again. Mint a new key; the value will not start working again. |
| `KEY_SCOPE_INSUFFICIENT` | 403 | The key authenticated but is scoped, and none of the scopes it holds covers the operation it addressed. Nothing is wrong with the credential itself: grant the key the scope the operation needs, or call it with one that already holds it. |
| `KEY_SUSPENDED` | 401 | The key has been put out of service temporarily and is not being accepted right now. It has not been revoked: an administrator can reinstate the same value, so the remedy is to ask them rather than to mint a replacement. |
| `TRIAL_EXPIRED` | 401 | The key is in service and stamped for the right environment, but the merchant it belongs to is on a time-limited plan whose deadline has passed. |

### 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} |

### Campaigns

| Code | Status | Message |
| --- | --- | --- |
| `Campaigns:CampaignCapReached` | 409 | This campaign has reached its limit and is no longer accepting payments. |
| `Campaigns:CampaignComparisonTooManyCampaigns` | 400 | You can compare at most {Maximum} campaigns at once, and {Requested} were named. |
| `Campaigns:CampaignIsArchived` | 400 | That campaign is archived and cannot take on new payment links. |
| `Campaigns:CampaignNotAvailableForMerchant` | 400 | That campaign is not available to this merchant. |
| `Campaigns:CampaignNotFound` | 404 | That campaign could not be found. |
| `Campaigns:IllegalStatusTransition` | 409 | A campaign cannot move from {CurrentStatus} to {RequestedStatus}. |
| `Campaigns:LimitMustBePositive` | 400 | A campaign limit or goal must be greater than zero. |
| `Campaigns:MerchantIdIsImmutable` | 409 | A campaign cannot be moved to a different merchant after it is created. |
| `Campaigns:StartMustBeBeforeEnd` | 400 | The campaign start must fall before the campaign end. |

### Cli Access

| Code | Status | Message |
| --- | --- | --- |
| `WinkPG.CliAccess:AuthenticationContextMissing` | 403 | Your sign-in did not satisfy the authentication context this instance requires for restricted operations. Sign in again and complete the extra verification. |
| `WinkPG.CliAccess:CallerNotOperator` | 403 | Only a CLI operator signed in with Microsoft Entra ID can request an access grant. Sign in with winkpg login and try again. |
| `WinkPG.CliAccess:GrantExhausted` | 403 | The access grant has been used as many times as it allows. Request a new one. |
| `WinkPG.CliAccess:GrantExpired` | 403 | The access grant has expired. Request a new one. |
| `WinkPG.CliAccess:GrantIdentityMismatch` | 403 | The access grant was issued to someone else. |
| `WinkPG.CliAccess:GrantMerchantMismatch` | 403 | The access grant was issued for a different merchant. |
| `WinkPG.CliAccess:GrantMissing` | 403 | This operation needs an access grant. Request one and send its id in the X-WinkPG-Cli-Grant header. |
| `WinkPG.CliAccess:GrantNotFound` | 403 | The access grant was not found. Request a new one. |
| `WinkPG.CliAccess:GrantOperationMismatch` | 403 | The access grant was issued for a different operation. |
| `WinkPG.CliAccess:GrantRestrictionMismatch` | 403 | The access grant was issued for a different kind of restricted operation. |
| `WinkPG.CliAccess:GrantRevoked` | 403 | The access grant was revoked. |
| `WinkPG.CliAccess:MerchantUndetermined` | 403 | The merchant this operation acts for could not be determined from the request, so no access grant can be checked against it. |
| `WinkPG.CliAccess:OperatorRoleMissing` | 403 | Your sign-in does not carry the restricted access operator role. Ask an administrator to assign it, then sign in again. |
| `WinkPG.CliAccess:RestrictedCommandsDisabled` | 403 | Restricted CLI operations are turned off on this instance. |
| `WinkPG.CliAccess:SignInNotFresh` | 403 | Restricted operations need a recent interactive sign-in. Sign in again and retry within the allowed window. |

### 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. |

### Customers

| Code | Status | Message |
| --- | --- | --- |
| `Customers:ContractNotActiveForPause` | 409 | Only an active contract can be paused. This contract is already paused or has been stopped. |
| `Customers:ContractNotPaused` | 409 | This contract is not paused. Use the active toggle to reactivate a suspended or deactivated contract. |
| `Customers:ContractPaymentTokenNotAccessible` | 404 | The stored payment method on this contract belongs to a merchant this customer cannot be charged under. |
| `Customers:ContractPaymentTokenUnresolved` | 404 | The stored payment method on this contract could not be found. It may have been removed or invalidated. |
| `Customers:ContractPlanInactive` | 409 | The selected plan is no longer accepting new subscriptions. |
| `Customers:ContractPlanMerchantImmutable` | 400 | A plan cannot be moved to a different merchant. Create it in the destination merchant's catalog instead. |
| `Customers:ContractPlanNameAlreadyExists` | 409 | A plan with this name already exists for this merchant. Choose a different name. |
| `Customers:ContractPlanScheduledPriceNotInFuture` | 400 | A scheduled price change must take effect in the future. Choose a later date, or apply the change immediately. |
| `Customers:ContractPlanUnresolved` | 404 | The selected plan could not be found. It may have been deleted, or it belongs to a different merchant. |
| `Customers:ContractResumeScheduleExhausted` | 409 | The schedule has no billing date from today on, so there is nothing to resume onto. Edit the schedule first. |
| `Customers:DuplicateCustomerName` | 400 | Customer name must be unique within the same merchant. |
| `Customers:InvalidParentMerchant` | 403 | The selected parent merchant is not valid for this customer. |
| `Customers:ParentMerchantCannotChange` | 403 | A customer cannot be moved to a different merchant. |
| `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. |
| `Customers:SandboxRecurringBillingCohortTooLarge` | 400 | This merchant has {count} active contracts, and an on-demand run handles at most {maximum} in one request. They will bill on their own schedule. |
| `Customers:SandboxRecurringBillingEvidenceUnknown` | 403 | Running recurring billing on demand is for the sandbox only, and this request did not state which environment it was for. Authenticate with a test API key (sk_test_); a key issued before environments existed has to be rotated first. |
| `Customers:SandboxRecurringBillingInProgress` | 409 | An on-demand recurring billing run is already going for this merchant. It finishes in the request that started it, so wait for that response rather than retrying this one. |
| `Customers:SandboxRecurringBillingMerchantUnknown` | 403 | This API key is not tied to a merchant, so there are no contracts to bill. Use a key issued for the sandbox merchant whose contracts you want to run. |
| `Customers:SandboxRecurringBillingProductionKeyRefused` | 403 | Running recurring billing on demand is for the sandbox only. This request used a live API key, and when a production contract bills is scheduled by the platform. Use a test key (sk_test_) against a sandbox merchant. |
| `Customers:SandboxRecurringBillingProductionMerchantRefused` | 403 | This test API key belongs to a merchant that is no longer in the sandbox, so recurring billing cannot be run on demand for it. Its contracts bill on their own schedule. |

### Developer Portal

| Code | Status | Message |
| --- | --- | --- |
| `DeveloperPortal:InvitationIssueRateLimited` | 429 | Too many invitations have been sent for this merchant in a short time. Try again later, once the sending limit resets. |

### Entity Templater

| Code | Status | Message |
| --- | --- | --- |
| `EntityTemplates:InvalidTemplateContent` | 409 | This template's saved content could not be read. Save a new template from a current record. |

### Entity Templates

| Code | Status | Message |
| --- | --- | --- |
| `EntityTemplates:DefaultTemplateEntityTypeNotSupported` | 400 | This kind of record cannot have a default template. |
| `EntityTemplates:DefaultTemplateNotVisibleToScope` | 400 | This template is not available to the records that would use it, so it cannot be the default here. Choose a template this level owns, one published by a reseller above it, or a published platform template. |
| `EntityTemplates:DefaultTemplateScopeNotAllowed` | 400 | A default template for this kind of record cannot be set at this level. |
| `EntityTemplates:DefaultTemplateTemplaterUnavailable` | 409 | Templates for this kind of record cannot be checked here, so one cannot be set as the default. |
| `EntityTemplates:DuplicateTemplateName` | 409 | A template with this name already exists here. Choose a different name. |
| `EntityTemplates:EmptyTemplateContent` | 409 | This template has no saved content, so there is nothing to create from it. |
| `EntityTemplates:IncompatibleSchemaVersion` | 409 | This template was saved by an older version and can no longer be applied. Save a new template from a current record. |
| `EntityTemplates:MerchantTemplateCannotBePublished` | 400 | A merchant's template is private to that merchant and cannot be published. |
| `EntityTemplates:TemplateEntityTypeMismatch` | 400 | This template is for a different kind of record, so it cannot be applied here. |
| `EntityTemplates:TemplatesUnavailable` | 409 | Templates are not available here. |
| `EntityTemplates:TemplatingDisabled` | 409 | Templates are not switched on for this account yet. |
| `EntityTemplates:TemplatingNotSupportedForContracts` | 400 | Templates are not available for contracts. |

### Favorites

| Code | Status | Message |
| --- | --- | --- |
| `Favorites:EntityTypeRequired` | 400 | The favorite entity type is required. |
| `Favorites:FavoriteNotFound` | 404 | The favorite was not found. |
| `Favorites:LabelRequired` | 400 | The favorite label is required. |
| `Favorites:MaxPerUserReached` | 403 | Maximum number of favorites reached. |
| `Favorites:RouteRequired` | 400 | The favorite route is required. |
| `Favorites:UnknownEntityType` | 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:CampaignInactive` | 409 | This payment link belongs to a campaign that is not currently accepting payments. |
| `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:CatalogUnavailable` | 409 | The products on this page could not be priced. Check that each product is still active in the catalog. |
| `HostedPaymentPage:HppSession:Completed` | 409 | This payment link has taken all the payments it was set up to accept. |
| `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:CreateIdempotencyInProgress` | 409 | A session with this idempotency key is already being created. Retry shortly; the retry returns the original session. |
| `HostedPaymentPage:HppSession:CreateIdempotencyKeyReused` | 409 | This idempotency key was already used for a different session request. Use a new key, or resend the original request unchanged. |
| `HostedPaymentPage:HppSession:CreateIdempotencySessionGone` | 409 | This idempotency key can no longer be resolved to a session, so the original response cannot be returned. Use a new idempotency key to open a new session. |
| `HostedPaymentPage:HppSession:CreateIdempotencyStoreUnavailable` | 429 | The idempotency check could not be completed. Please retry the request. |
| `HostedPaymentPage:HppSession:CurrencyNotSupported` | 400 | This merchant does not accept payments in the requested currency. Omit the currency to use the merchant's own currency, or send that code. |
| `HostedPaymentPage:HppSession:CustomerEmailVisibilityNotAllowed` | 400 | The customer email visibility requested for this session is not allowed. Bind a customerId to the session, or request a visibility the merchant's email rule and this session type permit, or omit it to use the page setting. |
| `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:FeeAmountModeNotApplicable` | 400 | A tax or shipping amount mode does not apply to a card-capture session. |
| `HostedPaymentPage:HppSession:FeeAmountModeRequiresPrefill` | 400 | A suggested or locked tax or shipping amount needs a tax or shipping value of zero or more. |
| `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:Paused` | 409 | This payment link is paused and is not accepting payments right now. |
| `HostedPaymentPage:HppSession:PaymentLinkBaseUrlNotConfigured` | 403 | Payment links cannot be sent because the application's public URL is not configured. Contact your administrator. |
| `HostedPaymentPage:HppSession:ProductSelectionInvalid` | 400 | A product selection is not valid for this page: the product is not offered, a required product was left out, or the quantity is outside its limits. |
| `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:ReusableNotApplicable` | 400 | This payment link cannot be reused: a link for one named customer, an invoice link, and a card-capture link each accept a single payer. |
| `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:LockedFieldChange` | 403 | This page is locked. Its purpose, owning merchant, and active state cannot be changed while it is locked. Unlock the page first to change these. |
| `HostedPaymentPage:PageProductCurrencyMismatch` | 400 | A product on this page is priced in a different currency than the merchant's. A hosted page charges in the merchant's currency. |
| `HostedPaymentPage:PageProductNotFound` | 400 | A product on this page could not be found in the merchant's catalog, or is no longer active. |
| `HostedPaymentPage:PageProductQuantityInvalid` | 400 | A product's quantity settings on this page fall outside the catalog's limits for that product. Adjust the default, minimum or maximum quantity, or use whole units. |
| `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. |
| `HostedPaymentPage:Tax:AmountMismatch` | 409 | The tax on this payment has changed. Review the updated total and pay again. |
| `HostedPaymentPage:Tax:CouldNotBeCalculated` | 409 | Tax could not be calculated for this payment, so it was not taken. Check the address and try again. |
| `HostedPaymentPage:Tax:ModeNotAvailable` | 409 | This tax setting is not available for the page's merchant. Choose one of the merchant's active tax rates, or set up a tax provider for the merchant first. |
| `HostedPaymentPage:Template:SourceNotSaved` | 409 | Save the page before saving it as a template. |
| `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:CustomField:DuplicateKey` | 400 | The custom field {fieldKey} appears more than once in this request. |
| `Invoicing:CustomField:InvalidValue` | 400 | The value for {fieldLabel} is not valid. {detail} |
| `Invoicing:CustomField:PatternInvalid` | 400 | The validation pattern configured for {fieldLabel} could not be evaluated. Correct the custom field definition before using it on an invoice. |
| `Invoicing:CustomField:Required` | 400 | A value is required for {fieldLabel}. |
| `Invoicing:CustomField:UnknownKey` | 400 | The custom field {fieldKey} is not defined for this biller. |
| `Invoicing:CustomFieldDefinition:KeyAlreadyExists` | 409 | A custom field with the key {key} already exists for this biller. Choose a different key. |
| `Invoicing:CustomFieldDefinition:LimitReached` | 409 | This biller already holds the maximum of {maxDefinitions} custom field definitions. Delete one before adding another. |
| `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}) must be less 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 | The invoicing feature this request needs is not enabled for your account. |
| `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:NoteLimitReached` | 409 | This invoice already holds the maximum number of notes. No further note can be added. |
| `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:CustomPriceNotAllowed` | 400 | The unit price for {productName} must be its catalog price of {limit}. This product does not allow a custom price. |
| `Invoicing:LineItem:DescriptionRequired` | 400 | Each line item needs a description. |
| `Invoicing:LineItem:FractionalQuantityNotAllowed` | 400 | The quantity for {productName} must be a whole number. This product does not allow fractional quantities. |
| `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:LineItem:ProductUnavailable` | 400 | The product {productName} is not available for this biller. It may have been removed, deactivated or archived. |
| `Invoicing:LineItem:QuantityAboveMaximum` | 400 | The quantity for {productName} cannot be more than {limit}. |
| `Invoicing:LineItem:QuantityBelowMinimum` | 400 | The quantity for {productName} must be at least {limit}. |
| `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:InstallmentNotPending` | 409 | Installment {sequenceNumber} is {status} and cannot be paid. Only a pending installment can be paid. |
| `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:Refund:AmountInvalid` | 400 | A refund amount must be greater than zero. |
| `Invoicing:Refund:ExceedsAmountPaid` | 409 | A refund cannot exceed the amount collected against the invoice. |
| `Invoicing:Refund:ExecutorUnavailable` | 409 | Refunds are not available in this environment. |
| `Invoicing:Refund:ManualReversalRequiresReason` | 400 | A reason is required to reverse a manually recorded payment. |
| `Invoicing:Refund:NoRefundablePayments` | 409 | This invoice has no collected payment to refund. |
| `Invoicing:Refund:NotAllowedForStatus` | 409 | This invoice cannot be refunded in its current status. |
| `Invoicing:Refund:PartialFailure` | 409 | Some payments were returned before the refund failed. Review the invoice's payment history before retrying. |
| `Invoicing:Refund:RejectedByGateway` | 409 | The payment platform did not complete the refund. Check the transaction before trying again. |
| `Invoicing:Refund:RequiresMerchantScope` | 409 | This invoice is not billed by a merchant, so its gateway payment cannot be refunded. |
| `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:TaxRateLookup:BillerNotMerchant` | 400 | Only a merchant biller can look up a tax rate from a tax provider. |
| `Invoicing:TaxRateLookup:NoDestinationAddress` | 409 | No recipient address was supplied and the recipient has no address on file, so there is no destination address to look up a rate for. |
| `Invoicing:TaxRateLookup:NoOriginAddress` | 409 | The merchant has no default shipping origin and no biller address was supplied, so there is no origin address to look up a rate for. |
| `Invoicing:TaxRateLookup:ProviderFailed` | 409 | The tax provider could not return a rate ({errorCodes}). |
| `Invoicing:TaxRateLookup:ProviderUnavailable` | 409 | No tax provider is available for this merchant. Check the merchant's tax provider binding and that the provider is enabled. |
| `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. |
| `WinkPG.Invoicing:PaymentLinkBaseUrlNotConfigured` | 403 | The invoice payment link could not be built because the hosted payment page base address is not configured. Contact support. |
| `WinkPG.Invoicing:PaymentLinkNotAvailable` | 403 | A payment link is not available for this invoice. |

### 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:ActiveProcessorProfileRequiresPaymentType` | 409 | An active processor profile must have at least one payment type selected. |
| `Merchants:ApmWebhookRegistrationNotPerMerchant` | 400 | This processor's webhooks are registered once for the platform, so the profile has no webhook URL of its own to rotate. |
| `Merchants:CannotDeactivateLastActiveProfileForPaymentType` | 409 | This is the last active profile for its payment type. Deactivating it would leave the merchant unable to process that payment type. |
| `Merchants:CannotDeactivateProcessorWithUnsettledTransactions` | 409 | This processor account cannot be deactivated while it still has unsettled transactions. |
| `Merchants:CannotDeleteProcessorWithUnsettledTransactions` | 409 | This processor account cannot be deleted while it still has unsettled transactions. |
| `Merchants:CannotPromoteSuspendedMerchant` | 409 | This merchant is suspended, so it cannot be promoted to production. Extend the trial to return it to the sandbox first, then promote it. |
| `Merchants:CannotUseLoopbackProfileOutsideSandbox` | 409 | A merchant outside the Sandbox environment cannot have an active loopback processor profile. The loopback processor is a simulator and never contacts a card network. |
| `Merchants:CardAcceptancePolicyIssuerCountriesInvalid` | 400 | Card acceptance policy issuer countries are not valid for the selected mode. The allow list and deny list modes need at least one country and the other modes need none, and every code must be a distinct two-letter ISO 3166-1 alpha-2 country, for example US. |
| `Merchants:CardAcceptancePolicyRefusesEverything` | 400 | Card acceptance policy refuses both credit and debit cards, which refuses very nearly every card. Accept at least one of credit or debit. Prepaid is an overlay on those two rails, so accepting it does not change this. |
| `Merchants:CustomFieldsNotEnabled` | 403 | Custom field configuration is not enabled for this merchant. |
| `Merchants:NoCurrentMerchant` | 400 | No merchant is associated with the current user. The self-service routes resolve the merchant from the signed-in user, so an API key cannot reach them. Read these settings from the merchant route that takes a merchant id in the path; updating them there needs the merchant update permission. |
| `Merchants:OrderDataDefaultsNotEnabled` | 403 | Order data defaults are not enabled for this merchant. |
| `Merchants:PricePlanAssignmentBlockedForCollectionMerchant` | 403 | This merchant is the Merchant Billing collection merchant for its reseller, so it cannot be assigned a Price Plan: a collection merchant cannot bill itself. Clear the Price Plan selection, or choose a different collection merchant on the reseller's billing preferences first. |
| `Merchants:PricePlanAssignmentInvalidPlan` | 403 | The selected price plan cannot be assigned: it does not exist, is inactive, or belongs to a different reseller. Refresh the list and choose an active plan in this reseller. |
| `Merchants:ProcessorRoutingAttestationStale` | 409 | The processor accounts these routing rules send transactions to have changed, so the attestation on record no longer covers them. Confirm again that every processor account these rules route to belongs to the same legal entity as this merchant. |
| `Merchants:ProcessorRoutingTargetProfileUnusable` | 409 | A routing rule must send transactions to one of this merchant's own active processor accounts. |
| `Merchants:RecurringOverrideRequiresActivePaymentMethod` | 403 | This merchant cannot be moved to the recurring contract billing path without an active stored payment method. Capture a payment method for the merchant first, then change the billing path. |
| `Merchants:RecurringOverrideRequiresCollectionMerchant` | 403 | This merchant cannot be set to the recurring contract billing path: its reseller has no collection merchant configured. Set a collection merchant on the reseller's billing preferences first. |
| `Merchants:ResellerRestrictsMerchantToSandbox` | 409 | The reseller this merchant belongs to is marked as a test reseller, so the merchant stays in the sandbox and cannot be promoted. Turn off Is Test on the reseller first, then promote this merchant on its own. |
| `Merchants:SettlementTimeOffCadence` | 400 | Settlement Time must fall on a settlement cadence boundary and carry no seconds. Auto settlement runs on a fixed cadence, so a time between cadence marks is never acted on. |
| `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. |
| `Merchants:TrialExtensionMerchantHasNoTrial` | 400 | This merchant is not on a trial, so there is no trial to extend. |
| `Merchants:TrialExtensionNotInFuture` | 400 | The new trial end date must be in the future. Choose a later date and try again. |
| `Merchants:TrialExtensionSuspensionNotFromTrial` | 409 | This merchant was suspended for a reason other than its trial ending, so extending the trial does not lift the suspension. Lift the suspension by changing the merchant's environment first. |

### Multi Merchant

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

### Notifications

| Code | Status | Message |
| --- | --- | --- |
| `Notifications:ChannelIdsRequired` | 400 | At least one channel is required on a subscription. |
| `Notifications:ChannelInUseBySubscription` | 409 | This channel cannot be deleted while these subscriptions use it: {subscriptionNames}. |
| `Notifications:ChannelNameAlreadyExists` | 409 | A channel with this name already exists in this scope. |
| `Notifications:ChannelNotFound` | 404 | The channel could not be found. |
| `Notifications:ChannelScopeViolation` | 403 | The channel's scope is not compatible with the subscription's scope. |
| `Notifications:DeliveryNotFound` | 404 | The delivery record could not be found. |
| `Notifications:DeliveryNotRetryable` | 409 | This delivery cannot be retried from its current status ({Status}). |
| `Notifications:DestinationConfigUnreadable` | 409 | This destination's configuration could not be read. Correct the configuration before trying again. |
| `Notifications:DestinationInUseByChannel` | 409 | This destination cannot be deleted while these channels use it: {channelNames}. |
| `Notifications:DestinationNameAlreadyExists` | 409 | A destination with this name already exists in this scope. |
| `Notifications:DestinationNotFound` | 404 | The destination could not be found. |
| `Notifications:DestinationScopeViolation` | 403 | The destination's scope is not compatible with the scope of the record referencing it. |
| `Notifications:EventTypeNotAvailable` | 403 | One or more of the selected event types cannot be delivered, so the subscription would never fire. |
| `Notifications:EventTypesRequired` | 400 | At least one event type is required. |
| `Notifications:FilterExpressionTooDeep` | 400 | The filter expression is nested too deeply. |
| `Notifications:FilterExpressionTooManyConditions` | 400 | The filter expression has too many conditions. |
| `Notifications:InsufficientScopeAccess` | 403 | You do not have access to the selected scope. |
| `Notifications:InvalidDestinationConfig` | 400 | The destination configuration is not valid. |
| `Notifications:InvalidFilterExpression` | 400 | The filter expression is not valid. |
| `Notifications:ListenSessionMerchantRequired` | 403 | A listen session covers one merchant, so select a merchant before opening one. |
| `Notifications:ListenSessionNotActive` | 404 | That listen session is not available. It may have ended, expired, or never existed. Open a new session to keep listening. |
| `Notifications:ListenSessionSampleEnvironmentUnknown` | 403 | Sample events are for sandbox only, and this request carries nothing that says which environment it is acting in. Use a test API key (sk_test_); a key issued before environments existed has to be rotated before it can trigger a sample. |
| `Notifications:ListenSessionSampleProductionRefused` | 403 | Sample events are for sandbox only. This request used a live API key, and a sample is a synthetic event that never happened, so it is not delivered alongside real traffic. Use a test key (sk_test_) to trigger a sample. |
| `Notifications:MerchantIdRequiredForMerchantScope` | 400 | A merchant is required when the subscription scope is Merchant. |
| `Notifications:QuickSetupAlreadyExists` | 409 | A quick-setup subscription already exists for this item. |
| `Notifications:QuickSetupContextFilterMismatch` | 400 | The quick-setup filter does not pin the subscription to the item its context key names. |
| `Notifications:ResellerIdRequiredForResellerScope` | 400 | A reseller is required when the subscription scope is Reseller. |
| `Notifications:SecretRotationAlreadyInProgress` | 409 | A signing-secret rotation is already in progress for this destination. Promote or cancel it before starting another. |
| `Notifications:SecretRotationNoPrimarySecret` | 409 | This destination has no signing secret, so there is nothing to rotate. Set a secret on the destination first. |
| `Notifications:SecretRotationNotInProgress` | 409 | No signing-secret rotation is in progress for this destination. |
| `Notifications:SecretRotationNotSupported` | 400 | Signing-secret rotation applies to webhook destinations only. This destination is a {destinationType} destination. |
| `Notifications:SecretRotationSecretInvalid` | 400 | The replacement signing secret must be at least {minLength} characters. |
| `Notifications:SecretRotationSecretUnchanged` | 409 | The replacement signing secret is the same as the current one, so rotating to it would change nothing. |
| `Notifications:SubscriptionNameAlreadyExists` | 409 | A subscription with this name already exists in this scope. |
| `Notifications:SubscriptionNotFoundForDelivery` | 404 | The subscription behind this delivery could not be found, so it cannot be retried. |
| `Notifications:TooManyChannels` | 400 | A subscription can have at most {max} channels. |
| `Notifications:TooManyEventTypes` | 400 | A subscription can have at most {max} event types. |
| `Notifications:UnknownEventType` | 400 | The event type '{eventType}' is not in the event registry. |
| `Notifications:UnsubscribeFailed` | 400 | The unsubscribe request could not be processed. Please try again. |
| `Notifications:UnsupportedDestinationType` | 400 | This destination type is not supported yet. |
| `Notifications:WebhookEventsMerchantRequired` | 403 | This reads one merchant's own webhook deliveries, so the credential has to resolve a single merchant. Use a merchant-scoped API key. |
| `Notifications:WebhookReplayBudgetExhausted` | 429 | This endpoint has used its replay allowance for the current window. The delivery is unchanged. Wait for the window to roll over, then replay it. |
| `Notifications:WebhookReplayEndpointSuppressed` | 409 | This delivery's destination endpoint is suppressed, so nothing would be sent. The delivery is unchanged. Clear the suppression, then replay it. |
| `Notifications:WebhookReplayUnavailable` | 409 | Webhook replay is unavailable on this deployment, so nothing was changed. Try again shortly. |

### 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 | The payment request has no currency. Set a currency on the request before you start a one-time payment. |

### Payment Encryption Virtu Crypt

| Code | Status | Message |
| --- | --- | --- |
| `03` | 403 | A token value is outside the range the command accepts. |
| `04` | 403 | A required token is missing. The AN token names which. |
| `06` | 403 | The major key the request named is not loaded on the HSM. |
| `07` | 403 | The storage-table slot the request named holds no key. |
| `15` | 403 | The HSM timed out talking to something behind it. |
| `17` | 403 | A message authentication code did not verify. |
| `19` | 403 | The function is not supported or is blocked, which is how an unlicensed command reads. |
| `20` | 403 | The command is not allowed in the HSM's current state. |
| `26` | 403 | The feature is not licensed on this HSM. |
| `34` | 403 | The token is invalid, which is what an expired or malformed bearer token reads as. |
| `45` | 403 | The transaction counter in the key serial number is illegal. |
| `46` | 403 | The key serial number is the same as the current one, so the counter did not advance. |
| `48` | 403 | The wrapped key block could not be unwrapped. |
| `49` | 403 | The login was refused. |
| `50` | 403 | The session is not logged in. |
| `63` | 403 | The key is the wrong type for the command, commonly a wrong major key. |
| `84` | 403 | The derived key is weak and the HSM refuses to use it. |
| `91` | 403 | The identity holds no permission for this command. |
| `93` | 403 | The transaction counter is illegal. The second code the HSM uses for the same fault. |

### 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 Wallets 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 Google Pay

| Code | Status | Message |
| --- | --- | --- |
| `PaymentTokenization:GooglePay:AuthMethodNotSupported` | 403 | The Google Pay payment token used a card authentication method this gateway does not support. |
| `PaymentTokenization:GooglePay:DecryptionFailed` | 403 | The Google Pay payment token could not be decrypted. Check that the key pair in Key Vault is the one the payment page published its public key from. |
| `PaymentTokenization:GooglePay:GatewayMerchantIdMismatch` | 403 | The Google Pay payment token was minted for a different merchant. Check that the gateway merchant ID on the wallet registration matches the one the payment page was configured with. |
| `PaymentTokenization:GooglePay:PayloadFieldsMissing` | 403 | The Google Pay payment token decrypted but carried no usable card number or expiration date. |
| `PaymentTokenization:GooglePay:PrivateKeyNotConfigured` | 403 | Google Pay is not provisioned for this environment. Check that a key alias is set in the Wallets settings and that the wallet registration carries a Google merchant ID. |
| `PaymentTokenization:GooglePay:RootKeysUnavailable` | 403 | Google's root signing keys could not be retrieved, so the payment token's signature could not be checked. Check the root signing keys URL in the Wallets settings. |
| `PaymentTokenization:GooglePay:SignatureVerificationFailed` | 403 | The Google Pay payment token's signature did not verify. Check that the merchant's Google merchant ID matches the one the payment page was configured with. |
| `PaymentTokenization:GooglePay:TokenExpired` | 403 | The Google Pay payment token has expired and cannot be used. |
| `PaymentTokenization:GooglePay:TokenMalformed` | 403 | The Google Pay payment token could not be read. Only the ECv2 protocol version is supported. |

### 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 Wallets 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). |
| `PhoeniXGateV2:UnknownFeatureProvider` | 400 | There is no feature provider named {ProviderName}. Features can only be read or changed for a provider this system manages. |
| `PhoeniXGateV2:UnknownPermissionProvider` | 400 | There is no permission provider named {ProviderName}. Permissions can only be read or changed for a provider this system manages. |
| `PhoeniXGateV2:UserNameChangeNotSupportedOnSelfServiceProfile` | 403 | Username cannot be changed from the profile page. Contact an administrator if you need a different username. |
| `Volo.Account:PhoneNumberConfirmationDisabled` | 403 | Phone number confirmation is disabled! |
| `Volo.Account:PhoneNumberEmpty` | 400 | Phone number is empty! |

### Promotions

| Code | Status | Message |
| --- | --- | --- |
| `Promotions:ApplicabilityTargetsRequired` | 400 | A promotion narrowed to pages, products or plans must name at least one. |
| `Promotions:CurrencyRequiredForFlatDiscount` | 400 | A flat-amount promotion must name the currency its value is in. |
| `Promotions:DiscountValueOutOfRange` | 400 | A {DiscountType} discount of {Value} is outside the allowed range, which tops out at {Maximum}. |
| `Promotions:DurationCyclesRequired` | 400 | Say how many billing cycles the discount runs for. |
| `Promotions:LimitOutOfRange` | 400 | That limit is outside the allowed range. |
| `Promotions:MerchantIdIsImmutable` | 409 | A promotion cannot be moved to a different merchant after it is created. |
| `Promotions:PromotionCodeAlreadyExists` | 409 | Another promotion of this merchant already uses that code. |
| `Promotions:PromotionNotFound` | 404 | That promotion could not be found. |
| `Promotions:RedemptionContention` | 409 | That promotion is being used by too many customers at once. Please try again. |
| `Promotions:RedemptionLimitReached` | 409 | That promotion has been fully used. |
| `Promotions:StartMustBeBeforeEnd` | 400 | The promotion start must fall before the promotion end. |
| `Promotions:TooManyApplicabilityTargets` | 400 | A promotion can name at most {Maximum} pages, products or plans, and {Requested} were given. |

### 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. |

### Reports

| Code | Status | Message |
| --- | --- | --- |
| `Reports:ExportFormatNotSupported` | 400 | This report cannot be exported as {Format}. |
| `Reports:InvalidFilterValue` | 400 | The value for the filter '{Filter}' is not valid. |
| `Reports:MerchantFilterNotSupported` | 400 | This report cannot be narrowed to a single merchant. |
| `Reports:MerchantNotInScope` | 404 | The merchant was not found or is not available to you. |
| `Reports:ReportNotFound` | 404 | The report was not found. |
| `Reports:RowLimitExceeded` | 400 | The report returned more than {MaxRowCount} rows. Narrow the date range or add filters, then run it again. |
| `Reports:UnknownFilter` | 400 | The filter '{Filter}' is not defined for this report. |

### Resellers

| Code | Status | Message |
| --- | --- | --- |
| `Resellers:CaptureHppPageRejected` | 403 | The selected card capture Hosted Payment Page is not valid. It must be an active Save Card page that belongs to this reseller. |
| `Resellers:CardAcceptanceDefaultIssuerCountriesInvalid` | 400 | The card acceptance default's issuer countries are not valid for the selected mode. The allow list and deny list modes need at least one country and the other modes need none, and every code must be a distinct two-letter ISO 3166-1 alpha-2 country, for example US. |
| `Resellers:CardAcceptanceDefaultRefusesEverything` | 400 | The card acceptance default refuses both credit and debit cards, or every card type, which refuses very nearly every card for every merchant that inherits it. Accept at least one of credit or debit, and at least one of consumer, commercial or GSA. |
| `Resellers:CollectionMerchantRejected` | 403 | The selected collection merchant is not valid. It must be an active merchant that belongs to this reseller. |
| `Resellers:DefaultTaxRateRejected` | 403 | The selected default tax rate is not valid. It must be an active tax rate that belongs to this reseller. |
| `Resellers:InvoiceTemplateRejected` | 403 | The selected invoice template is not valid. It must be an active template that belongs to this reseller. |
| `Resellers:ResellerParentCheckUnavailable` | 403 | The reseller hierarchy could not be checked, so the parent change was not saved. Try again in a moment. |
| `Resellers:ResellerParentCreatesCycle` | 403 | A reseller cannot be moved beneath itself or beneath one of its own sub resellers. Choose a parent outside this reseller's hierarchy. |
| `Resellers:ResellerParentNotPermitted` | 403 | You can only place a reseller beneath your own reseller. Choose your reseller, or one below it, as the parent. |
| `Resellers:SubResellerCreationDisabled` | 403 | Sub resellers are not enabled for this reseller. Ask an administrator to turn on the Sub Resellers option before creating one. |
| `Resellers:TopLevelResellerRequiresAdmin` | 403 | Only an administrator can create a top-level reseller. Choose a parent reseller for the new reseller. |

### 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:InvalidTarget` | 400 | The target reseller or merchant is not valid. |
| `WinkPG.ScopedSettings:NotOverridable` | 403 | This setting cannot be overridden at the requested scope. |
| `WinkPG.ScopedSettings:ProviderNotAllowed` | 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. |
| `WinkPG.ScopedSettings:ScopeUnavailable` | 403 | No reseller or merchant scope is available to save this setting against. |

### 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:CardDataElementRequired` | 400 | No card data was supplied. |
| `CardData:CardExpired` | 400 | The card has expired. |
| `CardData:CardNumberFailedLuhn` | 400 | The card number is not valid. |
| `CardData:CardNumberLengthInvalid` | 400 | The card number must be 13 to 19 digits. |
| `CardData:CardNumberRequiredForManualEntry` | 400 | Manual entry requires a card number. |
| `CardData:CardVerificationValueConflict` | 400 | CardVerificationValue and Cvv were both sent with different values. Send only CardVerificationValue. |
| `CardData:CvPresenceConflictsWithSuppliedCvv` | 400 | A card security code was supplied, but the card verification indicator says none was collected. |
| `CardData:CvPresenceRequiresCvv` | 400 | The card verification indicator says a card security code was collected, but none was supplied. |
| `CardData:CvvLengthInvalid` | 400 | The card security code must be 3 or 4 digits. |
| `CardData:EmvDataRequiredForIccOrProximity` | 400 | A chip or contactless transaction requires EMV data. |
| `CardData:EncryptedTrackNotAllowedForManualEntry` | 400 | Encrypted track data is not allowed on a manual-entry request. |
| `CardData:EncryptedTrackNotAllowedForUnencryptedIcc` | 400 | Encrypted track data is not allowed on an unencrypted chip or contactless transaction. |
| `CardData:EncryptedTrackNotAllowedForUnencryptedSwipe` | 400 | Encrypted track data is not allowed on an unencrypted card-reader swipe. |
| `CardData:EncryptedTrackRequiredForEncryptedSwipe` | 400 | An encrypted card-reader swipe requires encrypted track data. |
| `CardData:EntryModeIncompatibleWithTerminalCapability` | 400 | A chip or fallback entry mode is not compatible with a stripe-only terminal capability. |
| `CardData:ExpirationRequired` | 400 | Manual entry requires a card expiration date. |
| `CardData:FullCardNumberNotAllowedOnStoredSnapshot` | 400 | A stored payment method carries only a masked card number. Send the masked value you read, or leave the card number out. |
| `CardData:ManualEntryNotAllowedWhenEncrypted` | 400 | Manual entry cannot be combined with encrypted track data. |
| `CardData:TrackDataNotAllowedForEncryptedSwipe` | 400 | Unencrypted track data is not allowed on an encrypted card-reader swipe. |
| `CardData:TrackDataNotAllowedForManualEntry` | 400 | Track data is not allowed on a manual-entry request. |
| `CardData:TrackOrEmvRequiredForUnencryptedSwipe` | 400 | An unencrypted card-reader swipe requires track or EMV data. |
| `CustomerAddress:Address1Required` | 400 | Address1 is required. |
| `CustomerAddress:AddressEntryMustNotBeNull` | 400 | An address entry must not be null. |
| `CustomerAddress:CityRequired` | 400 | City is required. |
| `CustomerAddress:SingleDefaultAddressRequired` | 400 | When an address is supplied, exactly one must be set as the default. |
| `CustomerAddress:StateRequired` | 400 | State is required. |
| `CustomerAddress:ZipRequired` | 400 | Zip code is required. |
| `DeviceData:EncryptionKeyVariantInvalid` | 400 | The encryption key variant is not recognized. Use Data or Pin. |
| `DeviceData:PinVariantNotSupportedForProviderDecryption` | 400 | The Pin key variant is not supported with a DUKPT or ONGUARD encryption type. Send the Data variant or omit the field. |
| `Merchants:ScreeningProviderProcessorConflict` | 409 | This screening provider cannot be used alongside one of the merchant's active processors. |
| `PhoeniXGateV2:RoleLadderConflict` | 400 | A user's roles must all belong to a single account type, and it must be the user's own. User type: {UserType}. Conflicting roles: {ConflictingRoles} ({SpannedTypes}). Remove the roles that do not belong to the user's account type, or change the user type to match them. |

### Shipping

| Code | Status | Message |
| --- | --- | --- |
| `Shipping:DefaultCannotBeCleared` | 409 | This is the current default. Make another one the default first; the flag moves in one step. |
| `Shipping:DefaultCannotBeDeleted` | 409 | This is the current default and others exist. Make another one the default before deleting this one. |
| `Shipping:MerchantIdIsImmutable` | 409 | A ship-from origin or parcel preset cannot be moved to a different merchant after it is created. |
| `Shipping:OriginNotFound` | 404 | That ship-from origin could not be found. |
| `Shipping:ParcelMeasureOutOfRange` | 400 | Every parcel measure must be greater than zero and no more than {Maximum}. |
| `Shipping:ParcelPresetNotFound` | 404 | That parcel preset could not be found. |
| `Shipping:QuoteDestinationChanged` | 409 | The shipping address changed after the rate was quoted. Get shipping rates again for the new address. |
| `Shipping:QuoteExpired` | 409 | That shipping rate has expired. Get shipping rates again and choose a service. |
| `Shipping:QuoteNotFound` | 404 | That shipping rate could not be found. Get shipping rates again and choose a service. |
| `Shipping:QuoteOptionNotFound` | 404 | That shipping service is not one of the rates offered. Get shipping rates again and choose a service. |
| `Shipping:QuoteRateLimitExceeded` | 429 | Too many shipping rate quotes were requested for this merchant. Wait a moment and try again. |

### Step Up

| Code | Status | Message |
| --- | --- | --- |
| `WinkPG.StepUp:MfaEnrolmentRequired` | 403 | This action needs an authenticator app. Set one up in your security settings, then try again. |
| `WinkPG.StepUp:NoInteractiveSession` | 403 | This action can only be performed by a signed-in person, so it cannot run from an automated caller or an API key. |
| `WinkPG.StepUp:Required` | 403 | For your security, confirm it is you before continuing. |
| `WinkPG.StepUp:UnknownAction` | 403 | This action is misconfigured and has been refused. Contact support. |

### Stored Credential Consents

| Code | Status | Message |
| --- | --- | --- |
| `stored_credential_consent_input_invalid` | 400 | A capture request was submitted with fields that contradict each other (e.g. Captured=false but other fields populated; Recurring-scoped consent with no enrollment terms). |
| `stored_credential_consent_required` | 400 | The transaction would store the card and this merchant requires captured consent. Fetch the terms from GET /api/merchant/stored-credential-consent/config and re-submit with a StoredCredentialConsentInput. |
| `stored_credential_consent_text_version_retracted` | 409 | A transaction submitted a ConsentTextVersion for a template that has been retracted. Refetch the consent config and resubmit. |
| `stored_credential_consent_text_version_unknown` | 400 | A transaction submitted a ConsentTextVersion that does not match any known template. The caller should refetch the consent config and resubmit. |

### Surcharging

| Code | Status | Message |
| --- | --- | --- |
| `Surcharging:ConfigurationAlreadyExists` | 409 | A surcharge configuration already exists for this merchant. |
| `Surcharging:ConfigurationNotFound` | 404 | This merchant has no surcharge configuration to change. Create one before updating it. |
| `Surcharging:DuplicateStatePolicy` | 400 | The same state code appears more than once in the state policy list. |
| `Surcharging:ForceEnableNotAvailable` | 403 | Skipping the notice waiting period is only possible in a non-production environment with the sandbox override setting turned on. |
| `Surcharging:ForceEnableRequiresConfiguration` | 409 | Save a surcharge rate for this merchant before activating surcharging. |
| `Surcharging:InvalidRate` | 400 | The surcharge rate is invalid. |
| `Surcharging:NewNoticeRequiredForProcessorChange` | 409 | This merchant has an active card processor that no filed surcharge notice covers. File a notice for that processor, or one without a processor account to cover every processor, before activating surcharging. |
| `Surcharging:NoApplicableNotice` | 409 | Surcharging cannot start: no filed notice applies to the currently allowed networks. |
| `Surcharging:NoticeNotFound` | 404 | No surcharge notice with this id exists for this merchant. A notice without an id cannot be amended; file a new notice to correct it. |
| `Surcharging:NoticeRequired` | 400 | A surcharge notice must be filed before surcharging can be activated. |
| `Surcharging:ProcessorAccountNotFound` | 400 | The processor account is not one of this merchant's card processor profiles. Use a processor profile id from the merchant's processing settings, or leave the processor account out to file a notice that covers every processor. |
| `Surcharging:PromotionBlockedByPolicy` | 409 | Surcharging cannot be activated: this platform only activates merchants whose card-brand notice was filed the required way, and the notices on file for this merchant were not. File a new notice through the API, or ask an administrator about the automatic promotion source policy. |
| `Surcharging:PromotionHeld` | 409 | Surcharging cannot be activated: a promotion hold is in place for this merchant. Release the hold to allow activation. |
| `Surcharging:QuoteRateLimitExceeded` | 429 | Too many surcharge-quote requests. Please slow down and try again shortly. |
| `Surcharging:RateExceedsCap` | 400 | The surcharge rate exceeds the maximum permitted rate. |
| `Surcharging:RateRequired` | 409 | Set a default surcharge rate, or a rate for every allowed card network, before filing a notice or activating surcharging. |
| `Surcharging:ReEnableRequiresDisabled` | 409 | Surcharging can only be re-enabled from a disabled state. |
| `Surcharging:WaitingPeriodActive` | 409 | Surcharging cannot start yet: the required notice waiting period has not elapsed. |

### Three D Secure

| Code | Status | Message |
| --- | --- | --- |
| `ThreeDSecure:CapabilityNotSupported` | 403 | The configured 3-D Secure provider does not support this step of the authentication. |
| `ThreeDSecure:FeatureDisabled` | 403 | 3-D Secure is not enabled for this account. |
| `ThreeDSecure:ProviderNotRegistered` | 403 | 3-D Secure authentication is not available: the configured provider is not installed on this environment. |

### Three D Secure Fake

| Code | Status | Message |
| --- | --- | --- |
| `ThreeDSecure.Fake:AssertionSignatureMissing` | 400 | The 3-D Secure device confirmation could not be verified because it carried no signature. |
| `ThreeDSecure.Fake:ChallengeResultMissing` | 400 | The 3-D Secure challenge result could not be read because it carried no data. |

### Three D Secure Paay

| Code | Status | Message |
| --- | --- | --- |
| `ThreeDSecure.Paay:AuthenticationRejected` | 400 | The 3-D Secure provider refused this authentication request. |
| `ThreeDSecure.Paay:ChallengeInstructionIncomplete` | 400 | The 3-D Secure challenge could not be started because the provider returned no challenge address. |
| `ThreeDSecure.Paay:ChallengeResultMissing` | 400 | The 3-D Secure challenge result could not be read because it carried no data. |
| `ThreeDSecure.Paay:CredentialsNotConfigured` | 403 | 3-D Secure authentication is not available: the provider credentials have not been configured for this environment. |
| `ThreeDSecure.Paay:CurrencyNotSupported` | 400 | The 3-D Secure provider does not support the currency of this transaction. |
| `ThreeDSecure.Paay:PurchaseContextRequired` | 400 | The 3-D Secure device check could not be prepared because the purchase amount, currency, or browser details were missing. |
| `ThreeDSecure.Paay:ResultNotReady` | 429 | The 3-D Secure provider did not return a result in time. The authentication is still open and can be checked again. |
| `ThreeDSecure.Paay:ThreeRiCredentialsNotConfigured` | 403 | 3-D Secure authentication for stored cards is not available: the provider credentials for it have not been configured for this environment. |
| `ThreeDSecure.Paay:VendorUnavailable` | 429 | The 3-D Secure provider could not be reached. Try again shortly. |

### Transaction Manager

| Code | Status | Message |
| --- | --- | --- |
| `AUTH_RESULT_TIMEOUT` | 429 | The authorization result did not arrive inside the pending-authorization window. The transaction may still complete out of band, so the caller should reconcile rather than assume the charge did not happen. |
| `CardNotAcceptedByMerchantPolicy` | 400 | The merchant's card acceptance policy refuses the card, judged from the BIN data resolved by enrichment. The orchestrator's backstop for the create path's own gate, and the only enforcement point for a payload whose PAN becomes available only after enrichment. |
| `CashAmountExceedsMerchantPolicy` | 400 | A cash sale is above the merchant's maximum cash sale amount. The orchestrator's backstop for the create path's Transactions:CashAmountExceedsMerchantPolicy, for a cash sale that reached orchestration without passing the create path's gate. |
| `CashRegisterRequiredByMerchantPolicy` | 400 | A cash sale names no register and the merchant's cash policy requires one. The orchestrator's backstop for the create path's Transactions:CashRegisterRequiredByMerchantPolicy. |
| `CashSourceNotAllowedByMerchantPolicy` | 400 | A cash sale came from a source other than the Virtual Terminal and the merchant's cash policy takes cash there only. The orchestrator's backstop for the create path's Transactions:CashSourceNotAllowedByMerchantPolicy. |
| `Decline` | 409 | The transaction was rejected before any processor could act on it, typically because every candidate processor was exhausted. |
| `InvalidMerchantInfo` | 404 | The merchant the request named could not be resolved. |
| `MISSING_CONTEXT` | 400 | The request reached the orchestrator without context the flow needs before it can run, such as merchant or user detail the validation stage could not resolve. The response names the missing pieces. |
| `OPERATION_NOT_ALLOWED` | 409 | The requested operation is not valid for the transaction's current state, for example a capture against a transaction that was never authorized. |
| `PaymentechIncrementalAuthorization.BrandNotSupported` | 403 | The card brand on the transaction does not support incremental authorization at Paymentech. |
| `PaymentechIncrementalAuthorization.InvalidAmount` | 403 | The requested incremental authorization amount is not one the Paymentech host accepts. |
| `PaymentechIncrementalAuthorization.MissingAuthCode` | 403 | An incremental authorization named no authorization code from the original approval, which the Paymentech host requires to attach the increment to it. |
| `PaymentechIncrementalAuthorization.MissingFields` | 403 | An incremental authorization reached the Paymentech handler without the fields the host requires to raise the reserved amount. |
| `PaymentechIncrementalAuthorization.NotAuthorized` | 403 | An incremental authorization was requested against a transaction that is not in an authorized state, so there is no reservation to raise. |
| `PaymentechReversal.PartialReleaseUnavailable` | 403 | A partial release could not be resolved to an amount the Paymentech host would accept, so no reversal was attempted. |
| `PinDebitNotSupportedOnCreditBin` | 400 | The request asked for a PIN debit funding source on a card whose BIN is credit. The two directives contradict each other and no processor can satisfy both. |
| `PolicyRejected` | 403 | A platform policy rule refused the transaction, for example the certification-overrides gate. |
| `ProcessorNotConfigured` | 409 | No processor could be selected for this transaction. A merchant configuration change is needed before a retry can succeed. |
| `REVIEW_DECLINED` | not an HTTP status | A reviewer declined a transaction that fraud screening had held for manual review. This is a policy refusal and it is final: a human looked at this order and rejected it. Read from responseData.declineReasonCode on the transaction rather than from a response status. |
| `REVIEW_EXPIRED` | not an HTTP status | A transaction held for manual review reached its deadline with no disposition, and the merchant's configured expiry action was to decline. Nobody rejected the order; nobody released it either. Read from responseData.declineReasonCode on the transaction rather than from a response status. |
| `Reject` | 409 | The transaction was rejected by the orchestrator's own pre-authorization checks. |
| `SCREENING_STOPPED` | 403 | A screening contributor stopped the transaction. This is a policy refusal and it is final: resubmitting the same request will be stopped again. |
| `SCREENING_UNAVAILABLE` | 429 | Screening could not be completed, for example a screening provider timed out or its circuit is open, on a profile configured to hard stop. Retrying later may succeed with no configuration change. |
| `ThreeDSecureAuthenticationRequired` | 400 | The merchant requires 3-D Secure authentication and the transaction arrived without a usable one. Raised by the pipeline's 3DS stage for a merchant on the Require policy mode when no authentication ran, the issuer did not authenticate, or the result handed to the pipeline failed validation. |
| `TransactionManager:NoAuthorizationContributorRegistered` | 403 | No payment processor integration is registered for processor '{ProcessorKey}'. Please contact support. |
| `UserAuthenticationFailed` | 404 | The user the request named could not be resolved. |
| `VALIDATION_FAILED` | 400 | The transaction failed validation. |

### Transactions

| Code | Status | Message |
| --- | --- | --- |
| `ACH_REPEAT_AMOUNT_REQUIRED` | 400 | A Repeat against a bank-account (ACH) transaction needs an amount greater than zero, because a repeat of a check tender is always a fresh debit. Re-submit with the amount to debit. |
| `ADJUSTMENT_TYPE_NOT_SUPPORTED` | 409 | The merchant's active processor does not support the adjustment the request asked for (OfflineAdjustment or IncrementalAuthorization). Submit an adjustment the processor supports, or route the merchant to one that offers the shape you need. |
| `Decryption:InvalidPayload` | 400 | The encrypted payload is missing the key serial number or the encrypted track data needed to decrypt it. |
| `Decryption:InvalidResult` | 409 | The payment encryption provider returned no usable cleartext for the payload. |
| `Decryption:KeyDeactivated` | 403 | The key serial number matches a key that has been deactivated for the merchant. |
| `Decryption:ProviderAuthenticationFailed` | 409 | The payment encryption provider refused the gateway's credentials. |
| `Decryption:ProviderNotConfigured` | 403 | The merchant's payment encryption provider cannot decrypt this payload: the provider does not support the scheme, or the matched key is not fully configured. |
| `Decryption:ProviderRejected` | 409 | The payment encryption provider refused to decrypt the payload. |
| `Decryption:Timeout` | 429 | The payment encryption provider did not respond in time. Retry the request. |
| `Decryption:UnknownKeySerialIdentifier` | 403 | The key serial number does not match any key serial identifier configured for the merchant. |
| `OPERATION_IDEMPOTENCY_KEY_CONFLICT` | 409 | The operation IdempotencyKey was already used on this transaction for a different OperationType. A key identifies one logical operation attempt, so use a fresh key for the new operation. |
| `OPERATION_IDEMPOTENCY_STORE_UNAVAILABLE` | 429 | The operation-idempotency dedupe store could not be consulted or updated. The operation is rejected rather than executed without dedupe protection. Retry the operation with the same key. |
| `OPERATION_IN_PROGRESS` | 409 | The same operation is already in flight for this transaction and IdempotencyKey. Poll the transaction status for the final outcome rather than re-submitting. |
| `OPERATION_NOT_ALLOWED_IN_STATE` | 409 | The transaction's current state does not allow the requested operation. The error carries operationType, allowedActions, currentStage and settlementStatus under Data. Submit one of the allowed operations, or wait for a stage where this one applies. |
| `OPERATION_TARGET_NOT_FOUND` | 404 | The transaction the operation targets does not exist, or is not visible to this caller. Check the merchant and transaction identifiers. |
| `OfflineAdjustment.FieldsRequired` | 400 | An OfflineAdjustment arrived with nothing to apply: either no OfflineAdjustmentFields bundle, or one in which every field is empty. Populate at least TipAmount. |
| `OfflineAdjustment.TipOnlyUntilWpg20_2682` | 400 | An offline adjustment can only change the tip today. Submit TipAmount on its own; any other field in the bundle is refused. Deprecated: responses also carry OfflineAdjustment.TipOnly in error.data.successorCode, which replaces this code in error.code in a later release. Match on either value. |
| `REVERSAL_AMOUNT_EXCEEDS_REMAINING` | 409 | The requested reversal is larger than the transaction's remaining reversible balance. |
| `REVERSAL_FULLY_CONSUMED` | 409 | The authorisation has already been reversed in full; there is nothing left to reverse. |
| `Transactions:AchAuthorizationEvidenceRequired` | 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:AuthCodeMalformed` | 400 | The auth code must be 1 to 20 alphanumeric characters. |
| `Transactions:BatchSequenceMerchantNotFound` | 403 | The merchant could not be found. |
| `Transactions:BatchSequenceNumberOutOfRange` | 403 | The batch number is outside the range this processor accepts. |
| `Transactions:BatchSequenceProcessorNotFound` | 403 | This merchant has no active processor profile for the selected processor. |
| `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:CardNotAcceptedByMerchantPolicy` | 400 | This merchant does not accept this type of card. Please use a different card. |
| `Transactions:CashAmountExceedsMerchantPolicy` | 400 | This cash sale is above the largest cash sale this merchant accepts. Take the payment by another method. |
| `Transactions:CashRegisterRequiredByMerchantPolicy` | 400 | This merchant requires a register on every cash sale. Select the register the cash was taken into and submit again. |
| `Transactions:CashSourceNotAllowedByMerchantPolicy` | 400 | This merchant accepts cash only at the Virtual Terminal. Record the cash sale there, or take the payment by another method. |
| `Transactions:CashTenderDeclarationConflictsWithPaymentData` | 400 | A cash transaction cannot carry a payment method. Remove CardData, CheckData, and TokenData, or remove the cash tender declaration. |
| `Transactions:CashTenderNotConfiguredForMerchant` | 400 | This merchant is not configured to accept cash payments. Enable a cash processor profile on the merchant account, or submit the transaction with cardData, checkData, or tokenData instead. |
| `Transactions:CashbackNotAllowedForTender` | 400 | Cashback is available on EBT Cash only. |
| `Transactions:CashbackNotAllowedOnOperation` | 400 | Cash back is only available on a sale. |
| `Transactions:CashbackRequiresCardPresent` | 400 | Cash back requires a card-present entry mode (swipe, chip, contactless, or fallback). |
| `Transactions:CashbackRequiresPin` | 400 | Cash back requires a PIN debit purchase; supply the PIN block. |
| `Transactions:CertificationOverridesNotPermitted` | 403 | Processor certification overrides are not permitted for this merchant or processor profile. |
| `Transactions:ConvenienceFeeDisclosureEvidenceRequired` | 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:ConvenienceFeeNotAllowedForTender` | 400 | A convenience fee cannot be charged on an EBT or eWIC tender. |
| `Transactions:ConvenienceFeeNotEnabled` | 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:CreateIdempotencyInProgress` | 409 | A transaction with this idempotency key is still being processed. Retry shortly with the same key to receive the recorded outcome. |
| `Transactions:CreateIdempotencyStoreUnavailable` | 429 | The idempotency check could not be completed, so the transaction was not submitted. Retry the request with the same key. |
| `Transactions:DatawireProfileNotConfigured` | 409 | This processor profile has no processor configuration, so the Datawire ID could not be saved to it. Open the profile, check its configuration, and save the merchant before registering again. |
| `Transactions:DirectAchVaultUnavailable` | 429 | The bank account could not be saved for this session. Confirm the account holder details, then start the capture again. |
| `Transactions:DirectCaptureSessionUnavailable` | 429 | The card capture session is no longer available. Start the capture again. |
| `Transactions:EnhancedDataRequirementsNotMet` | 400 | This merchant requires complete enhanced data on a commercial card. Correct the values named below and submit again. |
| `Transactions:FollowUpCardExpirationMismatch` | 400 | The card expiration does not match the original authorization. |
| `Transactions:FollowUpCardNumberMismatch` | 400 | The card number does not match the original authorization. |
| `Transactions:FollowUpMerchantMismatch` | 400 | The original transaction belongs to a different merchant. |
| `Transactions:FollowUpOriginalNotAuthorization` | 409 | A force can only be applied to an authorization. |
| `Transactions:FollowUpPostOperationReadFailed` | 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:ForceRequestShapeInvalid` | 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:HppSessionInvalidTransactionType` | 400 | This transaction type cannot be submitted from a hosted payment page. |
| `Transactions:HppSessionLinkVerificationFailed` | 400 | This payment session could not be verified. Start the payment again. |
| `Transactions:InvalidStoredCardExpiration` | 400 | The stored card expiration on this contract is missing or unreadable. Update the contract's payment method. |
| `Transactions:InvalidStoredCardPaymentToken` | 400 | The stored card payment method on this contract could not be resolved. Update the contract's payment method. |
| `Transactions:InvalidStoredCheckPaymentToken` | 400 | The stored bank account on this contract could not be resolved. Update the contract's payment method. |
| `Transactions:KeyedCardEntryNotSupportedByProcessor` | 403 | This merchant's processor requires card data captured by a reader, so a manually keyed card cannot be charged. |
| `Transactions:LinkedRefundInstrumentMismatch` | 400 | The payment instrument does not match the original transaction's. |
| `Transactions:MerchantCannotProcessCheck` | 403 | This merchant cannot accept eCheck (ACH) payments. No active ACH processor is configured for the merchant. |
| `Transactions:MerchantIdRequired` | 400 | A merchant is required for this request. |
| `Transactions:MerchantInitiatedCustomerIdRequired` | 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:MerchantNotFoundOrAccessDenied` | 404 | The merchant could not be found, or you do not have access to it. |
| `Transactions:NoMerchantsAvailable` | 403 | Your account has no merchants associated with it. |
| `Transactions:OperationNotAllowed` | 409 | The operation '{requestedOperation}' is not allowed on a {originalTransactionType} transaction with result '{result}' and settlement state '{settlementState}'. |
| `Transactions:OriginalTransactionIdMalformed` | 400 | The original transaction id is not a valid identifier. |
| `Transactions:OriginalTransactionReferenceRequired` | 400 | A void or return needs either the original transaction id or the merchant transaction id. |
| `Transactions:PartialApprovalAcknowledgmentUnavailable` | 409 | This decision cannot be applied yet on this gateway build. The partial approval is unchanged and still awaiting a decision; voiding it is available in the meantime. |
| `Transactions:PartialApprovalDeferralNotAllowed` | 400 | This merchant does not accept partial approvals, so there is no partial approval to decide. Nothing was charged. Remove deferPartialApprovalAcknowledgment and submit again. |
| `Transactions:PartialApprovalNotFound` | 404 | This transaction was not partially approved, so there is no decision to record. |
| `Transactions:PartialApprovalNotObserved` | 429 | The decision was submitted, but the updated transaction could not be read in time. Refresh the transaction to see the outcome; do not submit the decision again. |
| `Transactions:PartialApprovalNotPending` | 409 | This partial approval has already been decided. It was accepted, voided or moved to a split tender, or its acknowledgment deadline passed and the reduced authorization was voided. Refresh the transaction to see the outcome. |
| `Transactions:PartialApprovalTransactionNotFound` | 404 | Transaction not found. |
| `Transactions:PartialApprovalVoidReasonNotPermitted` | 400 | The void reason looks like it contains card or credential data, or a reason was supplied on a decision that does not record one. Describe why the reduced amount was rejected without it. |
| `Transactions:PartialApprovalVoidReasonTooLong` | 400 | The void reason is too long. Shorten it and submit the decision again. |
| `Transactions:PaymentMethodRequiredForNonCashMerchant` | 400 | A payment method is required. Provide cardData, checkData, or tokenData. This merchant is not configured to accept cash payments. |
| `Transactions:PaymentTokenNotOwnedByCustomer` | 403 | The requested payment token does not belong to the customer. Ownership verification failed. |
| `Transactions:PaymentTokenNotOwnedByMerchant` | 403 | The requested payment token does not belong to the merchant. Ownership verification failed. |
| `Transactions:PayoutRequiresCheckData` | 400 | Payout requires CheckData (bank account routing and account number). Payout is an ACH credit operation; card payouts are not supported. |
| `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:ReceiptSplitTenderSummaryNotGeneratedPerTransaction` | 400 | A split tender summary receipt covers every payment in the group and is generated automatically when the last payment completes. It cannot be generated for a single transaction. |
| `Transactions:RecurringBillingNoResolvablePaymentInstrument` | 409 | This recurring contract has no usable payment method. Add a card or bank account to the contract. |
| `Transactions:RefundAmountExceedsRemaining` | 409 | The refund amount is greater than the amount still refundable on this transaction. |
| `Transactions:ReversalAmountExceedsRemaining` | 409 | The reversal amount is greater than the amount still reversible on this transaction. |
| `Transactions:ReviewDispositionNotObserved` | 429 | The decision was submitted, but the updated transaction could not be read in time. Refresh the transaction to see the outcome; do not submit the decision again. |
| `Transactions:ReviewDispositionReasonNotPermitted` | 400 | The review reason looks like it contains card or credential data. Describe the decision without it. |
| `Transactions:ReviewDispositionReasonRequired` | 400 | A reason is required to decline a transaction held for review. |
| `Transactions:ReviewDispositionReasonTooLong` | 400 | The review reason is too long. Shorten it and submit the decision again. |
| `Transactions:ReviewHoldNotFound` | 404 | This transaction was never held for manual review, so there is no decision to record. |
| `Transactions:ReviewNotPending` | 409 | This transaction is not awaiting a review decision. It was already approved or declined, or its review deadline passed. Refresh the queue to see the outcome. |
| `Transactions:ReviewTransactionNotFound` | 404 | Transaction not found. |
| `Transactions:SandboxAchStatusAlreadyInTargetStatus` | 409 | This transaction is already {status}. Advancing it again would publish nothing, because repeat deliveries of the same event are dropped. Use a new transaction to test the same step again. |
| `Transactions:SandboxAchStatusEnvironmentUnknown` | 403 | Advancing an ACH settlement status is for the sandbox only, and this request did not state which environment it was for. Authenticate with a test API key (sk_test_); a key issued before environments existed has to be rotated first. |
| `Transactions:SandboxAchStatusMerchantUnknown` | 403 | This API key is not tied to a merchant, so there is no transaction to advance. Use a key issued for the sandbox merchant that owns the transaction. |
| `Transactions:SandboxAchStatusNotAchSale` | 409 | This endpoint advances ACH sales. The transaction you named is a {transactionType} and carries no check data. |
| `Transactions:SandboxAchStatusNotApproved` | 409 | This ACH sale was not approved, so it has no settlement lifecycle to advance. Send a sale at an approving amount first. |
| `Transactions:SandboxAchStatusNotLoopbackTransaction` | 403 | This transaction was processed by {processor}, not by the sandbox simulator. Only a simulator transaction can have its ACH settlement status advanced by hand. |
| `Transactions:SandboxAchStatusNotSandboxTransaction` | 403 | This transaction was not taken in the sandbox, so its settlement status cannot be simulated. |
| `Transactions:SandboxAchStatusProductionRefused` | 403 | Advancing an ACH settlement status is for the sandbox only, and this request used a live API key. Real ACH status comes from the processor. Use a test key (sk_test_) against a sandbox merchant. |
| `Transactions:SandboxAchStatusTargetStatusRequired` | 400 | Name the settlement status to advance to: SettlementSucceeded, SettlementRolledBack, NotEligible, SettlementFailed, Accepted, Verifying, Originated or PartiallySettled. |
| `Transactions:SandboxAchStatusTransactionNotFound` | 404 | No transaction with this id belongs to the merchant this API key was issued for. |
| `Transactions:SandboxAchStatusTransitionNotAllowed` | 409 | An ACH transaction cannot move from {currentStatus} to {targetStatus}. The intermediate statuses only move forward (Accepted, then Verifying, then Originated, then PartiallySettled), a returned transaction is final, and from any other final status only a late return can still land. |
| `Transactions:SandboxCloseCohortTooLarge` | 409 | This merchant has {count} transactions waiting to settle, and the on-demand close handles at most {maximum} in one request. They will settle on the next scheduled close. |
| `Transactions:SandboxCloseEnvironmentUnknown` | 403 | Closing a batch on demand is for the sandbox only, and this request did not state which environment it was for. Authenticate with a test API key (sk_test_); a key issued before environments existed has to be rotated first. |
| `Transactions:SandboxCloseInProgress` | 409 | A batch close is already running for this merchant. It finishes in the request that started it, so wait for that response rather than retrying this one. |
| `Transactions:SandboxCloseMerchantUnknown` | 403 | This API key is not tied to a merchant, so there is no batch to close. Use a key issued for the sandbox merchant whose batch you want to close. |
| `Transactions:SandboxCloseProductionRefused` | 403 | Closing a batch on demand is for the sandbox only. This request used a live API key, and when a production batch closes is scheduled by the platform. Use a test key (sk_test_) against a sandbox merchant. |
| `Transactions:SettlementAlreadyInProgress` | 403 | A settlement run is already in progress for this merchant. Wait for it to finish, then try again. |
| `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 | The requested settlement status is not a valid target for an override. |
| `Transactions:SettlementOverride:NoOp` | 403 | The transaction is already in the requested settlement status, so there is nothing to change. |
| `Transactions:SettlementOverride:NotEligible` | 403 | This transaction cannot have its settlement status overridden while it is in its current state. |
| `Transactions:SettlementOverride:ReasonRequired` | 403 | A settlement status override needs a reason. Supply one and submit the change again. |
| `Transactions:SettlementOverride:SystemOnlyTarget` | 403 | Only the platform can move a transaction into the requested settlement status. Choose a status an operator is allowed to set. |
| `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:SplitTenderAmountExceedsRemaining` | 409 | The amount is more than the split tender still has to collect. Refresh the transaction and submit no more than the remaining balance. |
| `Transactions:SplitTenderContinuationAmountInvalid` | 400 | An additional payment on a split tender must be for more than zero. |
| `Transactions:SplitTenderContinuationLinkedToOriginal` | 400 | An additional payment on a split tender is a new charge. Remove the original transaction reference and submit it again. |
| `Transactions:SplitTenderContinuationNotSale` | 400 | An additional payment on a split tender must be a sale. |
| `Transactions:SplitTenderGroupBusy` | 409 | Another payment is already being added to this split tender. Nothing was charged. Wait for it to finish, refresh the transaction, and submit again if a balance remains. |
| `Transactions:SplitTenderGroupNotFound` | 404 | Transaction not found. |
| `Transactions:SplitTenderGroupNotOpen` | 409 | This transaction has no split tender open for another payment. The split tender was never started, it is already complete or closed, or the transaction was voided. Refresh the transaction to see what happened. |
| `Transactions:SplitTenderMaxTendersReached` | 409 | This split tender already has the most payments the merchant allows. |
| `Transactions:SplitTenderNotEnabled` | 403 | Split tender is turned off for this merchant, so nothing was changed or charged. A partial approval awaiting a decision can still be accepted or voided. |
| `Transactions:SplitTenderPlanMaxTendersTooLow` | 403 | This merchant allows only one payment per order, so a split tender cannot be planned. Nothing was charged. Submit the payment without a split tender order total. |
| `Transactions:SplitTenderPlanNotFirstPayment` | 400 | Only the first payment of an order can declare a split tender order total. Nothing was charged. Remove the split tender order total and submit again. |
| `Transactions:SplitTenderTenderNotSupported` | 400 | This payment method is not accepted for this split tender payment. Use a card, a bank account or cash. |
| `Transactions:StandaloneTokenCreateIdempotencyInProgress` | 409 | A token with this idempotency key is already being created. Retry shortly; the retry returns the original token. |
| `Transactions:StandaloneTokenCreateIdempotencyKeyReused` | 409 | This idempotency key was already used for a different payment method. No token was created. Use a new key, or resend the original payment details unchanged. |
| `Transactions:StandaloneTokenCreateIdempotencyStoreUnavailable` | 429 | The idempotency check could not be completed, so no token was created. Retry the request with the same key. |
| `Transactions:StandaloneTokenCreateIdempotencyTokenGone` | 409 | This idempotency key can no longer be resolved to a token, so the original response cannot be returned. Use a new idempotency key to create a new token. |
| `Transactions:StoredCredentialConsentLookupUnavailable` | not an HTTP status | The stored payment method's consent status could not be verified, so the automatic charge was not submitted. It will be retried on the next cycle; a failure that repeats needs investigation. Read from payments\[\].declineReasonCode \| installments\[\].lastDeclineReasonCode on the transaction rather than from a response status. |
| `Transactions:SurchargeDisclosureRequired` | 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:SurchargeExceedsPermitted` | 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:SurchargeIsGatewayComputed` | 400 | The gateway computes the surcharge for this merchant; remove the surcharge amount from the request. |
| `Transactions:SurchargeNotAllowedForTender` | 400 | A surcharge cannot be charged on an EBT or eWIC tender. |
| `Transactions:SurchargeNotEligibleForTransaction` | 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:SurchargeNotEnabled` | 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:TenderNotEligibleForRecurringBilling` | 400 | EBT and eWIC tenders cannot be used for recurring billing. |
| `Transactions:TenderNotEligibleForStoredPayment` | 400 | EBT and eWIC tenders cannot be used with a stored payment method. |
| `Transactions:TenderNotEligibleForWalletPayment` | 400 | EBT and eWIC tenders cannot be used with a digital wallet. |
| `Transactions:TenderOperationNotAllowed` | 400 | This operation is not permitted for the selected tender. |
| `Transactions:TenderRequiresCardPresent` | 400 | This tender requires a card-present entry mode. |
| `Transactions:TenderRequiresPin` | 400 | This tender requires the cardholder PIN. |
| `Transactions:TenderRequiresValidEntryMode` | 400 | The entry mode could not be determined, and this tender requires a valid card-present entry mode. |
| `Transactions:TenderTypeImmutableOnChainedTransaction` | 409 | The tender type cannot change on a follow-up transaction. Omit it, or send the same value as the original. |
| `Transactions:TipNotAllowedForTender` | 400 | A tip cannot be added to an EBT or eWIC tender. |
| `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:TokenRedacted` | 409 | This payment token has been redacted. Its stored card or bank account details were permanently erased, so it cannot be reactivated, regenerated, updated or charged. |
| `Transactions:TokenRegenerationFailed` | 429 | The payment token could not be regenerated. Please try again shortly. |
| `Transactions:TransactionManagerUnavailable` | 429 | Transaction Manager is temporarily unavailable. Please try again shortly. |
| `Transactions:UserContextUnavailable` | 403 | Your user context could not be determined, so the merchant could not be validated. Sign in again and retry. |
| `Transactions:VoiceAuthForceCheckDataNotPermitted` | 403 | A voice-authorization force cannot carry check data. Voice approval codes apply to card transactions only. |
| `Transactions:VoiceAuthForceRequiresCardData` | 400 | A voice-authorization force needs the card data supplied with the request. |
| `Transactions:VoucherClearRequiresEbtTender` | 400 | A voucher clear applies to EBT SNAP and eWIC tenders only. |
| `Transactions:VoucherClearRequiresVoucherApprovalCode` | 400 | A voucher clear needs the voucher approval code obtained by phone. |
| `Transactions:VoucherClearRequiresVoucherNumber` | 400 | A voucher clear needs the paper voucher number. |
| `Transactions:WalletNotEnabled` | 403 | This digital wallet is not currently enabled on the platform. |
| `Transactions:WalletNotSupportedForCardPresentIndustry` | 403 | Digital wallet payments are not supported on this merchant's processor profile, which is configured for card-present processing. |
| `VOID_NOT_APPLICABLE_ZERO_DOLLAR_VERIFICATION` | 409 | A Void was requested against a zero-dollar verification authorization, for example a TSYS PREATH. No funds were held, so there is nothing to release. Carries the same Data context as OPERATION_NOT_ALLOWED_IN_STATE. |
| `initiation_type_required` | 400 | A Repeat request did not declare an InitiationType. Re-submit with InitiationType=CardholderInitiated when the cardholder is present, or InitiationType=MerchantInitiated together with an MITReason. |
| `mit_reason_required` | 400 | A merchant-initiated Repeat request did not carry an MITReason. Re-submit with the reason that matches the charge, for example Recurring, UnscheduledCOF, NoShow, DelayedCharge or Installment. |
| `original_transaction_not_resubmittable` | 409 | The original transaction's decline does not qualify for network resubmission. Only NSF-class declines qualify: InsufficientFunds, ActivityLimitExceeded and ExceedsApprovalAmount. Re-submit as a cardholder-initiated charge, or as a general MIT under a captured consent. |
| `resubmission_amount_mismatch` | 400 | A resubmission has to be for the same amount as the original declined charge. Re-submit at the original amount, or send the request as an ordinary cardholder-initiated or merchant-initiated charge. |
| `resubmission_limit_exceeded` | 409 | The original declined charge has already used its network resubmission allowance, for example 15 attempts within 30 days on Visa. Re-authorize with the cardholder (CIT), or under a stored credential consent (general MIT). |

### 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:SendGridRecipientMissing` | 400 | The message was not sent because it had no To address. Add at least one To recipient, 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:SendGridWebhookRegistrationTimedOut` | 429 | SendGrid did not respond within {budgetSeconds} seconds, so the webhook registration did not finish. Registration is safe to repeat; try again in a few minutes. |
| `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_BUDGET_EXCEEDED` | 429 | The caller's plan has no budget left for this operation. |
| `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}. |

### Vault Proxy

| Code | Status | Message |
| --- | --- | --- |
| `VaultProxy:AmbiguousProperty` | 400 | A property in the request body appears more than once. |
| `VaultProxy:BodyTooLarge` | 413 | The request body is larger than the vault route allows. |
| `VaultProxy:CaptureRouteNotFound` | 404 | The vault route was not found. |
| `VaultProxy:CvvAliasStoreUnavailable` | 503 | The card could not be captured. Try again. |
| `VaultProxy:CvvWithoutCardNumber` | 400 | The request carries a CVV but no card number. |
| `VaultProxy:InvalidCardNumber` | 400 | The card number is not valid. |
| `VaultProxy:InvalidCvv` | 400 | The CVV is not valid. |
| `VaultProxy:InvalidUpstreamPath` | 400 | The request path is not valid. |
| `VaultProxy:MalformedBody` | 400 | The request body is not valid JSON. |
| `VaultProxy:MerchantIdIsImmutable` | 409 | A vault route's merchant cannot be changed. |
| `VaultProxy:OriginNotAllowed` | 403 | This origin is not allowed to post to the vault route. |
| `VaultProxy:OriginRequired` | 403 | The request must carry an Origin header. |
| `VaultProxy:RouteNotFound` | 404 | The vault route was not found. |
| `VaultProxy:UnsupportedMediaType` | 415 | The vault route accepts JSON request bodies only. |
| `VaultProxy:UnvaultedCardNumber` | 400 | The request body carries a card number in a field the vault route does not protect. |
| `VaultProxy:UpstreamTimeout` | 504 | The merchant's server did not answer in time. |
| `VaultProxy:UpstreamUnavailable` | 502 | The merchant's server could not be reached. |
| `VaultProxy:VaultUnavailable` | 503 | The card could not be captured. Try again. |

## See also

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