Execute a follow-up operation on an existing transaction.
POST
/api/transactions/by-merchant/{merchantId}/{transactionId}/operations
deprecated
No permission required.
A client disconnect does not cancel an operation once the request has been received. The caller needs the permission for the requested operation type: `Transactions.Operations.Void` for Void and Reversal, `Transactions.Operations.Refund` for Refund, `Transactions.Operations.Capture` for Capture, `Transactions.Operations.Adjustment` for OfflineAdjustment and IncrementalAuthorization, `Transactions.Payments.Create` for Repeat and Retry, and `Transactions.PartialApproval.Acknowledge` for AcceptPartialApproval and SplitTender. A Refund, Repeat or Retry creates a new transaction, which also requires `Transactions.Payments.Create`. A caller without the permission receives 403 before the transaction is read, so the response does not reveal whether the transaction exists.
Signed in, you can send this request to your own sandbox merchant from the console and read the answer. Sign in to try it.
Example request
Every block below sends the same request. Replace {{BASE_URL}} with the address of the API you are calling and {{API_KEY}} with your own key.
The request body is a ExecuteTransactionOperationInput. See the Request body section below for its fields.
Parameters
| Name | In | Type | Description |
|---|---|---|---|
merchantId
required |
path | string (uuid) | The merchant that owns the parent transaction. Required so the parent transaction is read directly rather than searched for. |
transactionId
required |
path | string (uuid) | The transaction to operate on. |
suppressNulls
required |
query | boolean | If true, omit properties with null values. |
Request body
application/json
, required
| Field | Type | Description |
|---|---|---|
operationType
required |
all of TransactionOperationType | The type of operation to execute (e.g., Refund, Reversal, Void, Capture). |
amount
required |
number (double) | Optional amount for partial operations (refund, reversal). What an omitted value means differs by operation, so it is stated per operation rather than as one rule. Conditional: When Amount is not null. Must be > 0. nullable |
reason
required |
string | Optional reason or note for the operation. nullable |
idempotencyKey
required |
string | Optional caller-supplied idempotency key used to deduplicate a retried operation (reversal, void, capture, refund, repeat, retry) after a network timeout. The key is scoped to a single merchant + transaction + operation: submitting the same operation twice with the same key executes once and the second call returns the original operation's outcome (for a spawning operation, the same child transaction id) instead of re-applying it. Conditional: When IdempotencyKey is not empty. Max length: 128. nullable |
offlineAdjustment
required |
all of OfflineAdjustmentFields | Structured field bundle for the `OfflineAdjustment` operation. Required when `operationType` is `OfflineAdjustment`; rejected by the input validator for any other operation type so the wrong shape cannot ride along quietly. Required: When OperationType == OfflineAdjustment. Conditional: When OfflineAdjustment is not null. Conditional: When OperationType != OfflineAdjustment. |
incrementalAuthorization
required |
all of IncrementalAuthorizationFields | Structured field bundle for the `IncrementalAuthorization` operation. Required when `operationType` is `IncrementalAuthorization`; rejected by the input validator for any other operation type so the wrong shape cannot ride along quietly. Required: When OperationType == IncrementalAuthorization. Conditional: When IncrementalAuthorization is not null. Conditional: When OperationType != IncrementalAuthorization. |
initiationType
required |
all of InitiationType | Classification gate for `Repeat`. The caller must declare whether the new charge is being initiated by the cardholder (CIT: cardholder is present and authorizing this specific re-run) or by the merchant (MIT: under prior consent or as a network resubmission of a declined attempt). Required: When OperationType == Repeat. Conditional: When InitiationType is not null. nullable |
mitReason
required |
all of MITReasonCode | MIT reason code (Recurring, UnscheduledCOF, Resubmission, etc.) accompanying `initiationType` when it is `MerchantInitiated`. Required: When OperationType == Repeat and InitiationType == MerchantInitiated. Conditional: When MITReason is not null. nullable |
storedCredentialConsentId
required |
string (uuid) | Identifier of the `StoredCredentialConsent` record that authorizes this MIT. Required for non-resubmission MITs (Recurring, UnscheduledCOF, NoShow, DelayedCharge, Installment, Reauthorization, IncrementalAuth). Ignored for `Resubmission`: resubmissions are authorized by card-network resubmission rules rather than by a consent record. nullable |
This request body has no documented fields.
Responses
200 OK
Body: TransactionOperationResultDto
Each item has these fields.
| Field | Type | Description |
|---|---|---|
success
required |
boolean | Whether the operation was successfully submitted to the orchestrator. |
message
required |
string | Human-readable message describing the result. nullable |
transactionId
required |
string (uuid) | The original transaction ID the operation was performed on. |
operationType
required |
all of TransactionOperationType | The operation type that was executed. |
errorCode
required |
string | Machine-readable error code for programmatic handling. nullable |
timedOut
required |
boolean | True when the operation was submitted to the orchestrator but completion timed out. The operation may still be processing: the user should check the transaction status. |
newTransactionId
required |
string (uuid) | The ID of a newly created transaction, set when the operation creates a new transaction (e.g., Repeat). Null for operations that modify the existing transaction in-place. nullable |
This response has no documented body fields.
403 Forbidden
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
401 Unauthorized
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
400 Bad Request
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
404 Not Found
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
501 Not Implemented
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
500 Internal Server Error
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
default The request failed. The body carries the standard error envelope: a machine-readable `error.code`, a human-readable `error.message`, and `error.validationErrors` when the failure was a validation rejection. See the error-code reference in this document's description for the values `error.code` can take.
Body: RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|---|---|
error
required |
RemoteServiceErrorInfo |
This response has no documented body fields.
429 The request was refused because a rate limit was exceeded, or because something a later retry can clear stopped it. A rate limit refusal carries an `application/problem+json` body: wait at least the interval `Retry-After` names before retrying, then back off. Limits are tuned per deployment, so read the allowance from the response headers rather than assuming a fixed ceiling. Any other refusal carries the standard error envelope as `application/json`, and its `error.code` names the cause. A sandbox request whose merchant has spent the plan's transaction allowance is refused with a different `application/json` body: `code` is `USAGE_BUDGET_EXCEEDED`, and `limit` and `used` report the allowance. `Retry-After` is sent only when the allowance resets. An allowance that never resets sends none, and retrying won't help.
Body: one of UsageBudgetExceededResponse, RemoteServiceErrorResponse
Each item has these fields.
| Field | Type | Description |
|---|
This response has no documented body fields.
Errors
A failed request returns the platform error envelope. The
error reference lists every value
error.code can carry and shows the four response shapes.