Reversal — contactless
POST /transaction/reversal/contactless
Structured (typed-field) reversal on the contactless channel. Part of the operation × channel capability matrix (issue #1196) — only the registered combinations exist; every other combination is a plain 404.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”Request body for the structured financial and PIN transaction routes (POST /transaction/{operation}/{channel}, POST /transaction/account-verification, and POST /transaction/pin/{check,change,unblock}/...). The operation and channel are carried by the route itself, not the body.
object
Target network. Only visa (the default when omitted) is supported; a mastercard request returns 501 Not Implemented. A request for a network whose product the organization is not entitled to (including an expired trial) returns 403 Forbidden.
Common acceptance context shared by every structured transaction operation. Each field, when omitted, is filled from the tenant’s merchant/terminal/currency catalog.
object
ISO 4217 alphabetic or numeric transaction currency (DE 49). Defaults to the resolved merchant’s currency.
Card acceptor identification code (DE 42). Defaults to the tenant’s configured merchant.
Card acceptor terminal identification (DE 41). Defaults to the resolved merchant’s terminal.
Required for sale, refund, cash-withdrawal, reversal, void, and non-balance-inquiry advice; ignored for balance-inquiry, account-verification (both forced to amount 0), and the PIN operations.
object
Transaction amount in minor units (DE 4).
Example
1000Transaction fee in minor units (DE 28).
Card credential. Required by every route this body serves. card.pin carries the PIN to verify (pin-check) or the current PIN (pin-change, pin-unblock). SMP binds card as this one shape for every channel, including POS/contactless/magstripe and ATM — there is no channel-specific card variant with track2, emv_data, or an encrypted PIN block on the public API today; only pan, expiry, cvv2, cardholder_name, and pin reach SVE.
object
Primary account number (DE 2).
Example
4111111111111111Card expiry as MMYY (DE 14).
Example
1229Card verification value 2.
Cardholder name, for the card acceptor record.
Clear PIN digits — never an encrypted PIN block. Only consumed by the pin-check/pin-change/pin-unblock routes, where it carries the PIN the cardholder is verifying or changing from; ignored by every other operation.
Reference to a prior transaction, supplied on operations that act on an earlier message (reversal, advice, void; refund ignores it). Rendered into DE 90 / DE 37 / DE 38.
object
Original message type indicator, e.g. 0100.
Original system trace audit number (DE 11).
Original transmission date/time (DE 7), in MMDDhhmmss form.
Original retrieval reference number (DE 37).
Original authorization identification response / approval code (DE 38).
Advice sub-type for the advice route (one of sale, cash-withdrawal, balance-inquiry, refund). Ignored for every other route.
The new clear PIN digits. Required for POST /transaction/pin/change; ignored by every other route.
Trace correlation id for logging only. Prefer the X-Request-Id HTTP header.
Examples
USD 10.00 structured operation
{ "amount": { "amount": 1000 }, "card": { "pan": "4111111111111111", "expiry": "1229", "cvv2": "123" }}Responses
Section titled “ Responses ”The operation completed a full round trip. A declined transaction (DE 39 in parsed_response ≠ "00") is a valid business outcome and is still returned at 200.
Response body for the structured financial and PIN transaction routes on the success (200) path. A declined transaction (DE 39 ≠ "00") is still 200 — the outcome is in parsed_response, not surfaced as an HTTP error.
object
SMP-generated req_-prefixed correlation id for tracing and log correlation.
Example
req_abc123The outbound ISO 8583 message SVE built and SMP transmitted to the fintech backend, as uppercase hexadecimal.
A rendered view of a built ISO 8583 message: its MTI plus a set-field map keyed as "NN (Field Name)" (2 digits for DE ≤ 99, 3 digits above), ordered ascending by data-element number. Binary data elements are rendered as uppercase hex.
object
Four-digit message type indicator, e.g. 0100.
Example
0200Set data elements, keyed as "NN (Field Name)" and ordered ascending by data-element number.
object
Finalized ISO 8583 response message from the fintech backend, as uppercase hexadecimal.
A rendered view of a built ISO 8583 message: its MTI plus a set-field map keyed as "NN (Field Name)" (2 digits for DE ≤ 99, 3 digits above), ordered ascending by data-element number. Binary data elements are rendered as uppercase hex.
object
Four-digit message type indicator, e.g. 0100.
Example
0200Set data elements, keyed as "NN (Field Name)" and ordered ascending by data-element number.
object
Examples
Approved operation
{ "request_id": "req_abc123", "sent": "0200B23A80010000000000004111111111111111000000001000", "parsed_request": { "mti": "0200", "fields": { "02 (Primary Account Number)": "4111111111111111", "03 (Processing Code)": "000000", "04 (Amount, Transaction)": "000000001000" } }, "last_response_hex": "0210B23A80010000000000004111111111111111000000001000C1B2C300", "parsed_response": { "mti": "0210", "fields": { "02 (Primary Account Number)": "4111111111111111", "38 (Authorization Identification Response)": "C1B2C3", "39 (Response Code)": "00" } }}Malformed request — the body is not valid JSON or does not match the schema, or card is missing or has an empty pan. Unsupported network values return 501, not 400. Engine-side input validation failures (for example a missing amount or PIN) currently surface as 502 engine errors.
RFC 7807 application/problem+json error body, as emitted by ASP.NET Core Results.Problem.
object
Examples
{ "type": "about:blank", "title": "Malformed structured transaction request", "status": 400, "detail": "The request must include a 'card' with a non-empty 'pan'."}Authentication failed — missing, malformed, invalid, revoked, or suspended API key, or a JWT bearer token was sent.
RFC 7807 application/problem+json error body, as emitted by ASP.NET Core Results.Problem.
object
Examples
{ "type": "about:blank", "title": "Invalid API key", "status": 401, "detail": "The supplied API key is missing, malformed, invalid, revoked, or suspended."}{ "type": "about:blank", "title": "JWT authentication not supported", "status": 401, "detail": "This endpoint accepts CPS API keys only. JWT bearer support is pending CPS org-id resolution."}Product not entitled — the organization has no active trial or subscription for the product that serves the requested network. Checked after the 501 network check and again per frame at delivery.
RFC 7807 application/problem+json error body, as emitted by ASP.NET Core Results.Problem.
object
Examples
{ "type": "product_not_entitled", "title": "Product not entitled", "status": 403, "detail": "The organization is not entitled to the 'visa' product. Check the product entitlements in the dashboard."}This operation × channel combination is not in the capability matrix (e.g. sale/atm, cash-withdrawal/ecom) and was never registered as a route — a plain routing 404 with no body, not a validation error.
Rate limit exceeded — either the API key’s configured requests-per-second limit, or the per-organization requests-per-second cap on a product trial (trial_rate_limited). A Retry-After header is returned.
RFC 7807 application/problem+json error body, as emitted by ASP.NET Core Results.Problem.
object
Examples
{ "type": "about:blank", "title": "Rate limit exceeded", "status": 429, "detail": "The API key has exceeded its configured requests-per-second limit."}{ "type": "trial_rate_limited", "title": "Rate limit exceeded", "status": 429, "detail": "The organization's trial of the 'visa' product has exceeded its requests-per-second limit."}Headers
Section titled “Headers ”Seconds to wait before retrying.
Unsupported network — only visa is supported today; a mastercard request (or any other value) fails here until SME structured support lands.
RFC 7807 application/problem+json error body, as emitted by ASP.NET Core Results.Problem.
object
Examples
{ "type": "about:blank", "title": "Unsupported network", "status": 501, "detail": "'mastercard' is not yet supported on the structured transaction routes. Only 'visa' is supported today; Mastercard/SME support is tracked as a follow-up issue."}Delivery error — no active mTLS connection for the org, or a write/read failure (a delivery timeout included) on the outbound leg to your fintech backend; also an engine HTTP error or an undecodable engine response. Engine-side input validation failures (for example a missing amount or PIN) also surface here as Engine error, not 400.
RFC 7807 application/problem+json error body, as emitted by ASP.NET Core Results.Problem.
object
Examples
{ "type": "about:blank", "title": "Delivery error", "status": 502, "detail": "No active mTLS connection for the org."}{ "type": "about:blank", "title": "Engine error", "status": 502, "detail": "The network engine returned an HTTP error."}API-key validation with CPS is unavailable, so the tenant could not be resolved; or the product entitlement check at delivery could not be confirmed with CPS. Retry the request.
RFC 7807 application/problem+json error body, as emitted by ASP.NET Core Results.Problem.
object
Examples
{ "type": "about:blank", "title": "API key validation unavailable", "status": 503, "detail": "SMP could not validate the supplied API key with CPS."}{ "type": "entitlement_check_unavailable", "title": "Entitlement check unavailable", "status": 503, "detail": "SMP could not confirm product entitlement with CPS. Retry the request."}The Visa engine call itself timed out, hit an open circuit breaker, or failed at the transport level.
RFC 7807 application/problem+json error body, as emitted by ASP.NET Core Results.Problem.
object
Examples
{ "type": "about:blank", "title": "Engine timeout", "status": 504, "detail": "The network engine call timed out."}